Для того, чтобы узнать температуру и влажность воздуха на улице, а также атмосферное давление, можно посмотреть прогноз в Интернете. Но, как известно, гидрометеоцентры частенько ошибается.

Получить фактические точные данные  можно с помощью домашней метеостанции. Домашнюю метеостанцию можно купить, а можно сделать самостоятельно. Рассмотрим создание домашней метеостанции на контроллере Arduino.

Проект метеостанции на Arduino

Наша домашняя метеостанция будет измерять температуру и влажность воздуха, атмосферное давление и выводить параметры на ЖК-дисплей. Список комплектующих, которые понадобятся для данного проекта:

  • контроллер Arduino;
  • плата прототипирования (без пайки)
  • модуль датчика BMP085 или BMP180
  • модуль с датчиком влажности DHT11
  • датчик температуры DS18B20
  • резистор 4,7 кОм;
  • дисплей Nokia 5110
  • провода и корпус

В качестве платы Arduino в принципе можно использовать любую из модельного ряда Arduino, но я рекомендую Arduino Uno или Arduino Duemilanove, так как в будущем собираюсь установить на нее Ethernet shield, чтобы сделать домашнюю метеостанцию устройством IoT («Интернета вещей»). Я буду использовать плату Arduino Duemilanove (рисунок 1).

Плата Arduino Duemilanove
Рис. 1. Плата Arduino Duemilanove

Теперь рассмотрим датчики, которые будем использовать в проекте.
Датчик давления BMP085 (рисунок 2) – высокоточный датчик атмосферного давления с низким энергопотреблением. используется для измерения атмосферного давления. Точность достигает минимального значения измерения давления 0.03hPa. Также выводит и данные о температуре. Напряжение питания 1.62V — 3.6V. Интерфейс подключения I2C. В продаже встречаются готовые платы  как с стабилизатором, так и без него. Датчик давления BMP085 мы будем использовать только для измерения атмосферного давления, для измерения температуры будем использовать более точный датчик DS18B20.

Модуль датчика BMP085
Рис.2. Модуль датчика BMP085

Датчик температуры DS18B20 (рисунок 3) –  это цифровой измеритель температуры  с  разрешением преобразования 9 — 12 разрядов и функцией тревожного сигнала контроля за температурой. Обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire. Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C. У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи.

Датчик температуры DS18B20
Рис. 3. Датчик температуры DS18B20

Датчик DHT11 (рисунок 4) не обладают высоким быстродействием и точностью, но зато имеет низкую стоимость. Датчик состоит из емкостного датчика влажности и термистора. Содержит аналого-цифровой преобразователь для преобразования аналоговых значений влажности и температуры в цифровые. Диапазон измерения влажности – 20-80%, частота опроса 1 раз в секунду. Мы будем использовать в проекте датчик DHT11 в виде готового модуля.

Модуль DHT11
Рис.4. Модуль DHT11

Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110 (рисунок 5). Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода +3.3 В платы Arduino.

Дисплей Nokia 5110
Рис. 5. Дисплей Nokia 5110

Собираем схему согласно рисунка 6.

Схема подключения к Arduino
Рис. 6. Схема подключения к Arduino

Для удобства я спаял датчики на плате прототипирования, сделал контакты для подключения проводов от дисплея и оформил это в виде шилда – припаял штырьки для подключения к контактам платы Arduino (рисунок 7).

Проект метеостанции на Arduino
Рис. 7. Как получилось у меня. Проект метеостанции на Arduino

Теперь приступим к написанию скетча. При написании скетча нам понадоьятся следующие 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).

Вывод данных в монитор последовательного порта
Рис.8. Вывод данных в монитор последовательного порта

Устанавливаем это все в корпус (рисунок 10).

Вывод данных с Arduino на дисплей Nokia 5110
Рис. 9. Вывод данных с Arduino на дисплей Nokia 5110

Устанавливаем это все в корпус (рисунок 10).

Собранная на Ардуино метеостанция в корпусе
Рис. 10. Собранная на Ардуино метеостанция в корпусе

Остается накрыть блок крышкой и перенести на улицу, при этом дисплей и блок питания оставить в комнате. Метеостанция будет готова к работе.

Метеостанцию можно усложнить, добавив датчик дождя и часть кода из предыдущего проекта «Датчик дождя на Arduino«.

В прикрепленных архивах рабочий скетч и необходимые библиотеки. Скачать файлы проекта.

Просмотров всего: 14 224, сегодня: 18

1 Комментарий

  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/

Напишите комментарий