Sunteți pe pagina 1din 36

FALCULTATEA DE AUTOMATICĂ, CALCULATOARE ȘI ELECTRONICĂ

CRAIOVA

Home automation cu MQTT


*PROIECT*

Anul universitar 2021-2022

Studenți: Profesor:
Maria-Afrem Silviu Hurezeanu Bogdan
Jianu Șerban
Cuprins

I. Introducere ………………………………………………………… 1
II. Tehnologii utilizate ………………………………………………… 3
II.1. Hardware ……………………………………………………… 3
II.2. Software …………………………………………………….. .. 10
III. Configurarea proiectului …………………………………………. .. 15
III.1. Configurare Home Assistant pentru Raspberry Pi 4 …… …… 15
III.2. Configurarea ESP32 ………………………………………..… 19
III.3. Configurarea finală ……………………………………..……. 23
IV. Concluzii ……………………………………………………………. 25
V. Codul sursă …………………………………………………….…… 26
V.1. ESP cu DHT …………………………………………………… 26
V.2. ESP cu releu și ventilator ………………………………….….. 30
VI. Bibliografie …………………………………………………….…… 34
I. Introducere

I.1. Scopul

Scopul acestei lucrări este, in primul rand, de a introduce studenții în


domeniul rețelelor de calculatoare și de a demonstra utilitatea acestui domeniu
în viața de zi cu zi. De la router-ele de acasa pana la sisteme smart home,
precum cel descris în prezenta lucrare, rețelele de calculatoare constituie o
utilitate aparte în domeniul IT și mai ales în domeniul automaticii.

I.2. Motivatia

Aceasta tema de proiect a fost aleasă cu intenția de a invata un nou


protocol de comunicatie între dispozitive, dar si pentru rolul ei aplicativ si
apropierea de viața cotidiană. Acest proiect simulează funcționarea unui sistem
de ventilatie bazat pe temperatura ambientală, un lucru foarte util într-un birou,
o institutie sau chiar acasa.
Protocolul MQTT utilizat în acest proiect este o componenta a IoT
(Internet of Things), sintagma ce descrie o rețea de obiecte fizice care au în
componenta diferiți senzori, componente software și alte tehnologii cu scopul de
a se conecta și a schimba date intre ele, dar și cu alte dispozitive și sisteme prin
internet. IoT are un rol foarte important în piața viitoare deoarece, în ziua de azi,
totul se bazează pe internet și dispozitive inteligente. Deja, la nivel industrial,
putem observa cum interconectarea utilajelor și aparatelor revoluționează piața.
O alta caracteristică a dispozitivelor din aceasta categorie este costul redus și
usurinta de inlocuire, dar și consumul redus de energie electrică.
În ceea ce privește tehnologiile de acest fel, de foarte multe ori suntem
tentați sa ne gandim in principal la uzul lor industrial, aceasta gandire
limitandu-le astfel utilitatea. Fluxul de informații prezent pe internet abundă de
proiecte open source ce pot fi prelucrate pentru a avea utilitate și în zona
rezidentiala. Aceste tipuri de sisteme vizează îmbunătățirea a ceea ce este
cunoscut ca si “Quality of Life” (QoL), în traducere avand sensul de calitate a
vieții, usurand responsabilitățile domestice ale oamenilor.
Prezentul proiect își propune sa adreseze o problema din ce în ce mai
prevalenta avand in vedere schimbarea climatica rapidă observata de noi toti la
nivel planetar. În spațiul țării noastre, in ultimii ani, temperaturile au crescut
simțitor pe timp de vara, iar prezenta prevalenta a asfaltului in orase duce la un

1
efect de sera, pastrand temperaturile mari până și noaptea. Cu ajutorul
dispozitivului realizat, ventilatorul (sau, in speta, aerul conditionat) poate fi
comandat automat sa pastreze temperatura între anumite praguri, fără a fi nevoie
de operare umană. Desigur, și operarea umană este încă posibilă prin
intermediul aplicației sau a interfeței web.
In principiu, acest proiect se apropie atat de domeniul industrial, avand in
vedere viitorul pe care îl are acest domeniu în combinatie cu tehnologiile ce fac
parte din IoT, dar și de domeniul rezidential și personal, usurand viața oamenilor
pentru ca ei sa se poată concentra pe lucruri mai importante decat rutinele
domestice.

2
II. Tehnologii utilizate

II.1. Hardware

