Proiectul ETH (Environmental Telemetry Hub) reprezinta un sistem IoT (Internet of Things) pentru monitorizarea conditiilor de mediu dintr-o incapere.
Sistemul colecteaza date in timp real despre temperatura, umiditatea aerului si nivelul de lumina ambientala, pe care le trimite atat la un dashboard online precum si pe un ecran local, declansand alarme vizuale si sonore cand parametrii ies din valorile optime.
Scopul principal este mentinerea unui mediu de lucru sau de locuit sanatos si confortabil, sau mentinerea unui mediu pretentios (plante, echipamente electronice, muzee) in parametri optimi, informand utilizatorul cand trebuie sa ia masuri (ex. sa aeriseasca o camera, sa porneasca caldura sau sa adjusteze lumina ambientala).
Proiectul functioneaza pe baza unui microcontroller ESP32 care actioneaza ca unitate centrala, care colecteaza date de la senzori si actioneaza diversi actuatori.
Schema bloc a sistemului:
Desi monitorizarea ambientala este un concept comun, acest proiect se diferentiaza prin rigoarea implementarii tehnice:
| Qty | Price (RON) | Item | Link |
|---|---|---|---|
| 1 | 60.35 | ESP32 WROOM 32D | Link |
| 1 | 2.13 | Modul Led RGB | Link |
| 1 | 2.99 | Buzzer Pasiv | Link |
| 1 | 18.98 | SSD1306 | Link |
| 1 | 6.99 | DHT11 | Link |
| 1 | 1.49 | Fotorezistor (tip 5528) | Link |
| 1 | 0.1 | Rezistor 10k | Link |
| 1 | 13.99 | Breadboard 830 | Link |
| 1 | 9.99 | Set Fire Dupont tata-tata 10cm | Link |
| 1 | 6.99 | Set Fire Dupont tata-mama 20cm | Link |
| 124.00 |
| Componenta | Pin Componenta | Net Label | Pin ESP32 | Functie |
|---|---|---|---|---|
| Ecran OLED | SDA | I2C_SDA | IO21 | Date I2C |
| Ecran OLED | SCL | I2C_SCL | IO22 | Ceas I2C |
| Senzor DHT11 | DATA | DHT_DATA | IO4 | Date digitale Temp/Umiditate |
| LED RGB | R (Rosu) | LED_R | IO25 | Control PWM Rosu |
| LED RGB | G (Verde) | LED_G | IO26 | Control PWM Verde |
| LED RGB | B (Albastru) | LED_B | IO27 | Control PWM Albastru |
| Senzor LDR | Midpoint | LDR | IO34 | Intrare Analogica (ADC) |
| Buzzer | S (Semnal) | BUZZER | IO33 | Iesire PWM |
Firmware-ul va fi dezvoltat in limbajul C, folosind framework-ul oficial ESP-IDF prin PlatformIO, permitand utilizarea conceptelor low-level invatate la laboratoare. Pentru implementarea multitasking-ului (ecran, senzori, networking) este folosit FreeRTOS.
Senzorul DHT11 este un senzor ieftin, consacrat in industrie si de incredere. Acesta foloseste un protocol proprietar single wire pentru transmisia datelor, motiv pentru care am folosit o biblioteca (dht.c) pentru citirea valorilor.
Pentru calibrare am comparat rezultatele obtinute de acesta cu cele ale unui termometru digital, si am constatat ca se incadreaza in parametrii normali de eroare (umiditate ±5%, temperatura ±2℃)
Senzorul fotorezistiv este conectat la o sursa de 3.3V, avand o rezistenta fixa de 10k Ohmi conectata la masa (GND). Acest circuit formeaza un divizor de tensiune, iar nivelul de tensiune este masurat de convertorul analog-digital (ADC) al placii ESP32.
1. Calculul Rezistentei LDR
Rezistenta curenta a senzorului (R_ldr) se calculeaza din valoare bruta ADC astfel:
R_ldr = R_fixed * ((4095 / ADC_Raw) - 1)
2. Calculul Iluminarii (Lux)
Relatia dintre rezistenta LDR si nivelul de lumina este log-liniara. Formula standard pentru conversie este:
Lux = 10 * (R10 / R_ldr) ^ (1 / Gamma)
Deoarece datasheet-ul ofera un interval destul de larg pentru valoare R10 (8k - 20k), am decis sa calibrez valoarea prin comparatie cu un senzor de referinta (al telefonului). Astfel am plasat cei doi senzori cat mai apropiat si paraleli, si am colectat date.
In urma calibrarii am obtinut ca senzorul meu are o valoare R10 de 17k Ohm, iar Gamma este conform specificatiei de 0.7.
Deoarece ADC-ul intern al controller-ului ESP32 se comporta neliniar la capete, am decis sa fac clip la valorile acestuia intr-un interval care sa excluda capetele (<100mV, >3100mV).
Pentru anularea zgomotului implementat luarea mediei a 64 de esantioane luate la interval de 312 microsecunde (20ms in total), intr-o sectiune critica de cod.
Un buzzer pasiv este folosit pentru a semnala situatii de urgenta (temperatura, umiditate iesite din parametrii de siguranta) folosind un semnal PWM.
Un LED RGB este folosit pentru a semnala situatia curenta (parametrii optimi sau nu).
Ecranul OLED de 0.96 inch echipat cu controller-ul SSD1306 este un display ce permite afisarea culorilor albastru si galben pe un fundal negru, cu o rezolutie tipica de 128×64 pixeli.
Comunicarea este realizata folosind biblioteca SSD1306 prin protocolul I2C.
Ecranul este folosit pentru afisarea valorilor in timp real.
Modulul Wi-Fi prezent pe placa de dezvoltare ESP32 este folosit pentru a trimite datele inregistrate prin protocolul mqtt catre un broker Mosquitto, pentru a fi stocate si ulterior afisate de dashboard.
Pentru implementarea protocolului MQTT este folosita biblioteca esp-mqtt.
Arhitectura server-side este bazata pe un singur docker-compose folosind containere preexistente pentru a asigurara o configuratie simpla, intuitiva si modulara.
* Laboratorul 0 - GPIO + Laboratul 3 - Timere. PWM
* Laboratorul 1 - UART
* Laboratorul 2 - Intreruperi
* Laboratorul 4 - ADC
* Laboratorul 6 - I2C
Link Video Demo
Am reusit sa duc la capat proiectul, obtinand ceea ce mi-am propus la inceput: un sistem IoT care monitorizeaza un mediu si alerteaza cand sunt depasite constragerile acestuia.
Pentru imbunatatirea proiectului exista urmatoarele posibilitati: