Для того, чтобы узнать температуру и влажность воздуха на улице, а также атмосферное давление, можно посмотреть прогноз в Интернете. Но, как известно, гидрометеоцентры частенько ошибается.
Получить фактические точные данные можно с помощью домашней метеостанции. Домашнюю метеостанцию можно купить, а можно сделать самостоятельно. Рассмотрим создание домашней метеостанции на контроллере Arduino.
Наша домашняя метеостанция будет измерять температуру и влажность воздуха, атмосферное давление и выводить параметры на ЖК-дисплей. Список комплектующих, которые понадобятся для данного проекта:
- контроллер Arduino;
- плата прототипирования (без пайки)
- модуль датчика BMP085 или BMP180
- модуль с датчиком влажности DHT11
- датчик температуры DS18B20
- резистор 4,7 кОм;
- дисплей Nokia 5110
- провода и корпус
В качестве платы Arduino в принципе можно использовать любую из модельного ряда Arduino, но я рекомендую Arduino Uno или Arduino Duemilanove, так как в будущем собираюсь установить на нее Ethernet shield, чтобы сделать домашнюю метеостанцию устройством IoT («Интернета вещей»). Я буду использовать плату Arduino Duemilanove (рисунок 1).
Теперь рассмотрим датчики, которые будем использовать в проекте.
Датчик давления BMP085 (рисунок 2) – высокоточный датчик атмосферного давления с низким энергопотреблением. используется для измерения атмосферного давления. Точность достигает минимального значения измерения давления 0.03hPa. Также выводит и данные о температуре. Напряжение питания 1.62V — 3.6V. Интерфейс подключения I2C. В продаже встречаются готовые платы как с стабилизатором, так и без него. Датчик давления BMP085 мы будем использовать только для измерения атмосферного давления, для измерения температуры будем использовать более точный датчик DS18B20.
Датчик температуры DS18B20 (рисунок 3) – это цифровой измеритель температуры с разрешением преобразования 9 — 12 разрядов и функцией тревожного сигнала контроля за температурой. Обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire. Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C. У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи.
Датчик DHT11 (рисунок 4) не обладают высоким быстродействием и точностью, но зато имеет низкую стоимость. Датчик состоит из емкостного датчика влажности и термистора. Содержит аналого-цифровой преобразователь для преобразования аналоговых значений влажности и температуры в цифровые. Диапазон измерения влажности – 20-80%, частота опроса 1 раз в секунду. Мы будем использовать в проекте датчик DHT11 в виде готового модуля.
Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110 (рисунок 5). Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода +3.3 В платы Arduino.
Собираем схему согласно рисунка 6.
Для удобства я спаял датчики на плате прототипирования, сделал контакты для подключения проводов от дисплея и оформил это в виде шилда – припаял штырьки для подключения к контактам платы Arduino (рисунок 7).
Теперь приступим к написанию скетча. При написании скетча нам понадоьятся следующие Arduino-библиотеки:
• OneWire – для работы с устройствами 1-Wire (датчик DS18B20);
• BMP085 и Wire – для работы с датчиком BMP085 (или BMP180);
• DHT – для работы с датчиком DHT11;
• Adafruit_GFX и Adafruit_PCD8544 – для работы с дисплеем Nokia 5110.
С периодичностью 5 секунд получаем данные с датчиков DS18B20, DHT11, BMP085 и выводим в монитор последовательного порта и на дисплей Nokia 5110. Процедура получения данных с датчика DS18B20 – get_temp() выполняет поиск устройств 1-Wire, подключенных к выводу Adruino D7 (у нас один датчик), и выдает его данные.
Запустим Arduino IDE. Создадим новый скетч и внесем в него содержимое листинга 1.
// подключение библиотек
#include <OneWire.h>
#include <Wire.h>
#include <BMP085.h>
#include «DHT.h»
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// тип DHT сенсора
#define DHTTYPE DHT11 // DHT 11
// создание экземпляров объектов
BMP085 dps = BMP085();
DHT dht(8, DHTTYPE); // dht11 на pin 8
OneWire ds(9); // ds18b20 на pin 9
// Nokia 5110
// pin 3 — Serial clock out (SCLK)
// pin 4 — Serial data out (DIN)
// pin 5 — Data/Command select (D/C)
// pin 6 — LCD chip select (CS)
// pin 7 — LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// переменные
int Temp1;
long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0;
void setup() {
// запуск последовательного порта
Serial.begin(9600);
Serial.println(«start»);
// запуск I2C
Wire.begin();
// запуск bmp
dps.init();
// инициализация дисплея
display.begin();
// установить контраст фона экрана
display.setContrast(60);
display.clearDisplay(); // очистить экран
display.setTextSize(1); // размер шрифта
display.setTextColor(BLACK); // цвет
// заставка
display.setCursor(15,15);
display.print(«Home Meteo»);
display.display();
delay(2000);
}
void loop () {
display.clearDisplay();
display.setCursor(15,5);
display.print(«Home Meteo»);
// ds18b20
int Temp=get_temp();
if(Temp==999) {
display.setCursor(15,15);
display.print(«t=»);
display.print(Temp1/16);
display.print(«.»);
display.print(((Temp1%16)*100)/16);
display.print(» C»);
}
else if(Temp==998) {
Serial.println(«Temp=ERROR»);
display.setCursor(15,15);
display.print(«t=ERROR»);
}
else {
Serial.print(«Temp=»);
Serial.print(Temp/16);
Serial.print(«.»);
Serial.print(((Temp%16)*100)/16);
Serial.println(» *C»);
display.setCursor(15,15);
display.print(«t=»);
display.print(Temp/16);
display.print(«.»);
display.print(((Temp%16)*100)/16);
display.print(» C»);
Temp1=Temp;
}
// dht11
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print(«humidity=»);
Serial.print(h);
Serial.println(» %»);
Serial.print(«temperatura=»);
Serial.print(t);
Serial.println(» *C»);
display.setCursor(15,25);
display.print(«h=»);
display.print(h);
display.print(» %»);
// bmp085
dps.getTemperature(&Temperature085);
dps.getPressure(&Pressure085);
dps.getAltitude(&Altitude085);
Serial.print(«pressure5=»);
Serial.print(Pressure085/133.3);
Serial.println(» mm Hg»);
Serial.print(«temp5=»);
Serial.print(Temperature085*0.1);
Serial.println(» *C»);
Serial.println();
display.setCursor(5,35);
display.print(«p=»);
display.print(Pressure085/133.3);
display.print(«mmHg»);
// обновить
display.display();
// пауза
delay(5000);
}
// получение температуры датчика ds18b20
int get_temp() {
byte i;
byte present = 0;
byte data[12];
byte addr[8];
int Temp;
if ( !ds.search(addr)) {
Serial.print(«No more addresses.n»);
ds.reset_search();
return 999;
}
Serial.print(«R=»); // печать уникального 1-wire идентификатора
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(» «);
}
Serial.println();
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print(«CRC is not valid!n»);
return 999;
}
if ( addr[0] != 0x28) {
Serial.print(«Device is not a DS18S20 family device.n»);
return 999;
}
ds.reset();
ds.select(addr);
// начинаем преобразование, используя ds.write(0x44,1)
ds.write(0x44,1);
// пауза с запасом (750 мс)
delay(1000);
ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
Temp=(data[1]<<8)+data[0];
Temp=Temp;
Serial.print(«intT=»);
Serial.println(Temp);
return Temp;
}
После загрузки скетча видим вывод получаемых данных в мониторе последовательного порта (рисунок 8) и на экран дисплея Nokia 5110 (рисунок 9).
Устанавливаем это все в корпус (рисунок 10).
Устанавливаем это все в корпус (рисунок 10).
Остается накрыть блок крышкой и перенести на улицу, при этом дисплей и блок питания оставить в комнате. Метеостанция будет готова к работе.
Метеостанцию можно усложнить, добавив датчик дождя и часть кода из предыдущего проекта «Датчик дождя на Arduino«.
В прикрепленных архивах рабочий скетч и необходимые библиотеки. Скачать файлы проекта.
1 Комментарий
Добрый день.
Полезная информация.
Спасибо.
Тоже заинтересовался этой темой.
Но с применением связки «ESP-12F WeMos D1 WiFi», «Arduino UNO» и внешнего приложения.
Рабочее название: «Метеостанция с охранной сигнализацией».
Результат, в целом, удовлетворительный (в рамках поставленных целей).
Если интересно, то можно посмотреть здесь:
https://roamer55.ru/my_projs/arduino_prj/my_ts/005_step/ex_grp_03/ex_03_001.pdf ;
https://roamer55.ru/main_programming/arduino/arduino_technosphere_000/arduino_technosphere_000_005/