Домашняя метеостанция на GY-BMP280-3.3 и Ds18b20

Я хочу собрать своими руками прибор, который будет измерять атмосферное давление и температуру. Датчик температуры должен быть выносным и герметичным, так как должен измерять температуру на некотором расстоянии от прибора. Хотелось бы иметь такой переносной прибор с рабочим диапазоном от -30°С до 50°С. Но для это надо, чтобы все компоненты были способны работать в этом диапазоне температур. Компоненты, способные работать в расширенном температурном диапазоне, стоят дороже, да и купить их сложнее.
Исполнить мою мечту в реальность мне поможет плата GY-BMP280-3.3, о которой я рассказал в статье «Плата GY-BMP280-3.3 для измерения барометрического давления и температуры».

Из практики известно, что при сборке и настройке электронного изделия пред его изготовлением нужно проверить исправность всех материалов и компонентов каждого отдельно. Иначе можно потом запутаться, и в итоге электронное изделие не будет работать, а найти причину неисправности будет очень сложно.

Приступим.

Первый этап. Устанавливаем на компьютер бесплатную программную оболочку Arduino IDE для написания программ (скетчей), их компиляции и последующей записи в микроконтроллер Mega328P, установленный на плату Arduino Uno. Рекомендую вам скачать оболочку Arduino IDE версию ARDUINO 1.6.5. Почему? Изначально проект ARDUINO был один, теперь разработчики разошлись и продолжают развивать систему ARDUINO, но каждый по-своему, с небольшими нюансами. Я использовал версию ARDUINO 1.6.5. Она должна быть установлена и проверена на совместную работу с платой Arduino Uno на простейших примерах.

Второй этап. Проверяем плату GY-BMP280-3.3 для измерения барометрического давления и температуры. Берем 4 проводка, соединяем ими GY-BMP280-3.3 и Arduino Uno, как изображено на фотографии и схеме. Кривые тонкие разноцветные линии – это проводники.

Приступим к проверке платы GY-BMP280-3.3. Для этого нужно установить библиотеку в Arduino IDE, написанную программистами, работающими на сайте iarduino.ru. Как правило, после установки библиотеки в Arduino IDE, появляются примеры (образцы) кода. Незначительно изменив образец кода, мы сможем компилировать его в данные, понятные микроконтроллеру, а потом отправить их в память микроконтроллера. Найти пример (образец) вы сможете, обратив внимание на две фотографии экрана, расположенные ниже.

После записи данных в микроконтроллер платы Arduino Uno он сразу начинает выполнять программу (код) и отсылать данные по USB кабелю на компьютер, к которому подключена плата Arduino Uno. А результат измерений платы GY-BMP280-3.3 мы сможем увидеть в окне Arduino IDE, называемом «монитором последовательного порта».

Результат измерений платы GY-BMP280-3.3 мы сможем увидеть в стандартной программе Windows Hyper Terminal, предварительно закрыв оболочку Arduino Uno и настроив сеанс в программе Hyper Terminal. То есть мы можем получать результаты работы платы GY-BMP280-3.3, подключив Arduino Uno к любому компьютеру USB кабелем, на котором установлен драйвер для платы Arduino Uno. Библиотек для работы с GY-BMP280-3.3 несколько. У меня все заработало с библиотекой с сайта. Файл, который вы скачаете с этого сайта, будет иметь такой вид: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Его нужно переименовать в вид: iarduino_Pressure_BMP.zip. Теперь нам надо установить библиотеку iarduino_Pressure_BMP в оболочку Arduino IDE.

Запускаем Arduino IDE, заходим в меню Эскиз/Include Librari/Add.ZIP Library… далее выбираем файл iarduino_Pressure_BMP.zip и нажимаем кнопку Open. Так же надо установить библиотеки: iarduino.ru/file/198.html, iarduino.ru/file/49.html . После установки библиотек перегружаем оболочку Arduino IDE, то есть закрываем её и запускаем заново. Затем выбираем в меню Файл/Образцы/iarduino Pressure BMP (датчики давления)/example.

Видим в окне код.

Код надо будет немного изменить.

В пятой строке удалить два слеша «//» и в одиннадцатой строке добавить (0x76) или (0x77). (0x76) — это адрес платы барометра. У моей платы GY-BMP280-3.3, подключенной к шине I2C, адрес оказался равным (0x76). Как узнать номер устройства, подключенного к шине I2C? Ответ на этот вопрос вы получите, прочитав статью полностью.

Итак, мы исправили код в окне, теперь запускаем проверку и компиляцию кода в меню Эскиз/ Проверить/Скомпилировать. Если проверка и компиляция кода пройдет успешно, то в меню Эскиз/Вгрузить запускаем запись программы в Arduino Uno.

Если загрузка пройдет удачно, то, открыв монитор последовательного порта в меню: Инструменты/ Монитор последовательного порта, мы увидим данные, отправляемые платой GY-BMP280-3.3.

На следующем снимке экрана результат работы платы GY-BMP280-3.3 на компьютере, на котором не установлена оболочка Arduino IDE. Данные получает программа PuTTY.

В это же время был сфотографирован лабораторный барометр-анероид, который находился рядом с платой GY-BMP280-3.3. Сравнив показания приборов, вы сами можете сделать выводы о точности работы платы GY-BMP280-3.3. Барометр-анероид аттестован государственной лабораторией.

Третий этап. Проверка LCD дисплея с интерфейсным модулем I2C. Находим LDC дисплей с интерфейсным модулем, который подключается по шине I2C к Arduino UNO.

Проверяем его работу на примерах из оболочки Arduino IDE. Но перед этим определяем адрес интерфейсного модуля. У моего интерфейсного модуля адрес — 0x3F. Этот адрес я вставил в строчку скетча: LiquidCrystal_I2C lcd(0x3F,16,2);
Я определил этот адрес с помощью скетча «сканера адреса устройств I2C», описанного в статье.
Я запустил оболочку Arduino IDE, из статьи скопировал программный код и вставил его окно Arduino IDE.

Запустил компиляцию, потом записал код в плату Arduino UNO, к которой были подключены плата GY-BMP280-3.3 и LDC дисплей с интерфейсным модулем I2C. Затем в мониторе последовательного порта получил следующий результат. У моего интерфейсного модуля адрес — 0x3F.

Четвертый этап. Проверка датчика температуры DS18b20. Подключаем его по следующей схеме.

Библиотека OneWire Arduino Library для работы с датчиком температуры DS18b20 у нас уже установлена.

Открываем образец DS18x20_Temperature, компилируем, загружаем, смотрим результат измерения в мониторе последовательного порта. Если все работает, приступаем к следующему этапу.

Пятый этап. Сборка домашней метеостанции на GY-BMP280-3.3 и Ds18b20.
Собираем устройство по схеме:

Код для устройства я получил, объединив все примеры в одно и настроив вывод на экран дисплея LDC. Вот что у меня получилось:

// Раскомментируйте для программной реализации шины I2C: //
// #define pin_SW_SDA 3 //Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C.
// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C.
// Раскомментируйте для совместимости с большинством плат: //
#include
#include // Библиотека iarduino будет использовать методы и функции библиотеки Wire.
#include // Библиотека для работы LDC типа 1602 по шине I2C
// Ссылки для ознакомления: //
// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/
// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/trema-modul-pressure-meter
//
#include // Подключаем библиотеку iarduino_Pressure_BMP для работы с BMP180 или BMP280.
iarduino_Pressure_BMP sensor(0x76); // Объявляем объект sensor для работы с датчиком давления, используя функции и методы библиотеки iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd(0x3F,16,2);
OneWire ds(10);
void setup(){
lcd.init();
lcd.backlight();
Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
delay(1000); // Ждём завершения переходных процессов при подаче питания
sensor.begin(73); // Инициируем работу с датчиком. Текущая высота будет принята за 73 м.- высота города Бузулука над уровнем моря
} //
void loop (){
// Считываем данные и выводим: температуру в °С, давление в мм. рт. ст., изменение высоты относительно указанной в функции begin(по умолчанию 0 метров).
lcd.setCursor(0,0); // определяем точку вывода "P = " на LDC
lcd.print("P = ");
lcd.print(sensor.pressure/1000,3); // делим значение Р выданное BMP280 на 1000 и задаём вывод 3 знаков после запятой
lcd.setCursor(12,0); // определяем точку вывода "kPa" на LDC
lcd.print("kPa");
lcd.setCursor(0,1);
lcd.print("T=");
lcd.print(sensor.temperature,1); // задаём вывод 1 знака после запятой
lcd.setCursor(6,1);
// lcd.print("C");
// lcd.setCursor(9,1);
// lcd.print("H= ");
// lcd.print(sensor.altitude,1);
if(sensor.read(1)) {Serial.println((String)"CEHCOP BMP" + sensor.type + ": t P = " + sensor.pressure + "tMM.PT.CT, t T = " + sensor.temperature + " *C, tt B = "+sensor.altitude+" M.");}
else {Serial.println("HET OTBETA OT CEHCOPA");}
// Считываем данные и выводим: температуру в °С и давление в Па, давление в мм. рт. ст., изменение высоты относительно указанной в функции begin(по умолчанию 0 метров).
if(sensor.read(2)) {Serial.println((String)"CEHCOP BMP" + sensor.type + ": t P = " + sensor.pressure + "tPa, tt T = " + sensor.temperature + " *C, tt B = "+sensor.altitude+" M.");}
else {Serial.println("HET OTBETA OT CEHCOPA");}
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end

delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 — data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
lcd.setCursor(8,1); // определяем точку вывода "Tds=" на LDC
lcd.print("Tds=");
lcd.print(celsius,1);
delay(3000);
}

Вот что у меня получилось:

Плата GY-BMP280-3.3 выдаёт давление в паскалях, что не очень удобно. Решить задачу, как заставить плату GY-BMP280-3.3 выдавать данные по давлению в килопаскалях, я не смог. Я решил эту задачу в строке вывода на дисплей LDC.

lcd.print(sensor.pressure/1000,3); // делим значение Р выданное BMP280 на 1000 и задаём вывод 3 знаков после запятой
Плата GY-BMP280-3.3 выдаёт также значения высоты над уровнем моря.

sensor.begin(73); // Инициируем работу с датчиком. Текущая высота будет принята за 73 м.- высота города Бузулука над уровнем моря
Если вы будете отдыхать на море и измените «sensor.begin(73);» на «sensor.begin(0);» в коде, а затем откомпилируете и запищите программу в домашнюю метеостанцию на GY-BMP280-3.3 и Ds18b20, и сделаете вывод высоты на LDC дисплей, то вы получите еще и высотомер.
// lcd.setCursor(9,1);
// lcd.print(«H= «);
// lcd.print(sensor.altitude,1); // Выводим значения высоты в метрах с одним знаком после запятой
Питание на схему подаётся в моём варианте по кабелю USB. Вы можете применить низковольтный повышающий импульсный преобразователь 5В/600 мА и ваша метеостанция станет портативной. Такого типа источник питания хорошо описан в статье.

Удачных компиляций!

Продам эту самоделку или изготовлю на заказ. Напишите мне или оставьте комментарий для обсуждения деталей.

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Источник: usamodelkina.ru