На датчике BME280 можно сделать очень простую, но достаточно информативную и точную погодную станцию. Этот датчик предназначен для использования в помещении, для измерения температуры воздуха на улице будет использовать простой но надежный цифровой датчик DS18B20. Датчик BME280 позволяет измерять сразу три параметра — температуру, влажность и давление.
Технические характеристики датчика BME280:
- Напряжение питания: 3.3 В – 5 В
- Рабочий ток: 1 мA
- Диапазон измерения давления: 300 гПа – 1100 гПа (точность ±1.0 гПа)
- Диапазон измерения температуры: -40 °C до +85 °C (точность ±0.5 °C)
- Диапазон измерения влажности: 20 % до 80 % (точность ±3 %)
- Интерфейс: I2C
- Обратите внимание на маркировку датчика BME280, существует две маркировки BME280-3.3V и BME280-5V, поэтому для питания используйте напряжение 3,3 В или 5 В соответственно.
BME280-3.3V |
BME280-5V (имеет на плате стабилизатор 3,3 В) |
Технические характеристики датчика DS18B20:
- Погрешность измерения не больше 0,5 С (для температур от -10С до +85С).
- Температурный диапазон измерений от -55 С до +125 С.
- Напряжение питания от 3,3 В до 5 В.
- Программируемое разрешение от 9 до 12 bit.
- Можно подключить сразу до 127 датчиков к одной линии связи.
- Информация передается по протоколу 1-Wire.
Так же следует отметить что датчик DS18B20 выпускается в виде модуля и в различных корпусах, корпусное исполнение не имеет внешних элементов в отличии от модуля, поэтому для нормальной работы датчика необходимо подать +5В на цифровой выход через резистор номиналом 4,7 кОм.
Информация выводится LCD дисплей 84×48 Nokia 5110.
(Подключение подсветки LCD дисплея 84×48 Nokia 5110 может отличаться от указанной на схеме, контакт LIGHT нужно соединить с контактом GND перемычкой)
Плата Arduino Nano и датчик BME280 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Цифровой выход датчика DS18B20 подключается к аналоговому входу Arduino A0.
#include <Wire.h> #include <SPI.h> #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip #include <DallasTemperature.h>// http://rcl-radio.ru/wp-content/uploads/2018/07/DallasTemperature.zip #include <Adafruit_Sensor.h> // https://github.com/adafruit/Adafruit_Sensor #include <Adafruit_BME280.h> // https://github.com/adafruit/Adafruit_BME280_Library #include <PCD8544.h> // http://rcl-radio.ru/wp-content/uploads/2019/01/pcd8544.zip PCD8544 lcd; // RST,CE,DC,DIN,CLK VCC,BL,GND (3,4,5,6,7 +3.3V,200 OM +3.3V, GND) Adafruit_BME280 bme; OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); static const byte gradus[] = { B00000110,B00001001,B00001001,B00000110,B00000000 };// градус float t1,t2,hpa,h; void setup() { Serial.begin(9600); if (!bme.begin(0x76)) {Serial.println("Could not find a valid BME280!"); while (1);} temp.begin(); temp.setResolution(10);//10 бит lcd.begin(84, 48); lcd.createChar(0, gradus); lcd.setContrast(60);// контрастность 0-127 } void loop() { temp.requestTemperatures();// опрос 18b20 t1 = temp.getTempCByIndex(0); // снятие показаний 18b20 t2 = bme.readTemperature(); // снятие показаний температуры с bme280 hpa = bme.readPressure() / 100.0F; h = bme.readHumidity(); lcd.setCursor(0,1);// вывод темп 18b20 на экран, первая строка lcd.print("Temp 1:");if(t1>=0){lcd.print(" ");}if(t1>0&&t1<10||t1<0&&t1>-10){lcd.print(" ");}lcd.print(t1,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,2); lcd.print("Temp 2:");if(t2>=0){lcd.print(" ");}if(t2>0&&t2<10||t2<0&&t2>-10){lcd.print(" ");}lcd.print(t2,1); lcd.write(0);lcd.print("C"); lcd.setCursor(0,3); lcd.print("P ");lcd.print(hpa*0.75,1);lcd.print(" mmHg"); // давление lcd.setCursor(0,4); lcd.print("H ");lcd.print(h,1);lcd.print(" %"); // влажность }
Как правило адрес датчика BME280 0x76, но он может отличаться, если возникнут сложности с запуском скетча, то необходимо определить верный адрес датчика при помощи I2C сканера — http://forum.rcl-radio.ru/viewtopic.php?id=64