Как подключить датчик температуры и влажности dht11 к arduino uno?
Содержание:
Ардуино. Метеостанция на LCD 1602 и DHT11
Ардуино. Метеостанция с дисплеем LCD 1602 и DHT22
После сборки схемы, загрузите в микроконтроллер следующий скетч (здесь ссылка на скачивание архива со скетчем для метеостанции и необходимыми библиотеками). Информация с датчика DHT22 выводиться будет на монитор порта Arduino IDE и на жидкокристаллический дисплей 1602a, для отображения информации использован русский шрифт для LCD и символы (в скетче есть подробные комментарии).
Скетч для метеостанции с DHT11 на Ардуино
#include <Wire.h> // библиотека для протокола IIC #include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC LiquidCrystal_I2C lcd(0x27,20,2); // присваиваем имя lcd для дисплея #include "DHT.h" // подключаем библиотеку для DHT11 DHT dht(2, DHT11); // к какому порту подключаем датчик // создаем символ градуса и присваиваем имя "gradus" byte gradus = { 0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000 }; // создаем русскую букву "П" byte P = { 0b11111,0b10001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000 }; // создаем русскую букву "У" byte Y = { 0b10001,0b10001,0b10001,0b01111,0b00001,0b00001,0b01110,0b00000 }; // создаем русскую букву "Л" byte L = { 0b00111,0b01001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000 }; // создаем русскую букву "Ж" byte ZH = { 0b10101,0b10101,0b10101,0b01110,0b10101,0b10101,0b10101,0b00000 }; // создаем русскую букву "Ь" byte znak = { 0b10000,0b10000,0b10000,0b11110,0b10001,0b10001,0b11110,0b00000 }; void setup() { Serial.begin(9600); // запуск последовательного порта lcd.init(); // инициализация LCD дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(1, gradus); lcd.createChar(2, P); lcd.createChar(3, Y); lcd.createChar(4, L); lcd.createChar(5, ZH); lcd.createChar(6, znak); } void loop() { // если нужны точные значение, то используйте float, вместо byte byte h = dht.readHumidity(); // считываем значение температуры byte t = dht.readTemperature(); // считываем значение влажности Serial.print("Temperature: "); Serial.println(t); // отправляем значение температуры на монитор Serial.print("Humidity: "); Serial.println(h); // отправляем значение температуры на монитор Serial.println(" "); // пустая строка lcd.setCursor(0,0); // ставим курсор на 1 символ первой строки lcd.print("TEM"); // используем латинские буквы lcd.print(char(2)); // выводим русскую букву "П" lcd.print("EPAT"); // используем латинские буквы lcd.print(char(3)); // выводим русскую букву "У" lcd.print("PA: "); // используем латинские буквы lcd.print(t); // выводим значение температуры на LCD lcd.print(char(1)); // выводим знак градуса lcd.setCursor(2,1); // ставим курсор на 3 символ второй строки lcd.print("B"); // используем латинские буквы lcd.print(char(4)); // выводим русскую букву "Л" lcd.print("A"); // используем латинские буквы lcd.print(char(5)); // выводим русскую букву "Ж" lcd.print("HOCT"); // используем латинские буквы lcd.print(char(6)); // выводим русскую букву "Ь" lcd.print(": "); // используем латинские буквы lcd.print(h); // выводим значение влажности на LCD lcd.print("%"); // выводим знак процент delay(1000); }
Пояснения к коду:
- в скетче можно использовать до 8 русских букв и символов, при необходимости заменяйте буквы из кириллицы — латинскими буквами;
- скорость обновления данных замените на необходимое значение.
Масштабирование решения
Мы описали решение для одного растения. Но обычно требуется поливать несколько растений. Помимо очевидного решения — подключения к Arduino нескольких помп и датчиков влажности — существует более простое и дешёвое. Достаточно в трубке, которая идёт в комплекте с помпой проделать шилом дырочки на расстоянии около 30 см и воткнуть в эти дырочки куски стержней от обычных шариковых ручек. Выглядеть это будет так:
Горшки с цветами дома часто стоят в ряд на подоконнике. Вам достаточно просто положить трубку на горшки так, чтобы отверстия в ней приходились по одному на горшок. Теперь наше устройство может поливать сразу несколько горшков. Однако в таком случае принимать решение о необходимости полива можно только по одному горшку. Однако обычно горшки примерно одинаковые по размерам и, соответственно, сохнут с примерно равной скоростью. Можно так же комбинировать два решения, разделяя все горшки на группы примерно равных по размерам.
DHT11 против DHT22/AM2302
У нас есть две версии серии датчиков DHTxx. Они выглядят немного похоже и имеют одинаковую распиновку, но имеют разные характеристики. Вот подробности.
DHT22 является более дорогой версией, которая, очевидно, имеет лучшие характеристики. Диапазон измерения температуры составляет от -40°C до +80°C с точностью ±0,5 градуса, а диапазон температур DHT11 составляет от 0°C до 50°C с точностью ±2 градуса. Также датчик DHT22 имеет более широкий диапазон измерения влажности, от 0 до 100% с точностью 2-5%, в то время как диапазон измерения влажности DHT11 составляет от 20 до 80% с точностью 5%.
DHT11 | DHT22 | |
---|---|---|
Рабочее напряжение | от 3 до 5 В | от 3 до 5 В |
Максимальный рабочий ток | 2,5 мА макс | 2,5 мА макс |
Диапазон измерения влажности | 20-80% / 5% | 0-100% / 2-5% |
Диапазон измерения температуры | 0-50°C / ± 2°C | от -40 до 80°C / ± 0,5°C |
Частота выборки | 1 Гц (чтение каждую секунду) | 0,5 Гц (чтение каждые 2 секунды) |
Размер корпуса | 15,5 мм х 12 мм х 5,5 мм | 15,1 мм х 25 мм х 7,7 мм |
Преимущество | Ультра низкая стоимость | Более точный |
Хотя DHT22/AM2302 более точен и работает в большем диапазоне температур и влажности; есть три вещи, в которых DHT11 сильно превосходит DHT22. Он более дешевый, меньше по размеру и имеет более высокую частоту выборки. Частота выборки DHT11 составляет 1 Гц, то есть одно чтение каждую секунду, в то время как частота выборки DHT22 составляет 0,5 Гц, то есть одно чтение каждые две секунды.
Рабочее напряжение обоих датчиков составляет от 3 до 5 вольт, в то время как максимальный ток, используемый во время преобразования (при запросе данных), составляет 2,5 мА. И самое приятное, что датчики DHT11 и DHT22/AM2302 являются «взаимозаменяемыми», то есть, если вы создаете свой проект с одним датчиком, вы можете просто отключить его и использовать другой датчик. Ваш код, возможно, придется немного изменить, но, по крайней мере, схема не изменится!
Для получения более подробной информации обратитесь к техническим описаниям датчиков DHT11 и DHT22/AM2302.
Настройка ThingSpeak
Структурная схема работы нашего проекта представлена на следующем рисунке и она содержит 4 секции. Вначале с помощью датчика температуры и влажности DHT11 измеряются эти параметры атмосферы. Затем плата Arduino Uno считывает эти данные с DHT11 и преобразует их в нужную для нас форму, а затем она передает их на Wi-Fi модуль. После этого Wi-Fi модуль ESP8266 передает эти данные на сервер ThingSpeak. Затем сервис ThingSpeak анализирует эти данные и показывает их в удобной графической форме. Также дополнительно значения температуры и влажности показываются на экране ЖК дисплея.
Сервис ThingSpeak представляет собой достаточно удобную платформу для реализации различных проектов тематики интернета вещей (IoT) на Arduino. С помощью сервиса ThingSpeak мы можем просматривать (контролировать) наши данные через сеть Интернет из любой точки мира, также с его помощью мы можем управлять нашими системами (устройствами) через интернет. ThingSpeak собирает данные от датчиков, анализирует и визуализирует эти данные, а затем реагирует на различные события, которые могут привести к изменению этих данных. В этой части статьи мы рассмотрим как передавать данные на сервер ThingSpeak с использованием Wi-Fi модуля ESP8266.
1. Вначале нам необходимо создать аккаунт на ThingSpeak.com, заходим туда, жмем Sign In, а потом Get Started.
2. Затем идем в пункт меню ‘Channels’ (каналы) и создаем новый канал с помощью кнопки New Channel.
3. После этого увидите форму для создания нового канала, заполните там поля Name (имя) и Description (описание) по своему усмотрению. Затем напишите ‘Humidity’ (влажность) и ‘Temperature’ (температура) в Field 1 (поле 1) и Field 2 (поле 2) и поставьте галочки в чек-боксах напротив этих полей. Также поставьте галочку в чек-боксе ‘Make Public’ (сделать общедоступным) в форме ниже и сохраните канал (Save the Channel). Теперь новый канал для вас создан.
4. Теперь откройте вкладку ‘API keys’ чтобы записать свои ключи с этой вкладки. Нам будет нужен только ключ для записи (Write key). Скопируйте этот ключ в переменную char *api_key в тексте программы (приведен в конце статьи).
5. После этого кликните на ‘Data Import/Export’ и скопируйте Update Channel Feed GET Request URL, который будет примерно вида https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0.
6. Теперь необходимо открыть api.thingspeak.com используя функцию httpGet с postUrl в виде “update?api_key=SIWOYBX26OXQ1WMS&field1=0” и затем передать данные используя адрес обновления запроса.
Перед передачей данных необходимо отредактировать строку запроса или postUrl с полями данных температуры и влажности как показано в программном коде ниже. Здесь мы добавили в строку оба параметра, которые нам необходимо передать используя GET запрос к серверу, после этого необходимо использовать httpGet чтобы передать данные на сервер. Более подробно все эти процессы представлены в полном тексте программы, представленном в конце статьи.
В рассматриваемом проекте плата Arduino передает сигнал старта (после которого начинаются измерения) на датчик DHT, а в ответ датчик DHT передает Arduino сигнал, содержащий необходимые данные измерений. Плата Arduino собирает и извлекает эти данные в два приема: сначала извлекается влажность, а потом извлекается температура. Далее эти данные обрабатываются и передаются на ЖК дисплей 16×2 и сервер ThingSpeak. Сервис ThingSpeak отображает данные температуры и влажности в виде графиков, пример которых показан на следующем рисунке.
Программирование
Перед тем, как начать кодирование, требуется проверить наличие библиотеки, которая позволяет работать с датчиками температуры и влажности. Если таковой нет, рекомендуется сначала загрузить ее. Папка должна иметь наименование «DHT», корректное расположение — в корневой «Arduino IDE», в папке «libraries».
Устройства отличаются однопроводным протоколом, которому не нужна точная синхронизация.
Скетч для датчиков влажности и температуры DHT11 приведен далее:
Для начала включается установленная библиотека и прописывается пин вывода, куда включен датчик. Создаваемый объект помогает обеспечить доступ к функциям.
Setup () помогает инициализировать интерфейс — это необходимо, потому что показатели выводятся на экран последовательного порта.
Loop () подключает функцию read11(), принимающую вывод полученных данных. Если применяется 22-я версия, то функция соответствующим образом меняется — на read22().
Доступ к показателям обеспечивается параметрами:
- t = DHT.temperature;
- h = DHT.humidity.
Этот тип данных подходит для хранения чисел, имеющих десятичный разделитель.
Serial.print () позволяет вывести показания без переноса строчек, а Serial.println () учитывает перенос.
Когда скетч будет загружен и удалось подключить датчик влажности и температуры результаты проводимых измерений отображаются на дисплее порта. Именно там можно будет уточнить значения показателей.
Если отображение некорректное или на экране не отражаются изменения показателей, то следует проверить соединения и правильность подключения устройства, надежность контактов. Нарушения работы могут наблюдаться, если номер порта на плате не соответствует указанному в скетче.
Если система работает, требуется установить, насколько правильные значения выдает датчик температуры, для чего рекомендуется провести ряд тестов. Так, например, устройство можно переместить в холодное место или же согреть, наблюдая за тем, как меняются данные.
Возможно применение DHT11 для контроля показателей в инкубаторе. В такой ситуации датчик должен подключаться к LCD-дисплею, а не экрану последовательного порта. Подходят версии 16×2 символов. В код требуется внести соответствующие изменения — данные должны выводиться на LCD. Для этого требуется инициализировать дисплей через LCD.init () и обеспечить вывод данных через LCD.setCursor () и LCD.print ().
Используется также команда LCD.clear (), которая подготавливает экран для вывода новых показателей.
Динамическая загрузка данных датчика с помощью AJAX
Если ваша веб-страница много весит, то полное ее обновление не слишком практично. Лучше использовать асинхронный Javascript и Xml (AJAX), чтобы мы могли запрашивать данные с сервера асинхронно (в фоновом режиме), не обновляя страницу.
Для выполнения AJAX на веб-страницах в JavaScript обычно используется объект . Он тихо выполняет GET запрос на сервер и обновляет элемент на странице. AJAX – это не новая технология или другой язык, а просто существующие технологии, используемые по-новому. Кроме того, AJAX также позволяет:
- запрашивать данные с сервера после загрузки страницы;
- получать данные с сервера после загрузки страницы;
- отправлять данные на сервер в фоновом режиме.
Ниже приведен скрипт AJAX, который мы будем использовать. Поместите этот скрипт непосредственно перед закрывающим тегом .
Скрипт начинается с тега , так как AJAX-скрипт – это не что иное, как javascript, и поэтому нужно писать его в теге . Чтобы данная функция вызывалась повторно, мы будем использовать функцию javascript . Она принимает два параметра: функцию для выполнения и интервал времени (в миллисекундах), через который выполнять указанную функцию.
Сердцем этого скрипта является функция . Внутри этой функции создается объект . Данный объект используется для запроса данных с веб-сервера.
Функция вызывается каждый раз, когда изменяется . Свойство хранит состояние . Возможны следующие значения:
- 0: запрос не инициализирован;
- 1: установлено подключение к серверу;
- 2: запрос получен;
- 3: обработка запроса;
- 4: запрос завершен, и ответ готов.
Свойство содержит статус объекта . Возможны следующие значения:
- 200: OK;
- 403: запрещено;
- 404: страница не найдена.
Когда равен 4, а – 200, ответ готов. Теперь обновляется содержимое элемента с webpage (, содержащей значения температуры и влажности).
Затем HTTP запрос инициируется с помощью функций и .
Программа
Программа передатчика
Сперва рассмотрим программу передающей части:
Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора. Например, если температура составляет 20°C, а влажность – 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность – 78%, то передастся сообщение 978x, где «x» – случайный символ. Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.
Программа приемника
Интересный способ использования библиотеки LiquidCrystal – это создание пользовательских символов. С помощью я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 – включен, 0 – выключен).
В функции вы создаете его с помощью . принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это . Затем символ выводится на LCD с помощью функции .
Установка библиотеки датчиков DHT
Связь с датчиками DHT11, с датчиками DHT22/AM2302 – это сложная задача, поскольку для передачи данных они используют собственный однопроводный протокол. Этот протокол требует точной синхронизации. К счастью, нам не нужно беспокоиться об этом, потому что мы собираемся использовать библиотеку DHT от Adafruit, которая позаботится почти обо всем. Эта библиотека настолько мощна, что работает как на архитектуре Arduino, так и на архитектуре ESP.
Чтобы установить библиотеку, перейдите в меню Скетч (Sketch) → Подключить библиотеку (Include Library) → Управлять библиотеками… (Manage Libraries…). Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Рисунок 3 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE
Отфильтруйте результаты поиска, введя «DHT sensor». Должна остаться пара записей. Найдите DHT sensor library by Adafruit. Нажмите на эту запись, а затем выберите Установить (Install).
Рисунок 4 – Установка библиотеки Adafruit DHT
Библиотека датчиков DHT использует Adafruit Sensor support backend. Поэтому поищите в менеджере библиотек Adafruit Unified Sensor и установите его тоже (возможно, придется немного прокрутить).
Шаг 3. Код системы полива
Для этого шага вам нужно скачать прикрепленный ниже файл и открыть код в редакторе Arduino IDE. Наряду с кодом вы найдете комментарии, которые разъясняют каждую часть кода. Например: вы можете легко изменить текст на ЖК-дисплее на свой собственный текст. Также в разделе Библиотеки нужно скачать и установить библиотеку , это нужно сделать до начала работы с кодом.
#include <LiquidCrystal.h> // импорт LCD библиотеки LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // LCD соединения byte heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; // Специальный символ сердца для дисплея int sensorPin = A0; // датчик почвы int sensorValue = 0; int percentValue = 0; int TouchSensor = 13; // сенсорный датчик int pomp = 12; // 5В водяной насос void setup() { Serial.begin(9600); lcd.begin(16, 2); // LCD lcd.createChar(1, heart); // Специальный символ для дисплея pinMode(pomp, OUTPUT); pinMode(TouchSensor, INPUT); } void loop() { if(digitalRead(TouchSensor)==HIGH) //Считать сигнал сенсорного датчика { digitalWrite(pomp, HIGH); // если сенсорный датчик HIGH (ВЫСОКИЙ), то включить помпу Serial.println("Pomp ON"); // Это для проверки показаний элемента lcd.clear(); lcd.setCursor(4, 0); // курсор 1-я строка вверху слева lcd.print("WATERING"); //Печать на ЖК-дисплее при нажатии сенсорного датчика (растение получает воду) lcd.setCursor(4, 1); // курсор 2-я строка слева lcd.write(1); // Специальный значок сердца для ЖК-дисплея lcd.print("SERGE"); //Печать на ЖК-дисплее при нажатии сенсорного датчика (растение получает воду) lcd.write(1); // Специальный значок сердца для ЖК-дисплея delay(100); lcd.clear(); // После того, как сенсор запущен, очистить текст на ЖК-дисплее } else { digitalWrite(pomp, LOW); // если сенсорный датчик LOW (НИЗКИЙ, не нажат), помпа выключена Serial.println("Pomp OFF"); // Это для проверки показаний элемента sensorValue = analogRead(sensorPin); // прочитать датчик почвы Serial.print("\n\nAnalog Value: "); // Это для проверки показаний элемента Serial.print(sensorValue); // Это для проверки показаний элемента percentValue = map(sensorValue, 1023, 200, 0, 100); // Калибровка датчика почвы Serial.print("\nPercentValue: "); // Это для проверки показаний элемента Serial.print(percentValue); // выводить Значение влажности в % Serial.print("%"); //Это для проверки показаний элемента lcd.setCursor(0, 0); // курсор установлен на первой строке lcd.print("Serge's grond"); // Вывод на ЖК-дисплей LCD lcd.setCursor(0, 1); // курсор установлен на второй строке lcd.print("bevat:"); // Вывод на ЖК-дисплей LCD lcd.print(percentValue); // Вывод на ЖК-дисплей LCD значение влажности в % lcd.print("%"); // Вывод на ЖК-дисплей LCD lcd.print(" water"); // Вывод на ЖК-дисплей LCD delay(500); //задержка перед началом цикла lcd.clear(); // в конце цикла очистить текст на LCD } }