Progetto con ESP32- Termostato connesso – Conserva il tuo vino alla giusta temperatura!

Per assicurarsi un adeguato invecchiamento del vino è importante conservarlo in un luogo fresco e poco illuminato. Nonostante molti specialisti si trovino in disaccordo su quale sia la temperatura ideale di conservazione del vino, tutti concordano sul fatto che questa debba essere costante. Il termostato presentato in questo articolo non solo vi permette di conservare il vino a una temperatura costante, ma è anche capace di avvisarvi via email in caso di sbalzi di temperatura.

L'idea di questo progetto mi venne durante la realizzazione del termostato Wi-Fi di Elektor [1], progettato con l'ESP8266 di Espressif. Ho provato a convertire il software da quel progetto a uno basato su ESP32, ma ho lasciato perdere per via della mole di lavoro che comportava. Ho quindi deciso di ricominciare da capo prendendo ispirazione da ciò che era già stato fatto (interfaccia web, orologio NTP, controllo temperatura con isteresi programmabile, etc.) migliorando l'interfaccia web e correggendone i difetti (in particolare la User Interface, che non veniva aggiornata in tempo reale). Ho aggiunto anche un piccolo display OLED, molto pratico, che permette di utilizzare il termostato anche se la connessione Wi-Fi viene interrotta (in condizioni di degrado). Questo progetto è facilmente adattabile ad altre applicazioni. Per fare un esempio, ho usato lo stesso hardware per un rilevatore di umidità DHT11 (o BME280) per controllare il sistema di ventilazione meccanico del mio bagno. L'input optoisolato rileva l'accensione della luce (punto luce 12 V) e spegne temporaneamente l'estrattore d'aria, piuttosto rumoroso, mentre si è in bagno.

Il circuito

