В этой статье мы рассмотрим как получать значения температуры и влажности с датчика DHT11 и передавать их в систему Node Red через MQTT брокер. Этот проект очень прост, и сделать его сможет любой, нужно только немного времени и материалов. Мне было интересно получать данные о температуре и влажности, которые будут выводиться на экран телефона или компьютера, подключенного к локальной сети, и поэтому я использовал контроллер ESP32 и датчик DHT11.
Для начала нужно было написать код для датчика. Я писал код в программе Visual Studio Code на языке C++. Для того, чтобы контроллер работал, нужно подключить 2 библиотеки: для подключения к MQTT (EspMQTTClient) и библиотеку датчика (DHT). В целом код получился небольшой и довольно простой:
#include <Arduino.h>
#include <EspMQTTClient.h>//Подключение библиотеки для подключения к MQTT
#include <DHT.h> //Подключение библиотеки для датчика
#include <Adafruit_sensor.h>
#include "Timer.h" // Подключаем таймер
#define DHTPIN 2
#define DHTTYPE DHT11
const int dT{10000}; //частота опроса датчиков
DHT dht(DHTPIN, DHTTYPE);
Timer timer(dT);
String message = "";
EspMQTTClient client1(
"Имя Wi-fi",
"Пароль Wi-fi",
"Адрес MQTT",
"Имя пользователя",
"Пароль пользователя",
"Имя устройства"
);
void onConnectionEstablished() //При подключении к MQTT вызывается эта функция(её можно найти в описании библиотеки, когда вы будете её устанавливать
{
client1.publish("outside/start", "This is a message from ESP32");
}
void setup(){
dht.begin();
}
void loop(){
client1.loop();
if(timer.getTimer()){
timer.setTimer();
float t = dht.readTemperature();
float h = dht.readHumidity();
message = String(t);
client1.publish("outside/temp", message.c_str());
message = String(h);
client1.publish("outside/hum", message.c_str());
}
}
Эта программа опрашивает датчик с интервалом в 10 сек. и вызывает функцию передачи данных в MQTT.
Когда код для датчика был написан и данные с датчика отправлялись в MQTT, нужно было сделать так, чтобы все данные о температуре и влажности выводились на экран. Для этого я использовал локальный Node-RED на своем устройстве (в моем случае компьютере), и сделал простую схему для вывода данных с MQTT.
В узле fuction я объявил 2 переменные temp и hum, для сохранения в хранилище flow , которым в дальнейшем я буду присваивать данные получаемые через MQTT. После этого я подключаюсь к MQTT с помощью узла MQTT In, и получаю данные о температуре и влажности. Затем я присваиваю эти значения переменным temp и hum соответственно, и вывожу эти данные в Node-RED Dashboard с помощью узлов Gauge и Chart. Результат:
В итоге я получил систему, которая с помощью датчика получает данные о температуре и о влажности, и выводит эти данные в Node-RED Dashboard. Сохраненные данные можно использовать для ответов на запросы от других устройств или для вычисления первой производной, резкое изменение которой сигнализирует о нештатной ситуации.