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

Домашняя метеостанция на 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.
Домашняя метеостанция на GY-BMP280-3.3 и Ds18b20

Проверяем его работу на примерах из оболочки 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, \t\t 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, \t\t T = "     + sensor.temperature + " *C, \t\t 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 мА и ваша метеостанция станет портативной. Такого типа источник питания хорошо описан в статье.

Удачных компиляций!
Продам эту самоделку или изготовлю на заказ. Напишите мне или оставьте комментарий для обсуждения деталей.
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Чтобы написать комментарий необходимо войти на сайт через соц. сети (или зарегистрироваться):
Обычная регистрация
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Добрый день, Гость!


Зарегистрируйтесь

А затем...

Добавьте самоделку

Или...

Добавьте тему

Онлайн чат

Опрос
Сколько по времени, чаще всего, Вы делаете самоделку?

Последние комментарии

Как говорила героиня известного фильма, может это и ужасно, но.... не стыдно!!! )))))...
Насчёт мощного реле или симистора - правильно. А насчёт ТТ - сомнительно. Во-первых, и это - главное, не всегда нужно одновременное включение, во-вторых, ТТ нужно правильно применять, обычный контакт...
"Газовая печь из пивной бочки для пиццы". Печь в этом предложении выступает, как подлежащее. Оно идет с определением "газовая", далее идут определения которые отвечают на вопросы...
1. Ни один из выпускаемых отечественной промышленностью микриков не подходит для этой самоделки по величине коммутируемого переменного тока на индуктивную нагрузку. 2. Чем давить на педаль при работе...
Вот почему и "вешаются" иностранцы от русского языка! ...))) Помните, как у покойного Задорнова? Муж-американец, с прекрасным знанием русского спрашивает у жены: - Дорогая, тебе сварить...
Все комментарии