CRAIOVA
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
I.2. Motivatia
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
Figura 1.
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.
4
II.1.2. Placa de dezvoltare ESP32
Figura 2.
Specificatiile tehnice:
5
- eFuse: 1 Kibit
- Embedded Flash: 4 MiB
- Interfata: DMA, ADC, DAC, I2C, UART, CAN, SPI, I2S, RMII, PWM
s.a.m.d.
6
II.1.3. Senzori si alte componente
Senzorul DHT22
Figura 3.
Caracteristici tehnice:
7
- Acuratețe: ± 0.5 ℃
Releul FL-3FF-S-Z
Figura 4.
Caracteristici tehnice:
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
Figura 6.
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:
11
II.2.2. Protocolul MQTT
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.
14
III. Configurarea proiectului
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.
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:
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
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:
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):
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.
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”:
23
24
IV. Concluzii
25
V. Codul sursă
#include "DHT.h"
#include <Ticker.h>
#include <AsyncMqttClient.h>
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 connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
27
}
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);
29
V.2. ESP cu releu și ventilator
#include <Ticker.h>
#include <AsyncMqttClient.h>
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
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 connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
31
Serial.println(qos);
}
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
34