II.1.1. Placa de dezvoltare Raspberry Pi 4 - 4GB RAM

Raspberry Pi este o serie de SBC-uri (single-board computer) dezvoltata


in Regatul Unit de catre Raspberry Pi Foundation. Scopul initial al acestor
SBC-uri a fost de a promova invatarea unor notiuni de baza a CS (computer
science, informatica) in scoli. Proiectul se adresa in principal tarilor in curs de
dezvoltare. In scurt timp, oameni cu hobby-uri diverse cuprinse in acest camp
au inceput sa dezvolte cu acest tip de placi de dezvoltare diverse proiecte legate
de robotica, monitorizare a vremii s.a.m.d.

Figura 1.

Raspberry Pi a fost lansat în 2012 și au existat mai multe iterații și


variante lansate de atunci. Originalul Pi avea un procesor single-core de 700
MHz și doar 256 MB RAM, iar cel mai recent model are un procesor quad-core
cu o viteză de peste 1,5 GHz și 4 GB/8 GB RAM. Prețul pentru Raspberry Pi a
fost întotdeauna sub 100 USD (de obicei în jur de 35 USD), în special Pi Zero,
care costă doar 5 USD, ceea ce amintește de calitatea aparte a proiectelor de
acest tip, și anume costul redus al componentelor.

Specificatiile SBC-ului sunt după cum urmează:

3
- Procesor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit
SoC @ 1.5GHz;
- Memorie: 4 GB LPDDR4-3200 SDRAM;
- Conectivitate: 2.4 GHz and 5.0 GHz IEEE 802.11ac wireless, Bluetooth
5.0, BLE, Gigabit Ethernet;
- Porturi: 2 USB 2.0 si 2 USB 3.0, 2 porturi micro-HDMI, 2-lane MIPI DSI
display port, 2-lane MIPI CSI camera port;
- GPIO: Raspberry Pi standard 40 pin GPIO header.

Acest computer pe un singur board va fi folosit pentru instalarea


software-ului Home Assistant care va servi drept interfața web de control, dar și
aplicație Android pentru controlul sistemului de pe sistemele mobile. Desigur, și
aceasta piesa de software trebuie configurată, lucru ce urmează a fi explicat în
capitolul 3.

4
II.1.2. Placa de dezvoltare ESP32

Placa de dezvoltare ESP32 este o un sistem low-cost, low-power pe seria


de chip (SoC) ce are capabilitati Wi-FI si Bluetooth dual-mode. ESP32 este un
modul de dezvoltare integrat cu switch-uri integrate de antena, balun RF,
amplificator de putere, amplificator de receptie cu zgomot redus, filtre si
module de gestionare a alimentării. Acesta este dezvoltat de firma Esspresif,
insa are si variante generice pe piata cu un cost de achizitie mai redus.

Figura 2.

Specificatiile tehnice:

- Procesor: Tensilica Xtensa 32-bit LX6 microprocessor;


- Conectivitate:
- Wi-Fi: 802.11 b/g/n/e/i (802.11n @ 2.4 GHz up to 150 Mbit/s)
- Bluetooth: v4.2 BR/EDR and Bluetooth Low Energy (BLE)
- Memorie:
- ROM: 448 KiB
- SRAM: 520 KiB
- RTC Slow SRAM: 8 KiB
- RTC Fast SRAM: 8 KiB

5
- eFuse: 1 Kibit
- Embedded Flash: 4 MiB
- Interfata: DMA, ADC, DAC, I2C, UART, CAN, SPI, I2S, RMII, PWM
s.a.m.d.

În cadrul acestui proiect se vor folosi doua astfel de placute în felul


următor: una dintre plăcile de dezvoltare va contine un senzor de temperatura si
umiditate, iar cealalta dintre placute va avea conectat un releu si un fan (care
joacă rolul sistemului de ventilatie/climatizare). Ambele placi vor comunica
prin MQTT cu SBC-ul Raspberry Pi 4 pe care vom avea instalat Home
Assistant.

6
II.1.3. Senzori si alte componente

În componenta acestui proiect mai sunt prezente următoarele


componente:

- Senzor de temperatura si umiditate DHT22


- Releu low level 5V FL-3FF-S-Z
- Ventilator / fan - generic

Senzorul DHT22

Senzorul DHT22 este un senzor de umiditate și temperatură mic, ieftin și


