Создание метеостанции на базе Arduino и датчика температуры и влажности DHT22

Для создания метеостанции нам необходимо:
  • Arduino
  • Датчик температуры и влажности DHT22 (существуют модификации DHT11 или DHT21, но они имеют меньшую точность измерений)
Минимальный набор готов, но если вам не хочется использовать свой компьютер как экран для вывода показаний с датчика, то понадобится еще и устройство вывода данных, идеальным решением для этого может стать:
  • Двухстрочный дисплей  LCD 1602А
Его подключение вы можете найти в предыдущей статье.

Начнем, пожалуй, с подключения нашего датчика температуры и влажности к Arduino.
Две крайние ножки датчика это питание: крайняя левая +5V, крайняя правая - GND (земля). Ножка, отмеченная на схеме голубым проводом – сигнал (S), ее мы подключаем к порту на плате и обязательно подтягиваем резистором к питанию (10 кОм). Именно его в дальнейшем и пропишем в программе как пин, с которого мы будем считывать данные.  Отлично, теперь датчик подключен, перейдем к программированию.

Так как DHT22 является конденсационным, да и в своем устройстве он не так уж прост, для работы будем использовать готовую библиотеку, с помощью которой работа с датчиками сводится к использованию готовых функций.
Итак, подключаем библиотеку DHT-master.
 //Подключаем библиотеки для работы с DHT22
 #include <DHT.h>
В директивах (параметрах, определяемых до начала основных блоков программы) описываем пин, к которому подключили сигнал (S), тип датчика и создаем класс, в котором соединим эти два параметра, для дальнейшей возможности обращения этим параметрам в программе.
 //До запуска основных блоков программы прописываем пин, которому подключили сигнал
 #define DHTPIN 7 

 //Описываем тип используемого датчика
 #define DHTTYPE DHT22 

 //Прописываем класс и обращение к библиотеке из программы
 DHT dht(DHTPIN, DHTTYPE);
В функции voidsetup() подключаем монитор порта (его мы будем использовать только для тестирования, потом выведем показания на дисплей) и инициализируем начало работы с датчиком температуры и влажности
 void setup()
{
//Подключаем монитор порта
Serial.begin(9600);
//И выводим сообщение о начале работы с датчиком
 Serial.println("DHT22 test!");
//Начинаем работу с датчиком
dht.begin();
}

В основном блоке программы (void loop()) ставим задержку между двумя последовательными измерениями и описываем считывание данных с датчика с помощью библиотечных функций
void loop() 
 {
 //Даем датчику время, чтобы "оклематься"
 delay(2000);
 //Считываем влажность
 float h = dht.readHumidity();
 //Считываем температуру (в Цельсиях) 
 float t = dht.readTemperature();

Проверяем, получаем ли мы данные и, если все идет по плану, то выводим эти показания в монитор порта.
 //Проверяем, приходят ли данные с датчика
 if (isnan(h) || isnan(t) ) {
 Serial.println("Failed to read from DHT sensor!");
 return;
 }
 //Выводим показания в монитор порта
 Serial.print("Humidity: ");
 Serial.print(h);
 Serial.print(" %\t");
 Serial.print("Temperature: ");
 Serial.print(t);
 Serial.print(" *C ");
 Serial.println("");
 }

Загружаем программу в плату и, чтобы увидеть показания, которые нам присылает DHT22, открываем монитор порта (Ctrl+Shift+M или Инструменты - Монитор порта) следим за изменениями температуры и влажности в комнате.

Итак, LevelUP: теперь давайте освоим вывод показаний на двухстрочный дисплей.
Для того, чтобы компьютер (ноутбук) не использовался исключительно как монитор для вывода показаний с датчика, мы будем использовать двухстрочный дисплей LCD 1602А, как устройство внешнего вывода.

Для этого обратимся к статье подключение двухстрочного дисплея.
Добавим пару элементов в программе, которые позволят нам использовать для вывода именно дисплей: подключим библиотеку для работы с дисплеем, и также, как и DHT22, создадим класс LiquidCrystal, в котором в качестве параметров указаны пины, используемые, как сигнальные для дисплея.
 //Подключаем библиотеки для работы с LCD и DHT22
 #include <LiquidCrystal.h>
 #include <DHT.h>
 #define DHTPIN 7 
 #define DHTTYPE DHT22 
 //Создаем классы для описания пинов дисплея и типа датчика температуры и влажности
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 DHT dht(DHTPIN, DHTTYPE);
Далее в теле функции void setup() инициализируем дисплей: lcd.begin(16, 2) т.е. определяем максимальное количество символов в строке и количество строк и выводим название нашего мини-проекта.
 void setup()
 {
 //Инициализируем дисплей: 2 строки по 16 символов
 lcd.begin(16, 2);
 //Выводим приветсвенное сообщение
 lcd.print("Meteorological_station");
 dht.begin();
 } 
А теперь приступим к основному блоку программы. В функции void loop() опишем считывание показания с датчика температуры и влажности и опишем его вывод на дисплей.
 void loop()
 {
 delay(2000);
 float h = dht.readHumidity(); //Считываем влажность
 float t = dht.readTemperature(); //Считываем температуру (в Цельсиях)
 //Устанавливаем курсор в 1 столбец 1й строки (выводим влажность)
 //Нумерация идёт с нуля, первым аргументом идёт номер столбца
 lcd.setCursor(0, 0);
 lcd.print("Humidity: ");
 lcd.print(h);
 lcd.print(" %\t");
 //Устанавливаем курсор 1 столбец 2й строки (выводим температуру)
 lcd.setCursor(0, 1);
 lcd.print("Temperature:");
 lcd.print(t);
 lcd.print(" *C ");
 //Возвращаем курсор на 1 столбец 1й строки 
 lcd.setCursor(0, 0);
 }


Собираем наше устройство, загружаем программу и наша портативная метеостанция готова к работе. Чтобы она работала постоянно, можно использовать питание не от USB, а от батарейки, разъем для которой есть на плате.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.