Проектов метеостанций на плате ESP8266 (NodeMCU) и с датчиком DHT11 много, пусть будет еще один подумал я и решил поделиться одним из своих вариантов.
Состав проекта:
DHT 11 (три пина)
- Напряжение питания: 3,5 ~ 5,5В
- Потребляемый ток: не более 0,3мА
- Диапазон температур: 0 ~ 50°C
- Погрешность измерения температуры: ±2°C
- Диапазон влажности: 20 ~ 80%
- Погрешность измерения влажности: 5%
- Разрешение шкалы температуры и влажности: 1°C и 1%RH
- Время отклика: 1с
ESP8266 (NodeMCU)
- Микроконтроллер: ESP8266
- Тактовая частота: 80 МГц (до 160 МГц)
- Конвертер USB-UART: чип ft232
- Беспроводной интерфейс: Wi-Fi 802.11 b/g/n 2,4 ГГц
- Загрузчик: NodeMCU
- ОЗУ (RAM): 160 КБ, доступно до 50 КБ
- ПЗУ (ROM): 4 МБ
- Портов ввода-вывода: 11
- Рабочее напряжение: 3,3 В
- Входное напряжение: 5-12 В
- Потребляемый ток: до 220 мА
Инструкции по подключению NodeMCU и DHT11, настройка в IDE:
* На момент написания, последняя версия Arduino IDE 2.3.2
* Все изображения кликабельны (можно увеличить)
Для начала работы с платами на основе esp8266 необходимо установить ядро и драйвер. Для этого переходим Файл/Настройки/Дополнительные ссылки для менеджера плат. В имеющееся поле вставляем ссылку:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
Далее: «Инструменты/Плата/Менеджер плат» находим в поиске esp8266 и ставим.
В общем списке плат появится семейство плат на базе esp8266.
На большинстве продающихся плат стоит USB конвертер CH340, как на большинстве китайских Arduino платах. Если вы ранее не устанавливали драйвер, скачайте с официального сайта драйвер и установите его. Впрочем даже если ставили, порой не мешает удалить имеющийся и поставить драйвер CH340 повторно.
Подключите плату к ПК и выберите появившийся порт, например у меня это был COM3
После успешного подключения в Мониторе порта уже может начать появляться какая-то информация.
Далее нам необходимо поставить нужные библиотеки, для работы с сенсором DHT 11
Во вкладке Библиотеки, ищем «DHT sensor library», и в появившемся списке вариантов выбираем вариант DHT sensor library от Adafruit. Нам необходимо выбрать нужную библиотеку и нажать на кнопку «установить\install»
Так же находим и устанавливаем еще и «Adafruit Unified Sensor» от Adafruit
На следующем этапе, необходимо подключить датчик DHT11 к ESP8266 и залить скетч. Порядок выполнения не существенен, но я советую начать с заливки скетча. Это нужно для того, чтобы на этом этапе убедиться в том, что плата успешно подключена к компьютеру и Arduino IDE ее видит и может залить код.
Код скетча
#include
#include
#include
#include "DHT.h"
#define DHTTYPE DHT11
const char* ssid = ""; // Имя вашей сети WIFI
const char* password = ""; // Пароль к вашей WIFI
const uint8_t DHTPin = D7; // NodeMCU D7 (GPIO13) или просто 13 вместо D7
const uint8_t redLEDPin = D5; // NodeMCU D5 (GPIO14) или просто 14 вместо D5
ESP8266WebServer server(80);
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
void setup() {
Serial.begin(115200);
delay(100);
pinMode(redLEDPin, OUTPUT);
dht.begin();
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
server.on("/", handle_OnConnect);
server.on("/data", handle_SendData); // Обработчик для обновления данных
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
void handle_OnConnect() {
server.send(200, "text/html", SendHTML());
}
void handle_SendData() {
Temperature = dht.readTemperature();
Humidity = dht.readHumidity();
if (isnan(Temperature) || isnan(Humidity)) {
server.send(500, "text/plain", "Failed to read from DHT sensor!");
return;
}
// Управление светодиодом
if (Temperature > 35.0) {
digitalWrite(redLEDPin, HIGH); // Включить светодиод
} else {
digitalWrite(redLEDPin, LOW); // Выключить светодиод
}
String data = "";
data += "<p class=\"" + String((Temperature < 35.0) ? "normal" : "alert") + "\">Температура: ";
data += String(Temperature);
data += "°C</p>";
data += "<p class=\"" + String((Humidity < 55.0) ? "normal" : "alert") + "\">Влажность: ";
data += String(Humidity);
data += "%</p>";
server.send(200, "text/html", data);
}
void handle_NotFound() {
server.send(404, "text/plain", "Not found");
}
String SendHTML() {
String ptr = "<!DOCTYPE html> <html>\n";
ptr += "<head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr += "<title>ESP8266 Weather Report</title>\n";
ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr += "p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr += ".normal {color: black;}\n";
ptr += ".alert {color: red;}\n";
ptr +="</style>\n";
ptr +="<script>\n";
ptr +="setInterval(loadDoc, 2000);\n"; // Обновляем каждые 2 секунды
ptr +="function loadDoc() {\n";
ptr +="var xhttp = new XMLHttpRequest();\n";
ptr +="xhttp.onreadystatechange = function() {\n";
ptr +="if (this.readyState == 4 && this.status == 200) {\n";
ptr +="document.getElementById(\"data\").innerHTML = this.responseText;\n";
ptr +="}\n";
ptr +="};\n";
ptr +="xhttp.open(\"GET\", \"/data\", true);\n";
ptr +="xhttp.send();\n";
ptr +="}\n";
ptr +="</script>\n";
ptr += "</head>\n";
ptr += "<body>\n";
ptr += "<div id=\"data\">\n";
ptr += "<h1>Климат!</h1>\n";
ptr += "<p>Загрузка данных...</p>\n"; // Начальный текст до обновления
ptr += "</div>\n";
ptr += "</body>\n";
ptr += "</html>\n";
return ptr;
}
Небольшие пояснения кода:
Первым делом после подключения необходимых библиотек, мы задаем настройки WIFI. Это данные Вашей сети, к которой должен подключиться NodeMCU.
const char* ssid = ""; //Имя вашей сети WIFI const char* password = ""; //Пароль к вашей WIFI
Далее мы задаем пины к которым у нас подключен датчик температуры и Светодиод.
const uint8_t DHTPin = D7; // NodeMCU D7 (GPIO13) или просто 13 вместо D7 DHT 11 const uint8_t redLEDPin = D5; // NodeMCU D5 (GPIO14) или просто 14 вместо D5 светодиод
Если при заливке скетча у вас ошибка, что D7 или D5 например, не определены, это решается простой заменой значений, замените D7 на 13, а D5 на 14
После успешного подключения в консоли Arduino IDE, можно будет увидеть IP адрес, который устройство получило от вашего роутера и к которому вы можете подключиться, введя этот адрес в браузере.
Serial.println("WiFi connected..!"); Serial.print("Got IP: ");
При превышении заданной температуры или влажности, в браузере, текст будет отмечаться красным цветом.
data += "<p class=\"" + String((Temperature < 35.0) ? "normal" : "alert") + "\">Температура: "; data += "<p class=\"" + String((Humidity < 55.0) ? "normal" : "alert") + "\">Влажность: ";
Так же, при превышении заданной температуры загорится красный светодиод.
if (Temperature > 35.0) { digitalWrite(redLEDPin, HIGH); // Включить светодиод } else { digitalWrite(redLEDPin, LOW); // Выключить светодиод }
В коде вывода информации в браузер, можно задать интервал обновления данных с датчика. Там же при желании можно поменять оформление, добавить иконки и пр, при таковой необходимости. Но лично мне кажется, в случае с NodeMCU, чем лаконичнее вывод, тем лучше, ну или как минимум быстрее.
ptr +="setInterval(loadDoc, 2000);\n"; // Обновляем каждые 2 секунды
Многие варианты кода, коих много в сети, адаптированы больше под вывод текста на английском, в нашем варианте он отлично выводит надписи на кириллице (Русском языке например).
Дабы не утяжелять код и замедлять загрузку страницы, всякие украшательства убраны. При желании по аналогии с тем что уже есть, вы можете поиграть с оформлением.
Код вывода в браузер, начинается с:
String ptr = "<!DOCTYPE html> <html>\n";
Код вывода в браузер, заканчивается на:
return ptr;
После того как код успешно залит, отключаем плату от ПК и подключаем датчик.
Схема подключения ESP8266 (NodeMCU) и DHT11
При этом если вы не используете светодиод, по причине того, что у вас его просто нет или не нужен, то ничего страшного, все будет работать и так.
На следующем этапе можно подключить ESP8266 обратно к ПК и в мониторе консоли, посмотреть вывод данных.
Там же вы можете увидеть IP адрес который был назначен вашему устройству, по которому вы сможете к нему подключиться, введя адрес в браузере.
При желании и необходимости, код можно менять под свои нужды. Например у меня в настоящее время работают несколько вариантов устройств, одно с текущим кодом и два с немного измененным, после внесения некоторых дополнений, которые нужны были под свои задачи.
Например на основе варианта выше, добавил отправку данных на сервер, с контролем температуры и записью в базу данных. Потом добавил вывод графиков (на сервере) на основе данных в базе. Дальше пришлось добавлять к отправляемым данным на сервер еще и ID устройства, чтобы различать и разделять поступающие данные, вывод всех имеющихся датчиков с контролем последней отправки данных и уровня температуры, опять же с построением графиков.
В итоге с каждого из датчиков данные отправляются на сервер, через определенный интервал идет запись значений в базу (чтобы не забивать ее данными) ну и в указанные заранее интервалы времени, через бот в телеграмме, получаю на телефон текущие значения, а при достижении критических порогов, внеочередное уведомление с тревогой. Имея сохраненные данные в базе, при необходимости можно выводить графики, аналитику и пр. Получился эдакий микросервис. К одному из устройств, добавлен еще и вывод показаний на дисплей.
А далее все это, убрано в специально разработанные под это дело, корпуса.
Если такая необходимость будет, можно будет выложить и варианты с отправкой на сервер и вариант с выводом на дисплей. Разница между версиями не особенно велика. В моем случае, перед публикацией, код наоборот пришлось упрощать, убирая индивидуальные особенности, оставив только кусок с индикацией светодиода, что при желании тоже можно убрать.
Полезные ссылки:
Подключению NodeMCU и DHT11, настройка в IDE На русском:
https://www.joyta.ru/12679-vzaimodejstvie-dht11-dht22-s-esp8266-nodemcu-s-ispolzovaniem-veb-servera/
https://arduino-tex.ru/news/18/urok-2-podklyuchaem-dht11-dht22-k-esp32-esp8266-pokazanie-na.html
Подключению NodeMCU и DHT11, настройка в IDE На английском:
https://circuits4you.com/2019/01/25/interfacing-dht11-with-nodemcu-example/
https://microcontrollerslab.com/dht11-dht22-web-server-esp8266-nodemcu-arduino-ide/
https://newbiely.com/tutorials/esp8266/esp8266-dht11
Скачать драйвер CH341: https://wch-ic.com/downloads/CH341SER_EXE.html
1 Комментарий