la îndemână. Folosește un senzor capacitiv de umiditate și un termistor pentru a
masura aerul din jur. Acesta oferă semnal digital pe pinul de date (nu este
nevoie de pin analogic). Este ușor de folosit, dar este nevoie de atenție pentru
citirea datelor la momentul potrivit.

Figura 3.

Caracteristici tehnice:

- Tensiune de alimentare: 3.3 - 6V DC


- Planșa de operare: temperatura -40 si 80 ℃
- Timp de citire: 2s
- Interval de umiditate: 0 - 100% RH

7
- Acuratețe: ± 0.5 ℃

Releul FL-3FF-S-Z

Modulul cu releu este potrivit pentru aplicațiile dumneavoastră în care


aveți nevoie să controlați componente de putere, în curent continuu sau
alternativ, cu un microcontroller sau alt dispozitiv de putere mică. De exemplu,
se poate folosi produsul în proiecte de tip IoT și se va putea automatiza casa,
cum putem observa prin prezentul proiect. Cu ajutorul releelor și plăcuțelor de
dezvoltare, se pot controla lumina sau electrocasnicele.

Figura 4.

Caracteristici tehnice:

- Tensiune de comandă: 5V;


- Tensiune partea de putere: 250VAC, 125VAC, 28VDC, 30VDC;
- Curent suportat, conform tensiunilor: 10A, 10A, 10A, 10A;
- LED-uri indicatoare pentru alimentare și comandă;
- Releul este comandat de tranzistor.

8
Ventilator/fan

Figura 5.

Acesta este unul generic, fiind felul de ventilator folosit pentru racirea
calculatorului. Acesta va juca rolul de sistem de ventilatie/climatizare.

9
II.2. Software

II.2.1. Home Assistant

Home Assistant reprezinta un hub de automatizare a casei sau, mai precis,


un software care permite autmoatizarea casei. In alta exprimare, este o aplicație
care permite controlul echipamentelor smart home care se afla in casa.
Acest software are doua componente:
- Server
- Client

Figura 6.

De asemenea, acest software reprezinta o solutie open source, ceea ce


înseamnă ca o comunitate de oameni pasionați conlucreaza la nivel global
pentru a face disponibile diverse scenarii și automatizări prin intermediul Home
Assistant. Acest lucru duce la o siguranța mai mare a programului.
Principalul avantaj al utilizarii acestei componente software este, pe langa
usurinta de comandare și configurare prin interfața web sau direct de pe telefon
cu ajutorul aplicației dedicate, faptul ca dispozitive fabricate de brand-uri
diferite pot conlucra prin intermediul acesteia. Un alt punct forte este păstrarea
informațiilor private.

10
Este esențial să a se înțelege că Home Assistant nu poate controla nimic
în sine. Un asistent de acasă este la fel ca un gadget principal care poate
comanda altor dispozitive inteligente să îndeplinească sarcina. Un asistent de
acasă va fi inutil și nu va face nimic dacă nu aveți niciun dispozitiv inteligent
acasă. Cu toate acestea, dacă aveți unul sau mai multe dispozitive inteligente de
acasă, un Home Assistant poate fi o modalitate excelentă de a îmbunătăți
funcționalitatea și caracteristicile cu un cost de achizitie mic. Home Assistant nu
este foarte greu de utilizat, iar prețul configurațiilor cu acest software este infim.
Un hub local de automatizare a locuinței, cum ar fi un Home Assistant,
are mai multe beneficii în comparație cu dispozitivele conectate la cloud. Iată
câteva dintre avantajele Home Assistant pentru automatizarea locuinței:

- Viteză: atunci când se declanșează o activitate sau se lansează o


comandă, toată procesarea are loc în interiorul sistemului, deoarece un
asistent acasă este un controler local. Nu va fi nimic trimis pe serverul
web. De asemenea, nu vor fi prea multe dispozitive care concurează
pentru lățimea de bandă a rețelei domiciliale. Dispozitivele inteligente pot
fi păstrate în subrețele și pot conecta doar alte dispozitive cu care
interacționează direct.
- Compatibilitate: Aceasta piesa de software face ca diferite dispozitive
fabricate de diferite brand-uri sa conlucreze in acelasi sistem.
- Securitate: Când există puține dispozitive conectate la internet, vor fi
mai puține dispozitive care permit accesul internetului în rețea. Exista
posibilitatea de decizie cu privire la ce poate accesa datele și cum
interacționează acestea.
- Control: Cloud oferă doar servicii limitate utilizatorilor pe care le doresc
proprietarii lor. Folosind hub-uri și controlere locale, utilizatorul este liber
să decida ce să face cu ele. Poate avea control deplin asupra
dispozitivelor și automatizării și se poate implica cât de profund dorește.
- Fiabilitate: Fiind independent de orice platforma corporatista și de orice
servicii de cloud, automat Home Assistant devine mult mai fiabil.
Utilizatorul nu risca sa ramana dependent de firma care comercializeaza
produsul.
- Gratuit: Home Assistant este o sursă gratuită / free and open source.

11
II.2.2. Protocolul MQTT

MQTT (Message Queue Telemetry Transport) este un standard de


comunicatii prin internet, inventat și dezvoltat de IBM în 1999, care defineste
un protocol de transport al mesajelor prin internet (prin TCP/IP in general), intre
un server ("message broker") si mai multi clienti, pe modelul "publicare și
abonare" ("publish and subscribe").
Este un protocol de conectivitate "mașină - mașină" (M2M) / "Internet of
Things", conceput a fi simplu și flexibil, cu cerinte minime de resurse, util
pentru conexiunile cu locații la distanță și perfect pentru toate tipurile de
aplicații IoT, fie ca sunt automatizari industriale (IIot) sau automatizări
casnice/rezidentiale/de consum (Consumer Iot).
Este, de asemenea ideal și pentru aplicații mobile, datorită dimensiunilor
mici, consumului redus de energie, pachetelor de date minimizate și distribuției
eficiente a informatiei catre unul sau mai multi receptori.
Datorită suportului pentru comunicatia asincrona, mesajele fiind
decuplate dintre client și server, atat în timp cat și în spațiu, MQTT funcționează
perfect în aplicații în care se stabilesc conexiuni ocazionale cu furnizori de
servicii medicale sau alte servicii în care acțiunea trebuie sa fie independentă de
răspuns.
Modelul descris de standardul MQTT funcționează după următoarea
secvență de acțiuni:
- Un client se conecteaza la server ("broker") si isi publica mesajele cu o
anumita eticheta ("topic");
- Alti clienti se aboneaza ("subscribe") la broker, la anumite topicuri
- Brokerul transmite mai departe mesajele cu un anumit topic clientilor abonati
la acel topic.

Figura 7.

12
Un client poate fi un senzor de temperatura IoT, care are libraria MQTT
inclusa, si care publica valorile masurate, pentru a fi vizualizate de la distanță.
Dacă valorile sunt publicate sub topicul "date_senzor_temperatura",
atunci un alt client - care poate fi o aplicație de procesare și vizualizare - care
s-a abonat la topicul "date_senzor_temperatura", le poate accesa și folosi.
In acelasi timp, consola/pagina de administrare poate publica setarile
pentru pragurile de alarma de temperatura sub topicul "setari_alarme" iar
senzorul IoT abonat la acest topic va primi datele de setare.
MQTT este un protocol binar, în care mesajele sunt organizate în octeți și
folosesc formatul Comanda - Confirmare Comanda.
Structura oricărui pachet de date are formatul: un header fix , un header
de dimensiune variabila + datele care trebuie transmise.
Headerul fix este prezent în toate mesajele și este format dintr-un octet
care reprezinta tipul pachetului ("Control field") si un octet care reprezinta
lungimea pachetului de date.
În funcție de tipul mesajului, headerul variabil și datele pot sa lipseasca.

Figura 8.

13
Urmează o categorisire a mesajelor:

- CONNECT - mesaj trimis catre broker, care cere stabilirea unei conexiuni
de la client la broker
- CONNACK - confirmare trimisa de catre broker, care indica stabilirea
sau nu a conexiunii
- SUBSCRIBE - mesaj trimis catre broker, după ce conexiunea a fost
stabilita, care indica abonarea la un anumit topic. Mesajul va include atat
topicul cat și o indicație despre nivelul de calitate în trimiterea mesajelor
pe topicul respectiv.
- SUBACK - confirmarea abonării, trimisa de broker
- UNSUBSCRIBE - mesaj trimis de client, care indica dezabonarea de la
un anumit topic
- PUBLISH - mesaj prin care un client publica date la broker. Contine
topicul si datele care se publica.

Librăriile de MQTT conțin tot ceea ce este necesar pentru o integrare


rapidă în proiectele Internet of Things, nefiind necesară cunoașterea în detaliu a
protocolului pentru a-l putea folosi.

14
III. Configurarea proiectului

În acest capitol urmează a fi detaliate configurarile fiecărei componente a


proiectului.

III.1. Configurare Home Assistant pentru Raspberry Pi 4

Pentru a pregăti “creierul” proiectului, în speță computerul Raspberry,


trebuie ca mai întâi să încărcăm pe cardul SD sistemul Home Assistant. Pentru a
face acest lucru vom urma pașii de instalare afișați pe site-ul oficial.
Pentru a scrie Home Assistant OS pe cardul SD vom avea nevoie de un
software ajutator numit Balena Etcher (de asemenea open source).

Selectăm opțiunea “Flash from URL”, unde o să scriem URL-ul aferent


sistemului de operare încărcat pe GitHUB. Selectăm target-ul ca fiind cardul
nostru SD, apoi apăsăm “Flash!”.
Programul va scrie sistemul de operare automat pe cardul SD, iar noi
trebuie doar să îl introducem in Raspberry Pi și să pornim SBC-ul. După
pornirea SBC-ului, accesăm pe un dispozitiv diferit, in browser-ul web, adresa
plăcuței urmată de portul utilizat(https://X.X.X.X:8123). O să fim întâmpinați
de un ecran ce ne invită să ne facem un cont local cu ajutorul căruia să
administrăm sistemul. După ce acest pas este complet, setările inițiale au fost

15
făcute. Mai departe, după dorința utilizatorului, SBC-ul poate rămâne conectat
LAN sau se poate stabili o conexiune wireless.
Următorul pas în configurarea SBC-ului îl reprezintă instalarea modulelor
necesare pentru comunicarea MQTT.

Vom intra în zona de “Configuration”, unde vom da click pe opțiunea de


Add-ons.

Selectăm “ADD-ON STORE” și va trebui să instalăm două add-on-uri


necesare. Acestea sunt “Mosquitto broker” și “File editor”. Este posibilă
utilizarea unui add-on care, în cazul nostru, este suplimentar. Acesta se numește

16
ESPhome și face posibilă configurarea/programarea plăcuțelor ESP32/ESP6266
direct din Home Assistant cu ajutorul fișierelor .yaml.
Acum va trebui să creăm un cont pentru utilizarea MQTT:

Contul este creat, cu numele de utilizator mqtt-user, insă trebuie să


configurăm și broker-ul in mod corespunzător pentru a folosi credențialele
setate de noi.

17
Intrăm în meniul de Integrations și selectăm configure, apoi re-configure
MQTT. Vom completa cu datele noastre. Totul a fost configurat și putem trece la
programarea plăcuțelor ESP32.

18
III.2. Configurarea ESP32

Din punct de vedere hardware, schema pentru ESP32 pentru senzorul


DHT va arăta astfel:

De asemenea, schema circuitului pentru ESP32 pentru FAN și releu este


după cum urmează:

19
Pentru ambele plăcuțe vom folosi librăria AsyncMqttClient.h. Ambele
plăcuțe trebuie conectate la rețeaua wifi în cauză și la MQTT, acest lucru
realizându-se cu ajutorul funcțiilor de mai jos:

Datele de conectare au fost declarate in header cu ajutorul “#define”:

20
Se va inițializa mai departe senzorul DHT și variabilele în care se va
stoca temperatura și umiditatea(temp și hum). De asemenea se declara clientul
MQTT și un ticker (acesta e folositor în cazul funcțiilor callback care rulează
periodic):

Declarăm o variabilă pentru a stoca ultima unitate de timp la care s-a


publicat temperatura și o variabilă ce reprezintă intervalul de publicare.

Urmează corpul de setup():

Se inițializează comunicarea serială la o rată baud de 115200. Inițializăm


senzorul DHT. Setăm funcțiile callback, însemnând că acestea vor fi executate
automat când avem nevoie de ele. Spre exemplu, când ESP-ul se conectează la
broker, apelează automat funcția onMqttConnect().

Corpul de loop() se prezintă astfel:

Construim structura necesară execuției programului la un interval de 10


secunde.

21
Timpul trecut devine timpul curent, variabilei hum îi este atribuită noua
citire a datelor cu privire la umiditate, variabile temp îi este atribuită noua citire
a datelor cu privire la temperatură.
Temperatura este publicată cu QoS 1 la esp/dht/temperature.
Umiditatea este publicată cu QoS 1 la esp/dht/humidity.
Programul este similar pentru ESP-ul ce se ocupă cu preluarea de date de
la releu, cu mici diferențe. Acesta se subscrie la topic-ul de temperatură și ia
decizii în funcție de valoarea ei.

Releul este setat pe HIGH sau LOW in funcție de temperatura primită


prin mesajele MQTT. Se va publica mesajul “ON” sau “OFF” pentru starea
releului.
Codul complet pentru ambele ESP-uri va fi atașat la finalul
documentului.

22
III.3. Configurarea finala
Toate componentele sunt gata, mai rămâne de terminat configurarea
Home Assistant pentru a putea “vedea” și “asculta” mesajele trimise de /
schimbate între plăcuțe.
Aici intervine extensia “File editor”:

Accesăm extensia și ne ducem pe path-ul fișierului de configurare al


Home Assistant: /config/configuration.yaml.
Acolo introducem configurația încadrată anterior.
În continuare vom introduce card-uri pe interfața Home Assistant pentru
afișare a temperaturii și umidității, un plot cu evoluția lor și a unui buton pentru
controlul manual al releului.

23
24
IV. Concluzii

Considerăm că, în urma realizării acestui proiect, am ajuns mai aproape


de conceptul cursului “Rețele de calculatoare” și am ajuns la o înțelegere mai
profundă a utilității și importanței rețelelor atât în viața cotidiană, cât și la nivel
industrial.
Rețelele de calculatoare au apărut din necesitatea partajării datelor și a
resurselor hardware existente între mai mulți utilizatori. Interconectarea
calculatoarelor într-o rețea duc la utilizarea mai eficientă a acestora și la un
transfer de date mult mai simplu.
Pe lângă datele “mari”, cum ar fi diferite fișiere, documente, imagini sau
filmări, trebuie apreciate și pachetele mici de date transmise care fac posibil un
nou nivel de confort la nivel personal, dar și o diferență semnificativă in
procesul de producție, aducând o eficiență mai mare în plan industrial.
Standardul de comunicație MQTT, realizat de compania IBM în anul
1999, își dovedește eficiența prin consumul redus de bandă și necesitatea unei
puteri mici de procesare în aplicațiile de automatizare a domiciliului.
După cum am putut observa în prezentul proiect, este posibilă realizarea
unei astfel de aplicații având la îndemână hardware nu foarte pretențios. O
componentă mai sofisticată o constituie SBC-ul Raspberry Pi 4, care poate fi
înlocuit cu ușurință de un calculator vechi care nu mai are utilități în sfera
tehnologică actuală sau chiar rulat într-o mașină virtuală pe calculatorul
personal.
Putem concluziona astfel că acest proiect a lărgit orizontul aplicabilității
cunoștiintelor acumulate în cadrul acestui curs și vom putea utiliza informația
mai departe, în carierele de ingineri automatiști.

25
V. Codul sursă

V.1. ESP cu DHT

#include "DHT.h"
#include <Ticker.h>
#include <AsyncMqttClient.h>

#define WIFI_SSID "DIGI-e3WF"


#define WIFI_PASSWORD "Rwd4C6nN"

// Raspberry Pi Mosquitto MQTT Broker


#define MQTT_HOST IPAddress(192, 168, 100, 143)
#define MQTT_PORT 1883

// Topicurile MQTT pe care se publica informatia


#define MQTT_PUB_TEMP "esp/dht/temperature"
#define MQTT_PUB_HUM "esp/dht/humidity"

// Pin-ul conectat la senzorul DHT


#define DHTPIN 13

#define DHTTYPE DHT22 // DHT 22

// Initializare senzor DHT


DHT dht(DHTPIN, DHTTYPE);

// variabilele care tin citirile senzorului


float temp;
float hum;

AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;

26
unsigned long previousMillis = 0; // Stocheaza ultima unitate de timp la care
s-a publicat temperatura
const long interval = 10000; // Intervalul de publicare

void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {


Serial.println("Connected to Wi-Fi.");
connectToMqtt();
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {


Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach();
wifiReconnectTimer.once(2, connectToWifi);
}

void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}

void onMqttConnect(bool sessionPresent) {


Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {


Serial.println("Disconnected from MQTT.");

if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}

27
}

void onMqttPublish(uint16_t packetId) {


Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}

void setup() {
Serial.begin(115200);
Serial.println();

dht.begin();

wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler =
WiFi.onStationModeDisconnected(onWifiDisconnect);

mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);

connectToWifi();
}

void loop() {
unsigned long currentMillis = millis();
// la fiecare X secunde (interval = 10 seconds)
// se publica un nou mesaj MQTT
if (currentMillis - previousMillis >= interval) {
// Salveaza timpul ultimei citiri
previousMillis = currentMillis;
// Salveaza citirile noi de umiditate
hum = dht.readHumidity();
// Citeste temperatura in Celsius
temp = dht.readTemperature();

28
// Citeste temperatura in farenheit (isFahrenheit = true)
//temp = dht.readTemperature(true);

// Publica mesaj pe topicul esp/dht/temperature


uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true,
String(temp).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ",
MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", temp);

// Publica mesaj pe topicul esp/dht/humidity


uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true,
String(hum).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ",
MQTT_PUB_HUM, packetIdPub2);
Serial.printf("Message: %.2f \n", hum);
}
}

29
V.2. ESP cu releu și ventilator

#include <Ticker.h>
#include <AsyncMqttClient.h>

#define WIFI_SSID "DIGI-e3WF"


#define WIFI_PASSWORD "Rwd4C6nN"

// Raspberri Pi Mosquitto MQTT Broker


#define MQTT_HOST IPAddress(192, 168, 100, 143)
#define MQTT_PORT 1883

// Topicuri pentru publicarea starii releului


#define MQTT_PUB_RELAY "esp/RELAY"

// Pinul digital conectat la releu


#define RELAY 4

// Variabile pentru citiri


float relay;
char relay_message = "OFF";

AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;

unsigned long previousMillis = 0; // Stochează ultima data cand a fost publicat


un mesaj
const long interval = 100; // Interval de publicare

void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

30
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
Serial.println("Connected to Wi-Fi.");
connectToMqtt();
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {


Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while
reconnecting to Wi-Fi
wifiReconnectTimer.once(2, connectToWifi);
}

void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}

void onMqttConnect(bool sessionPresent) {


Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {


Serial.println("Disconnected from MQTT.");

if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}

void onMqttSubscribe(uint16_t packetId, uint8_t qos) {


Serial.println("Subscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
Serial.print(" qos: ");

31
Serial.println(qos);
}

void onMqttUnsubscribe(uint16_t packetId) {


Serial.println("Unsubscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}

void onMqttPublish(uint16_t packetId) {


Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}

void setup() {
Serial.begin(115200);
Serial.println();

wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler =
WiFi.onStationModeDisconnected(onWifiDisconnect);

mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// If your broker requires authentication (username and password), set them
below
//mqttClient.setCredentials("REPlACE_WITH_YOUR_USER",
"REPLACE_WITH_YOUR_PASSWORD");

connectToWifi();
}

32
void loop() {
unsigned long currentMillis = millis();
// La fiecare X secunde (interval = 0.1 seconds)
// Se publica un nou mesaj
uint16_t packetSub1 = mqttClient.subscribe("esp/dht/temperature",1);
if (currentMillis - previousMillis >= interval) {
// Salveaza momentul de timp
previousMillis = currentMillis;
if(packetSub1 >= 28)
{
digitalWrite(relay,HIGH);
relay_message = "ON";
Serial.println("Turning on");
}
else if(packetSub1 <= 27.5 )
{
digitalWrite(relay, LOW);
relay_message = "OFF";
Serial.println("Turning off");
}
}
// Publicare mesaj mqtt pe topicul esp/RELAY
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_RELAY, 1, true,
String(relay_message).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i ",
MQTT_PUB_RELAY, packetIdPub1);
Serial.printf("Message: %d \n", relay);
}

33
VI. Bibliografie

1. Wikipedia: “MQTT” - https://en.wikipedia.org/wiki/MQTT


2. Hardwaregratuit: “MQTT: un protocol de rețea deschis și importanța sa în
IoT” https://www.hwlibre.com/ro/MQTT/
3. Home Assistant: “Installation” https://www.home-assistant.io/installation/
4. Caracteristici DHT22:
https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf
5. Caracteristici ESP32:
https://www.espressif.com/sites/default/files/documentation/esp32_datash
eet_en.pdf
6. Caracteristici Raspberry Pi 4:
https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf
7. Eclipse Mosquitto: https://mosquitto.org/

34

S-ar putea să vă placă și