разделы:

Своя метеостанция на ESP8266 NodeMCU  и  DHT11

Проектов метеостанций на плате 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 (NodeMCU) и DHT11
*кликабельно

При этом если вы не используете светодиод, по причине того, что у вас его просто нет или не нужен, то ничего страшного, все будет работать и так.

На следующем этапе можно подключить ESP8266 обратно к ПК и в мониторе консоли, посмотреть вывод данных.

Там же вы можете увидеть IP адрес который был назначен вашему устройству, по которому вы сможете к нему подключиться, введя адрес в браузере.

При желании и необходимости, код можно менять под свои нужды. Например у меня в настоящее время работают несколько вариантов устройств, одно с текущим кодом и два с немного измененным, после внесения некоторых дополнений, которые нужны были под свои задачи.

Например на основе варианта выше, добавил отправку данных на сервер, с контролем температуры и записью в базу данных. Потом добавил вывод графиков (на сервере) на основе данных в базе. Дальше пришлось добавлять к отправляемым данным на сервер еще и ID устройства, чтобы различать и разделять поступающие данные, вывод всех имеющихся датчиков с контролем последней отправки данных и уровня температуры, опять же с построением графиков.

В итоге с каждого из датчиков данные отправляются на сервер, через определенный интервал идет запись значений в базу (чтобы не забивать ее данными) ну и в указанные заранее интервалы времени, через бот в телеграмме, получаю на телефон текущие значения, а при достижении критических порогов, внеочередное уведомление с тревогой. Имея сохраненные данные в базе, при необходимости можно выводить графики, аналитику и пр. Получился эдакий микросервис. К одному из устройств, добавлен еще и вывод показаний на дисплей.

А далее все это, убрано в специально разработанные под это дело, корпуса.

ESP8266 (NodeMCU) и DHT11 корпус

ESP8266 (NodeMCU) и DHT11 корпус

Если такая необходимость будет, можно будет выложить и варианты с отправкой на сервер и вариант с выводом на дисплей. Разница между версиями не особенно велика. В моем случае, перед публикацией, код наоборот пришлось упрощать, убирая индивидуальные особенности, оставив только кусок с индикацией светодиода, что при желании тоже можно убрать.

Полезные ссылки:

Подключению 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