Lo schema elettrico del termostato con l'ESP32 è rappresentato in Figura 1. Per ottimizzare costo, affidabilità e dimensioni, ho deciso di utilizzare un modulo Wi-Fi Kit 32 di Heltec (Figura 2) come cuore del termostato. Questo modulo basato su ESP32, acquistabile facilmente online, include un display OLED integrato, blu, 0.96", 128x64 pixel, dotato di LED bianco programmabile dall'utente. È collegato a K5 e K6. Da notare che il modulo ESP32 DevKitC (connettori K7 e K8) assieme al display OLED (0.96" 128x64 px) separato, possono essere utilizzati al posto del modulo Wi-Fi Kit 32, essendo entrambi di uso comune (Figura 3). Il display OLED è disponibile in due versioni pinout (VCC o GND) e con i rispettivi connettori (K9 e K10).

Il software è identico per entrambi i moduli.

Alimentazione

L'alimentazione è fornita da un piccolo convertitore 3 W CA/CC, che accetta tensioni di input dai 100 ai 240 VAC e output 5 V fino a 600 mA. LED3 indica l'accensione del dispositivo. Un fusibile protegge il dispositivo e la conduttura mentre un varistore VAR1 ha la funzione di protezione in caso di sovratensione (molto apprezzato dagli standard normativi). I cavi di alimentazione vengono connessi attraverso la morsettiera K1. Il modulo ESP32 è alimentato a 5 V dato che possiede un suo regolatore 3.3 V. Può anche essere alimentato direttamente mediante bus micro-USB.

Relè

Il carico del termostato viene commutato dal relè RE1 che, a sua volta, viene controllato da un piccolo transistor NPN (T1) connesso alla porta IO18. LED2 indica lo stato del relè. Il diodo D1 evita che le altre unità elettroniche commutino la corrente indotta dal relè, mentre il network snubber C4/R9 o C4/R10 (montare solo un resistore) evita che i contatti del relè scarichino scintille di commutazione in caso di carico elevato. Il relè usato può sopportare carichi di 250-VAC fino a 10 A. Entrambi i contatti, NO (normally open) e NC (normally closed), sono reperibili (K2). Da notare che K1 e K2 possono essere combinati in una morsettiera a 5 vie.

Buzzer

Il buzzer con oscillatore integrato (Buz1), guidato da T2 attraverso la porta IO19 è disponibile per feedback acustici. Dato che possiede già il suo oscillatore integrato, dovrete solo collegarlo alla corrente per sentire il "suo bip". Potete utilizzare anche il cosiddetto Buzzer AC ma, in questo caso, dovrete generare il suono attraverso l'ESP32.

LED di stato

LED1, connesso alla porta IO17, è destinato all'indicazione dello stato. Il segnale lampeggia rapidamente se vi è un errore relativo ad una cattiva, o invalida, trasmissione dei dati alla EEPROM, oppure relativo a problemi di comunicazione del sensore DS18B20. Questo tipo di errori blocca il programma che resta interrotto finché gli errori non vengono risolti. Se invece il segnale lampeggia brevemente in modalità operativa significa che è stato effettuato l'accesso al server web integrato.

Controlli esterni

La morsettiera K4 permette la connessione di un interruttore esterno (Manual) tra la porta IO22 e GND. Con il software di default, questo interruttore bypassa il termostato e attiva il relè. Su questo input si può implementare un network RC surge/glitch/noise/debounce (1.5 kHz con i valori dei componenti dati). Quando si usa un interruttore bistabile, C6 può essere omesso e R13 può essere rimpiazzato da una fascetta autobloccante. Un input digitale isolato otticamente IN (optoaccoppiatore IC1) connesso alla porta IO2 è disponibile per estensioni future, ma non viene utilizzato con il software corrente. L'ho utilizzato nell'esempio del mio bagno, menzionato poco fa, per il rilevamento dello stato di accensione della luce (Figura 4).

Connessione del sensore e porta I2C

Il sensore di temperatura DS18B20 a un filo è pensato per essere connesso alla morsettiera K3. Pin 1 va in GND, pin DQ (pin 2) si connette al pin 3 di K3 mentre il pin VDD deve essere connesso a 3V3. Questo significa che i suoi piedini 2 e 3 si incrociano. In ogni caso, per applicazioni tipiche di un termostato, il sensore di temperatura non deve essere montato all'interno della custodia, ricordando che l'aria interna viene surriscaldata dall'alimentatore e dal modulo ESP32, rendendo la regolazione della temperatura praticamente impossibile. R1 è necessaria a DS18B20 per eseguire le operazioni in maniera appropriata. Se si sceglie un sensore di umidità anziché un sensore di temperatura (come per esempio BME280, SHT11 o DHT22) R1 potrebbe non servire. K3 viene collegato in maniera da essere compatibile con gli standard dei produttori bus I2C come Grove (Seeed Studio) e Qwiic (SparkFun). Infatti, K11 è un connettore Grove (passo 2 mm). Sono molte le schede di espansione compatibili con questo connettore, rendendo il circuito del termostato un'eccellente base anche per altre applicazioni.

PCB

Elektor ha sviluppato un circuito stampato che ben si adatta al perimetro di una custodia a basso costo con cover trasparente. I contatti del relè che si connettono al carico possono e devono essere rinforzati tramite saldatura.

Software & Programmazione

Il programma del termostato è scritto in C/C++ nell'IDE di Arduino (io ho utilizzato la versione 1.8.12). È piuttosto vasto - più di 1.500 righe di codice - ma è ampiamente commentabile (anche se in un mix di lingua inglese e francese). È adattabile a un gran numero di necessità e io l'ho utilizzato esclusivamente con librerie open-source gratuite e affidabili. Prima di poter utilizzare l'ESP32 con l'IDE Arduino, bisogna installare il relativo Boards Package. Sono molte le pagine web scritte al fine di spiegare questa procedura. In [2] sono disponibili referenze e ulteriori dettagli, video incluso. Il Boards Package ufficiale di ESP32 include supporto sia per il Wi-Fi Kit 32 di Heltec, sia per il DevKitC ("ESP32 Dev Module"). Non importa quale modulo decidete di usare, potete lasciare tutte le altre impostazioni (velocità della CPU, dimensioni della memoria flash, etc.) ai loro valori di default. Assicuratevi inoltre di selezionare la giusta porta COM. Oltre a installare il Boards Package di ESP32, è necessario installare lo strumento SPIFFS ESP32 Sketch Data Upload. In [2] sono indicati ulteriori dettagli su come farlo.

Scaricate lo sketch del termostato da [3] e decomprimetelo nella cartella sketchbook dell'IDE Arduino. Il file Thermostat.ino, i relativi file di supporto e la cartella dati devono essere contenuti in una cartella denominata Thermostat. La sottocartella data contiene i file HTML e CSS, assieme ai programmi JavaScript di cui il web server ha bisogno. Il file D7MR.woff2 contiene il font a 7 segmenti che utilizzo. Un grazie di cuore al suo creatore. Per vostra convenienza, ho incluso tutte le librerie richieste dal progetto nel download [3]. Devono essere installate correttamente, cioè copiandole nella sottocartella libraries della tua cartella IDE sketchbook. Il percorso di tali cartelle dipende da come avete eseguito il set up dell'IDE di Arduino sul vostro computer. Ulteriori dettagli sull'IDE Arduino in [4]. Quando tutti i software sono stati scaricati e installati, dovete settare alcuni parametri di default del programma al fine di adattare il dispositivo alla casa o all'ambiente applicativo. Questi parametri si trovano all'inizio del programma. Dato che il termostato usa un indirizzo IP statico, dovete definirne uno assieme al gateway e alle altre componenti di rete tipiche.

Configurazione Email

Dato che il termostato può inviare email, è necessario accedere ai dettagli del server email. Per eseguire questo lavoro, vi consiglio di creare un account Gmail. Se lo fate il server email è smtp.gmail.com e la porta da usare è la 465. Per ragioni di sicurezza, è necessario eseguire alcune configurazioni sull'account gmail. Se l'account utilizza l'autenticazione a un fattore (per esempio una sola password necessaria) dovete configurare l'account seguendo le indicazioni nel link [5]. Nel caso in cui si utilizzi l'autenticazione a due fattori (per esempio, password e codice via SMS) seguite le indicazioni in [6]. È giunta l'ora per la fase di compilazione e upload dello sketch, che avviene come per ogni altro sketch Arduino. Non dovreste incontrare particolari difficoltà. Se si verificano dei problemi, si prega di controllare l'installazione. Dopo aver programmato lo sketch, caricate le pagine web e gli altri file data con il comando ESP32 Sketch Data Upload. Lo trovate nel menù strumenti dell'IDE. Il processo trasferisce l’intero contenuto della cartella dati alla memoria flash (SPIFFS) dell'ESP32.

Primo avvio

Quando avviate il device per la prima volta, connettetevi con il suo punto d'accesso Wi-Fi (AP) con SSID "Thermostat ESP32"; non c'è nessuna password.  Aprite un browser e andate sull'IP 192.168.4.1. Dovrebbe apparire l'interfaccia web. Cliccate su Impostazioni (Settings) e poi sul pulsante Default. Questo inizializzerà tutti i parametri - impostazioni di temperatura e del timer incluse - con i valori di default e attiverà l'SSID e la passphrase cosicché il termostato possa connettersi alla vostra rete Wi-Fi. Riavviare il dispositivo per attivare i parametri. Il pulsante Reboot effettua un reset del software del termostato. Notare che in caso l'SSID e/o la password vengano modificate, il sistema si riavvia automaticamente. Riguardo alle impostazioni del timer e della temperatura, non è necessario convalidare un campo dopo averne modificato i valori. Sarà sufficiente spostare il cursore del mouse al di fuori del campo. Vi è inoltre un controllo di conformità inerente alle soglie di temperatura minima e massima. Se il valore massimo è inferiore al valore minimo, i due valori sono invertiti.

Interfaccia utente a colori

Ci si è molto focalizzati sul design dell'interfaccia utente. L'obiettivo era quello di creare un'interfaccia web pulita, ordinata, in grado di visualizzare in maniera corretta i browser più popolari e recenti, inclusi quelli utilizzati da iPhone e Android. L'interfaccia è responsive, non vi è traccia di difetti evidenti e i valori vengono aggiornati ogni secondo. L'interfaccia web utente si compone di 3 pagine: Main (Figura 5), Settings (Figura 6), Timer (Figura 7).

I codici dei colori vengono utilizzati nella pagina principale per indicare lo stato dei parametri. Per esempio, la potenza del segnale Wi-Fi (RSSI) viene visualizzata in verde, arancione o rosso, a seconda della qualità del segnale. Il tempo, ottenuto da un server NTP su Internet, viene visualizzato in rosso nel caso in cui il timer controlli il relè; negli altri casi viene visualizzato in verde. In maniera analoga, la temperatura viene visualizzata in blu chiaro se si trova al di sotto della soglia minima; in verde se si trova tra soglia minima e massima; in rosso se superiore alla soglia massima. Quando inizia a lampeggiare (colore arancione) significa che il sistema ha riscontrato un problema.

Nella pagina principale troverete un piccolo LED a indicare in tempo reale lo stato del relè (verde: off, rosso: on). I fogli di stile (CSS) inerenti a questo display a colori hanno richiesto molto lavoro per essere realizzati. Il display OLED indica anche lo stato del sistema. Dato che è stato dimostrato che tenere questo tipo di display costantemente acceso tende a causare un degrado rapido, è stata aggiunta l'opzione screen saver. Premendo un pulsante connesso tra GPIO05 (K11, pin 4) e GND (K11, pin 1) si potrà accendere lo schermo per un paio di minuti. Questa funzione può essere attivata e disattivata nella pagina delle Impostazioni (Settings).

Pagina del Timer

I momenti di commutazione (on e off) e la corrispondente casella di attivazione devono essere salvati con il pulsante Save. Cliccare Save vi permette di salvare l'intera pagina. La casella di spunta Timer Disabled non necessita della convalida tramite il pulsante Save. Quando il timer è disabilitato, il termostato controlla la temperatura costantemente.

Modalità Debug

Dopo aver acceso l'alimentazione del sistema, monitorando la porta seriale tramite l'interfaccia USB integrata (115.200 baud) si può osservare il processo di inizializzazione del termostato. Ciò può rivelarsi estremamente utile in caso si debbano identificare eventuali problematiche inerenti alla connessione Wi-Fi.

Un sistema affidabile

Il termostato descritto in questo articolo è in funzione nella mia cantina da più di un anno e fino ad ora non ho riscontrato grosse problematiche. Il sistema è affidabile e la capacità di regolazione della temperatura è molto buona (Figura 8). Ho potuto testare l'interfaccia web sulla maggior parte dei browser (Chrome, Edge, Safari, etc.), sull'iPhone e su alcuni telefoni Android e non ho mai riscontrato problemi di compatibilità. Vorrei ringraziare Stephane Calderoni (PhD, Computer Science) che vive a Réunion (un'isola nell'Africa orientale) e che mi ha aiutato molto nel processo di sviluppo dell'interfaccia HTML e con JavaScript. Ho approfittato della quarantena del marzo 2020 in Francia per espandere la mia conoscenza su questi argomenti, con cui non avevo grande dimestichezza.

Specifiche Tecniche:

  • Sensore di temperatura DS18B20, precisione ±0.5°C, che viene arrotondata al più vicino 0.1°C
  • Relè con contatti snubber per commutare carichi CA fino a 2200 W
  • Alimentazione elettrica 100-240 VAC
  • Estensione bus I2C compatibile con Grove e Qwiic
  • Il PCB supporta Wi-Fi kit 32 di Heltec con display OLED integrato oppure ESP32 DevKitC più display OLED esterno
  • Buzzer per comunicazioni di allarme
  • Interruttore di input esterno
  • Input optoisolato
  • Tre soglie programmabili: minima, massima, soglia di allarme
  • Invio email di allarme
  • Cronometraggio su base NTP
  • Timer giornaliero
  • Capacità di controllo di sistemi di raffreddamento o riscaldamento

LISTA DEI COMPONENTI

La BOM (Bill Of Materials) è l'elenco tecnicamente esaustivo di parti e altri elementi hardware utilizzati per produrre il prototipo funzionante e testato di qualsiasi progetto Elektor Labs. Il file BOM contiene informazioni più approfondite rispetto all'elenco dei componenti pubblicato per lo stesso progetto in Elektor Magazine. Se richiesto, la distinta base viene aggiornata direttamente dai nostri tecnici di laboratorio. Come lettore, puoi scaricare l'elenco qui. Vuoi saperne di più sulla nostra lista BOM? Leggi l'articolo dell'elenco BOM per ulteriori informazioni.

Resistori (5%, 0.25W)
R9,R10 = 100 Ω, 1 W (see text)
R4,R5,R6,R8,R12,R13 = 1 k
R1,R11 = 4.7 k
R2,R3,R7,R14 = 10 k

Condensatori
C2,C3,C5,C6 = 100 n, 2.5 or 5 mm pitch
C4 = 100 n, X2, 15 mm pitch
C1 = 220 µ, 16 V, 3.5 mm pitch

Semiconduttori
D1 = 1N4148
LED1,LED2 = LED, red, 3 mm
LED3, LED4 = LED, green, 3 mm
IC1 = FOD814, DIP4
T1,T2 = BC337

Varie
BUZ1 = Buzzer with oscillator, 6.5 or 7.6 mm
pitch
F1 = Fuse holder, 5x20 mm + fuse 250 V,
100 mA, slow
K1 = 2-way terminal block, 5 mm pitch
K2 = 3-way terminal block, 5 mm pitch
K3,K4 = 4-way terminal block, 3.5 mm pitch
K5,K6 = 18-way pin socket, 0.1“ pitch
(MOD1 only)
K7,K8 = 19-way pin socket, 0.1“ pitch
(MOD2 only)
K9,K10 = 4-way pin socket, 0.1“ pitch, 20 mm
height (MOD2 only)
K11 = 4-pin header, 2 mm pitch (Grove)
REL1 = Relay, 10 A, SPDT, 5VDC
VAR1 = Varistor 350 V

AC/DC1 = 5 V, 3 W, AC-DC converter
(e.g. Multicomp MP-LDE03-20B05)
BOX1 = Enclosure, IP65, transparent cover
(Multicomp MC001106)
MOD1 = Heltec WiFi Kit 32
or
MOD2 = ESP32 DevKitC + OLED display, I2C,
128x64 pixels

Riferimenti

[1] R. Aarts & C. Valens, “Wi-Fi Desktop Thermostat,” Elektor, Jan/Feb 2018. : http://www.elektormagazine.com/160269
[2] ESP32 – Getting Started: https://www.elektormagazine.com/labs/1874
[3] ESP32 Thermostat at Elektor Labs: https://www.elektormagazine.com/labs/4216
[4] Arduino FAQ: https://www.elektormagazine.com/labs/1876
[5] Gmail one-factor authentication: https://myaccount.google.com/lesssecureapps
[6] Gmail two-factor authentication: https://security.google.com/settings/security/apppassword

PRODOTTI CORRELATI

> ESP32 DevKitC (SKU 18701)
www.elektor.com/esp32-devkitc-32d
> 0.96“ 128×64 I2C OLED display
(SKU 18747)
www.elektor.com/blue-0-96-oleddisplay-i2c-4-pin
> Elektor ESP32 Smart Kit Bundle
(SKU 19033)
www.elektor.com/19033

Contributori

Idea, design & text: Yves Bourdon
PCB design & editing: Clemens Valens
Layout: Giel Dols, Harmen Heida

Domande o Commenti?

Avete delle domande tecniche o dei commenti su questo articolo? Potete inviare un'Email all'Editor all'indirizzo di posta elettronica: clemens.valens@elektor.com.

WEB LINK

ARTICOLO ORIGINALE IN INGLESE AL LINK: ESP32-Connected Thermostat | Elektor Magazine

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend