V tem članku si oglejte, kako objaviti odčitke temperature in vlage iz senzorja DHT11 ali DHT22 prek MQTT z ESP32 na kateri koli platformi, ki podpira MQTT, ali katerem koli MQTT odjemalcu.
Random Nerd Tutorials
Kot primer bomo odčitke senzorja objavili na Node-RED Dashboard nadzorni plošči, ESP32 pa bomo programirali z Arduino IDE.
Pregled projekta
Naslednji diagram prikazuje pregled projekta, ki ga bomo zgradili, na visoki ravni.
ESP32 od senzorja DHT11 ali DHT22 zahteva odčitke temperature in vlage;
Odčitki temperature so objavljeni v temi esp32/dht/temperature;
Odčitki vlažnosti so objavljeni v temi esp32/dht/humidity;
Node-RED vozlišče je naročeno na te teme;
Node-RED prejme odčitke senzorjev in jih prikaže na merilnikih;
Odčitke lahko prejmete na kateri koli drugi platformi, ki podpira MQTT, in z njimi ravnate, kot želite.
Ta vsebina je samo za naročnike
Predpogoji za delovanje
Preden nadaljujete s tem člankom, preverite naslednje predpogoje.
Arduino IDE
ESP32 bomo programirali z Arduino IDE, zato se prepričajte, da imate nameščen ESP32 dodatek.
Namestite ESP32 ploščo v Arduino IDE (Windows, Mac OS X, Linux) [1]
MQTT posrednik
Za uporabo MQTT potrebujete posrednika. Mi bomo uporabili Mosquitto posrednika [2], ki je nameščen na Raspberry Pi. Preberite si: Kako namestiti Mosquitto Broker na Raspberry Pi [3].
Uporabite lahko kateregakoli drugega MQTT posrednika, tudi MQTT posrednika v oblaku. Kako to storiti, vam bomo pokazali v članku pozneje.
Če MQTT še ne poznate, preberite naš uvodni članek: Kaj je MQTT in kako deluje [4].
MQTT knjižnice
Za uporabo MQTT z ESP32 bomo uporabili Async MQTT Client Library knjižnico [5].
Namestitev Async MQTT Client knjižnice:
Kliknite tukaj [6] za prenos Async MQTT odjemalske knjižnice. V mapi za prenose morate imeti mapo .zip
Razpakirajte .zip mapo in dobili boste async-mqtt-client-master mapo
Preimenujte mapo iz async-mqtt-client-master v async_mqtt_client, mapo, async_mqtt_client prestavite v mapo knjižnic za namestitev Arduino IDE
Na koncu ponovno odprite Arduino IDE
Lahko pa greste v Skica > Vključi knjižnico > Dodaj . ZIP in izberite knjižnico, ki ste jo pravkar prenesli.
Namestitev Async TCP knjižnice
Za uporabo MQTT s protokolom ESP potrebujete tudi Async TCP knjižnico [7].
Kliknite tukaj [8] za prenos Async TCP odjemalske knjižnice. V mapi Prenosi morate imeti mapo .zip
Razpakirajte .zip mapo in dobili boste AsyncTCP-master mapo
Preimenujte mapo AsyncTCP-master v AsyncTCP
Premaknite mapo AsyncTCP v mapo knjižnic za namestitev Arduino IDE
Na koncu ponovno odprite Arduino IDE
Lahko pa greste v Skica > Vključi knjižnico > Dodaj . ZIP in izberite knjižnico, ki ste jo pravkar prenesli.
Knjižnice DHT senzorja
Za branje s senzorja DHT bomo uporabili knjižnico DHT podjetja Adafruit [9]. Za uporabo te knjižnice morate namestiti tudi knjižnico Adafruit Unified Sensor [10]. Za namestitev teh knjižnic sledite naslednjim korakom.
1. Odprite program Arduino IDE in pojdite na Sketch > Include Library > Manage Libraries. Odpreti se mora upravitelj knjižnic.
2. V iskalnem polju poiščite “DHT” in namestite knjižnico DHT podjetja Adafruit.
Kaj potrebujete za izvedbo projekta?
Za ta projekt potrebujete naslednje komponente:
- ESP32
- DHT11 ali DHT22 – DHT z navodilom za ESP32
- upor 4,7k Ohm
- Plošča Raspberry Pi
- Kartica MicroSD – 16 GB razred10
- Napajalnik Raspberry Pi (5V 2,5A)
- Žice za premostitev
- Univerzalna razvojna plošča
Shematski diagram
DHT11 ali DHT22 povežite z ESP32, kot je prikazano na naslednji shematskem diagramu, pri čemer je podatkovni priključek povezan z GPIO 4.
Opomba: če imate DHT senzor že vgrajen v neki razvojni plošči, ima le tri priključke in notranji pull-up upor na priključku 2, zato vam ni treba priključiti upora. Povezati morate le VCC, podatke in GND.
V tem primeru smo DHT podatkovni priključek priključili na GPIO 4. Lahko pa uporabite kateri koli drug primeren digitalni priključek.
Program
V programsko okolje Arduino IDE kopirajte kodo, ki jo najdete na spletni strani avtorja. Če želite, da bo delovala za vas, morate vstaviti svoje omrežne poverilnice in podatke o posredniku MQTT.
Kako deluje program?
Najprej je potrebno uvoziti ustrezne knjižnice:
#include"DHT.h" #include<WiFi.h> extern"C"{ #include"freertos/FreeRTOS.h" #include"freertos/timers.h" } #include<AsyncMqttClient.h>
V naslednje vrstice vključite svoje omrežne poverilnice.
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID" #define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
Vnesite IP-naslov Raspberry Pi plošče, da se ESP32 poveže z vašim posrednikom.
#define MQTT_HOST IPAddress(192, 168,1, 106)
Če uporabljate MQTT posrednika v oblaku, vstavite ime domene posrednika, na primer:
#defineMQTT_HOST"example.com"
Definirajte MQTT vrata.
#defineMQTT_PORT1883
Temperatura in vlažnost bosta objavljeni v naslednjih temah:
#define MQTT_PUB_TEMP "esp32/dht/temperature" #define MQTT_PUB_HUM "esp32/dht/humidity"
Opredelite GPIO, na katerega je priključen podatkovni priključek DHT senzorja. V našem primeru je priključen na GPIO 4.
Odkljukajte tip DHT senzorja, ki ga uporabljate. V našem primeru uporabljamo tip DHT22.
//#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301)
Inicializirajte DHT senzor na prej določenem priključku in tipu.
DHT dht(DHTPIN,DHTTYPE);
Spremenljivki temp in hum vsebujeta vrednosti temperature in vlažnosti iz DHT22 senzorja.
floattemp; floathum;
Ustvarite objekt AsyncMqttClient z imenom mqttClient za upravljanje MQTT odjemalca in časovnikov za ponovno vzpostavitev povezave z MQTT posrednikom in usmerjevalnikom, ko se povezava zaradi različnih razlogov prekine.
AsyncMqttClient mqttClient; TimerHandle_t mqttReconnectTimer; TimerHandle_t wifiReconnectTimer;
Nato ustvarite nekaj pomožnih spremenljivk časovnika za objavo odčitkov vsakih 10 sekund. Čas zakasnitve lahko spremenite v spremenljivki interval.
unsignedlongpreviousMillis =0; // Stores last time temperature was published constlonginterval =10000; // Interval at which to publish sensor reading
Opomba: DHT11 in DHT22 imata nizko stopnjo vzorčenja. Odčitke DHT11 lahko zahtevate le vsako sekundo, pri DHT22 pa vsaki dve sekundi.
Funkcije MQTT: povezava z Wi-Fi, povezava z MQTT in Wi-Fi dogodki
Funkcijam, opredeljenim v naslednjem razdelku kode, nismo dodali nobenih komentarjev. Te funkcije so priložene knjižnici Async Mqtt Client. Imena funkcij so precej samoumevna.
Funkcija connectToWifi() na primer poveže vaš ESP32 z usmerjevalnikom:
voidconnectToWifi() {Serial.println("Connecting to Wi-Fi..."); WiFi.begin(WIFI_SSID,WIFI_PASSWORD); }
Funkcija connectToMqtt() poveže vaš ESP32 z MQTTposrednikom:
voidconnectToMqtt() {Serial.println("Connecting to MQTT…"); mqttClient.connect(); }
Funkcija WiFiEvent() je odgovorna za obdelavo Wi-Fi dogodkov. Po uspešni povezavi z usmerjevalnikom in MQTT brokerjem na primer izpiše naslov IP ESP32. Po drugi strani pa ob izgubi povezave sproži časovnik in poskuša ponovno vzpostaviti povezavo.
voidWiFiEvent(WiFiEvent_t event){ Serial.printf("[WiFi-event] event: %dn", event); switch(event){ case SYSTEM_EVENT_STA_GOT_IP: Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); connectToMqtt(); break; case SYSTEM_EVENT_STA_DISCONNECTED: Serial.println("WiFi lost connection"); xTimerStop(mqttReconnectTimer,0); xTimerStart(wifiReconnectTimer,0); break; } }
Funkcija onMqttConnect() se zažene po začetku seje s posrednikom.
voidonMqttConnect(bool sessionPresent){ Serial.println("Connected to MQTT."); Serial.print("Session present: "); Serial.println(sessionPresent); }
Funkcije MQTT: prekinitev povezave in objava
Če ESP32 izgubi povezavo z MQTT posrednikom, pokliče funkcijo onMqttDisconnect, ki to sporočilo izpiše v serijski monitor.
voidonMqttDisconnect(AsyncMqttClientDisconnectReason reason){ Serial.println("Disconnected from MQTT."); if(WiFi.isConnected()){ xTimerStart(mqttReconnectTimer,0); } }
Ko objavite sporočilo na temo MQTT, se pokliče funkcija onMqttPublish(). Ta v serijskem monitorju izpiše id paketa.
voidonMqttPublish(uint16_t packetId){ Serial.println("Publish acknowledged."); Serial.print(" packetId: "); Serial.println(packetId); }
Vse te funkcije, ki smo jih pravkar omenili, so funkcije povratnih klicev. Torej se izvajajo asinhrono.
setup()
Sedaj preidimo na setup() del kode. Inicializirajte senzor DHT.
dht.begin();
Naslednji dve vrstici ustvarjata časovnika, ki omogočata, da se MQTT posrednik in Wi-Fi povezava ponovno povežeta, če se povezava prekine.
mqttReconnectTimer =xTimerCreate("mqttTimer",pdMS_TO_TICKS(2000), pdFALSE,(void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt)); wifiReconnectTimer =xTimerCreate("wifiTimer",pdMS_TO_TICKS(2000), pdFALSE,(void*)0, reinterpret_cast<TimerCallbackFunction_ t>(connectToWifi));
Naslednja vrstica dodeli povratno funkcijo, tako da bo ESP32, ko se poveže z vašim Wi-Fi omrežjem, izvedel funkcijo WiFiEvent() in natisnil prej opisane podrobnosti.
WiFi.onEvent(WiFiEvent);
Na koncu dodelite vse funkcije povratnih klicev. To pomeni, da se bodo te funkcije po potrebi samodejno izvajale. Na primer, ko se ESP32 poveže s posrednikom, samodejno pokliče onMqttConnect() funkcijo in tako naprej.
mqttClient.onConnect(onMqttConnect); mqttClient.onDisconnect(onMqttDisconnect); //mqttClient.onSubscribe(onMqttSubscribe); //mqttClient.onUnsubscribe(onMqttUnsubscribe); mqttClient.onPublish(onMqttPublish); mqttClient.setServer(MQTT_HOST, MQTT_PORT);
Avtentikacija posrednika
Če vaš posrednik zahteva preverjanje pristnosti, odkomentirajte naslednjo vrstico in vstavite svoje poverilnice (uporabniško ime in geslo).
mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_ YOUR_PASSWORD");
Na koncu se povežite z Wi-Fi omrežjem.
connectToWifi(); loop()
V loop() funkciji ustvarite časovnik, ki vam bo omogočil pridobivanje novih odčitkov temperature in vlažnosti iz DHT senzorja in njihovo objavo v ustrezni temi vsakih 10 sekund.
unsignedlong currentMillis =millis(); // Every X number of seconds (interval = 10 seconds) // it publishes a new MQTT message if(currentMillis - previousMillis >= interval){ // Save the last time a new reading was published previousMillis = currentMillis; // New DHT sensor readings hum = dht.readHumidity(); // Read temperature as Celsius (the default) temp = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) //temp = dht.readTemperature(true);
Objavljanje v temah
Za objavo odčitkov v ustreznih temah MQTT uporabite naslednje vrstice:
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP,1, true,String(temp).c_ str()); uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM,1, true,String(hum).c_ str());
Za objavo podatkov na temi uporabite metodo publish() na objektu mqttClient. Metoda publish() sprejema naslednje argumente v naslednjem vrstnem redu:
Tema MQTT (const char*) QoS (uint8_t): kakovost storitve - lahko je 0, 1 ali 2 retain flag (bool): zastavica za ohranitev payload (const char*) - v tem primeru payload ustreza odčitku senzorja
Kakovost storitve (QoS) je način zagotavljanja, da je sporočilo dostavljeno. Lahko je ena od naslednjih ravni:
- 0: sporočilo bo dostavljeno enkrat ali sploh ne. Sporočilo se ne potrdi. Ni možnosti podvajanja sporočil;
- 1: sporočilo bo dostavljeno vsaj enkrat, lahko pa tudi večkrat;
- 2: sporočilo se vedno dostavi natanko enkrat;
Nalaganje programa
Ko imate vklopljen Raspberry Pi in nameščen Mosquitto MQTT posrednika, prenesite kodo v ESP32.
Odprite serijski monitor s hitrostjo 115200 in videli boste, da ESP32 začne objavljati sporočila o temah, ki smo jih prej določili.
Priprava Node-RED nadzorne plošče
ESP32 objavlja odčitke temperature in vlage vsakih 10 sekund v temah esp32/dht/temperature in esp32/dht/humidity. Zdaj se lahko s katero koli nadzorno ploščo, ki podpira MQTT, ali katero koli drugo napravo, ki podpira MQTT, naročite na te teme in prejmete odčitke.
Kot primer bomo ustvarili preprost tok z uporabo Node-RED za naročanje na te teme in prikazovanje odčitkov na merilnikih.
Ko je Node-RED zagnan na vašem Raspberry Pi, pojdite na vaš Raspberry Pi IP naslov, ki mu sledi :1880.
http://raspberry-pi-ip-address:1880
Moral bi se odpreti se Node-RED vmesnik. V potek povlecite dve MQTT vozlišči ter dve merilni vozlišči.
Kliknite na MQTT vozlišče in uredite njegove lastnosti. Polje Strežnik se nanaša na MQTT posrednika. V našem primeru je MQTT posrednik Raspberry Pi, zato je nastavljen na localhost:1883. Če uporabljate MQTT posrednika v oblaku, morate to polje spremeniti.
Vnesite temo, na katero želite biti naročeni, in QoS. To prejšnje MQTT vozlišče je naročeno na temo esp32/dht/temperature. Kliknite na drugo MQTT vozlišče in uredite njegove lastnosti z istim strežnikom, vendar za drugo temo: esp32/dht/humidity.
Kliknite na vozlišča merilnika in uredite njegove lastnosti za vsako odčitavanje. Naslednje vozlišče je nastavljeno za odčitke temperature. Uredite drugo vozlišče grafikona za odčitke vlažnosti. Vozlišča povežite, kot je prikazano na sliki. Na koncu aktivirajte svoj tok (pritisnite tipko v zgornjem desnem kotu).
Če želite ustvariti tok Node-RED, lahko izberete Meni > Uvoz in v odložišče kopirate naslednje podatke navedene na strani avtorja.
Prikaz delovanja
Pojdite na IP naslov Raspberry Pi, ki mu sledi :1880/ui.
http://raspberry-pi-ip-address:1880/ui
Na nadzorni plošči bi morali dobiti dostop do trenutnih vrednosti temperature in vlažnosti DHT. Uporabite lahko druga vozlišča tipa armaturna plošča za prikaz odčitkov na različne načine.
To je to! Vaša ESP32 plošča objavlja podatke o temperaturi in vlažnosti iz DHT senzorja v Node-RED prek MQTT.
Zaključek
MQTT je odličen komunikacijski protokol za izmenjavo majhnih količin podatkov med napravami. V tem članku ste se naučili, kako objaviti odčitke temperature in vlage iz senzorja DHT z ESP32 v različne MQTT teme. Nato lahko uporabite katero koli napravo ali platformo za avtomatizacijo doma, da se naročite na te teme in prejmete odčitke. Namesto DHT11 ali DHT22 senzorja lahko uporabite kateri koli drug senzor, na primer temperaturni senzor DS18B20 ali senzor BME280.
Viri:
1: https://bit.ly/2RfTZTd
2: https://bit.ly/2HyTDRY
3: https://bit.ly/41fmK2S
4: https://bit.ly/3XT9NZy
5: https://bit.ly/3XTwmgE
6: https://bit.ly/3SjIuqm
7: https://bit.ly/3EumfZ6
8: https://bit.ly/3y2PKxD
9: https://bit.ly/3YRF2pl
10: https://bit.ly/3KuNSFe
Povzeto po:
https://bit.ly/3EoE0Jf