Создание метеостанции на базе Arduino и датчика температуры и влажности DHT22
Для создания метеостанции нам необходимо:
- Arduino
- Датчик температуры и влажности DHT22 (существуют модификации DHT11 или DHT21, но они имеют меньшую точность измерений)
- Двухстрочный дисплей LCD 1602А
Две крайние ножки датчика это питание: крайняя левая +5V, крайняя правая - GND (земля). Ножка, отмеченная на схеме голубым проводом – сигнал (S), ее мы подключаем к порту на плате и обязательно подтягиваем резистором к питанию (10 кОм). Именно его в дальнейшем и пропишем в программе как пин, с которого мы будем считывать данные. Отлично, теперь датчик подключен, перейдем к программированию.
Итак, подключаем библиотеку 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("");
}
Итак, 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);
}