Создание метеостанции на базе 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();
    }


В основном блоке программы (voidloop()) ставим задержку между двумя последовательными измерениями и описываем считывание данных с датчика с помощью библиотечных функций

   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, а от батарейки, разъем для которой есть на плате.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.