
Un dispositivo in grado di misurare gli assorbimenti di potenza di una qualunque apparecchiatura collegata alla rete elettrica rappresenta senza ombra di dubbio un’applicazione utile e vantaggiosa. Se da un lato è infatti possibile monitorare gli assorbimenti dei carichi più critici (come gli elettrodomestici), dall’altro le misure ottenute possono essere confrontate con i valori dichiarati dal produttore, determinando quindi i consumi effettivi e reali. Scopriamo in questo articolo come realizzare un energy meter utilizzando la scheda ESPertino, che ci permetterà di acquisire, memorizzare, e visualizzare le principali grandezze legate all’assorbimento di potenza
Introduzione
La progettazione di un energy meter (o misuratore di energia, in italiano) può sembrare a prima vista un compito piuttosto arduo, che richiede delle approfondite conoscenze in campo elettrico. In realtà, come vedremo nell’articolo, seguendo un approccio al problema di tipo graduale, e soprattutto analizzando ogni singolo passo, chiunque abbia delle conoscenze basilari di elettronica ed elettrotecnica può cimentarsi nella realizzazione di questo progetto.
Lo scopo del progetto è quello di realizzare un dispositivo che, in modo non invasivo e tramite un opportuno isolamento dalla rete elettrica, sia in grado di misurare il valore efficace (detto anche valore RMS, acronimo di Root Mean Squared) sia della corrente che della tensione di rete, derivando poi da questi altre misure quali: potenza apparente, potenza reale, e fattore di potenza. I valori numerici di queste grandezze verranno visualizzati in tempo reale su un comodo display LCD, e periodicamente memorizzate su una scheda di memoria SD per una successiva analisi e interpretazione dei dati storici.
Nel corso degli ultimi anni abbiamo assistito a una proliferazione dei progetti Do-It-Yourself (DIY), con una comunità di maker in continua crescita grazie soprattutto al successo ottenuto dalla piattaforma di prototipazione rapida Arduino. Proprio per Arduino è stata sviluppata una libreria (EmonLib) che si occupa di eseguire tutti i calcoli e le trasformazioni richieste da un misuratore di energia. Il progetto proposto in questo articolo segue un approccio analogo, questa volta basato sulla scheda ESPertino (visibile in Figura 1), espressamente progettata per le applicazioni IoT e quindi anche i sistemi di misura. Utilizzeremo una versione della libreria EmonLib leggermente modificata e adattata per riflettere l’architettura hardware di ESPertino, che sappiamo non utilizza un microprocessore AVR come la maggior parte delle schede Arduino, ma bensì un Tensilica LX6 dual core. Oltre alla libreria, il software è composto da uno sketch che potrà essere compilato e scaricato sulla scheda utilizzando l’ambiente di sviluppo Arduino IDE. Un approccio alla progettazione molto semplice e intuitivo, quindi, nel pieno rispetto della filosofia Arduino ed open source.

Figura 1: la board di prototipazione rapida ESPertino, particolarmente indicata per le applicazioni IoT
Nel prossimo paragrafo esamineremo più in dettaglio il progetto, analizzandone il principio di funzionamento e le principali componenti hardware. Nei paragrafi successivi vedremo invece come funzionano, come vanno collegati, e come calibrare i sensori utilizzati per acquisire i valori di corrente e tensione alternata. Seguiranno l’analisi della componente software del progetto (libreria EmonLib rivista, e sketch Arduino-like). Chiuderanno l’articolo alcune considerazioni riassuntive, completate dal suggerimento per possibili espansioni ed ampliamenti futuri del progetto originale.
Il progetto
Il modo più semplice ed immediato di presentare il progetto è attraverso il suo schema a blocchi, che possiamo osservare in Figura 2.
Il sistema è composto dalle seguenti cinque componenti:
- la board ESPertino, equipaggiata con il modulo ESP-Wroom-32 di Espressif Systems;
- un sensore (trasformatore di tensione) in grado di misurare la tensione alternata di rete. Prima di presentare questo segnale in ingresso all’ADC occorre applicare ad esso un opportuno condizionamento del segnale (signal conditioning) in modo tale da renderlo compatibile con le caratteristiche degli ingressi del convertitore analogico-digitale;
- un sensore (trasformatore di corrente) in grado di misurare la corrente alternata di rete. Valgono anche in questo caso le stesse considerazioni sul condizionamento del segnale fatte a proposito del trasformatore di tensione;
- un modulino con scheda di memoria SD, collegata ad ESPertino tramite interfaccia SPI, utilizzata per memorizzare i dati storici relativi agli assorbimenti di tensione, corrente, e potenza;
- un comune display LCD, 2 righe x 16 caratteri, utilizzato per la visualizzazione dei valori istantanei delle misure di tensione, corrente, e potenza reale. Il display è collegato alla scheda ESPertino tramite interfaccia I2C (risparmiando quindi qualche segnale rispetto al collegamento classico parallelo).
Il funzionamento del dispositivo è molto semplice: i sensori acquisiscono dalla rete, su una finestra temporale opportunamente definita, i valori di corrente e tensione alternate, i quali vengono convertiti in valori numerici dagli ADC del modulo ESP32 (o meglio, da due distinti canali appartenenti all’ADC1). Il software provvede a gestire la logica di controllo dell’acquisizione, calcolare le grandezze richieste (VRMS, IRMS, potenza reale, potenza apparente, e fattore di potenza), e gestire sia la visualizzazione su display LCD che l’aggiornamento degli storici sulla scheda SD (quest’ultima operazione viene eseguita ogni 60 secondi). Vediamo ora di esaminare in dettaglio la parte hardware del progetto, in particolare i due sensori e la modalità di interfacciamento con la scheda ESPertino delle cinque componenti hardware elencate in precedenza.
ADC e tensione di riferimento
Il modulo ESP32 include due ADC di tipo SAR (Successive Approximation Register) a 12 bit, ciascuno composto da 9 canali. Attualmente il framework di sviluppo rilasciato da Espressif supporta solo l’ADC1, i cui canali sono collegati ai GPIO 32-39. Come indicato nello schema a blocchi di Figura 2, abbiamo scelto il GPIO 36 per il sensore di corrente, e il GPIO 39 per il sensore di tensione. Il valore di default della tensione di fondo scala dell’ADC è pari a 1,1 V, dove per tensione di fondo scala si intende la tensione corrispondente alla massima lettura dell’ADC (nel nostro caso: 212=4096). Se si vogliono leggere valori di tensione superiori (fino al valore massimo di 3,3 V sopportato dai pin analogici), occorre impostare l’attenuazione del pin secondo la seguente tabella:
Livello di attenuazione | Tensione di fondo scala dell’ADC |
0 dB | 1,1 V |
2,5 dB | 1,5 V |
6 dB | 2,2 V |
11 dB | 3,9 V |
Nel software dovremo quindi impostare l’attenuazione dei GPIO 36 e 39 a 11 dB. Si noti come, in tale caso, la tensione di fondo scala dell’ADC venga limitata dal valore presente sulla linea di alimentazione VDD_A (3,3 V), e pertanto il valore di 3,9 V non verrà mai raggiunto. A livello hardware sarà comunque richiesta la progettazione di un opportuno circuito di condizionamento, in modo tale che il segnale in ingresso all’ADC abbia un’ampiezza picco-picco inferiore a 3,3 V.
Il trasformatore di tensione
Per eseguire il calcolo della potenza reale, apparente, e del fattore di potenza, occorre ricevere in ingresso la tensione di rete, opportunamente condizionata a livello elettrico. Il modo più semplice e sicuro per ottenere questa misura è quello di utilizzare un adattatore di rete AC/AC, analogo a quello mostrato in Figura 3. Al suo interno è presente un trasformatore che garantisce l’isolamento dalla rete elettrica, rendendo disponibile sull’avvolgimento secondario (collegato allo spinotto o jack di uscita) una tensione alternata di ampiezza ridotta rispetto ai circa 230 VAC della rete elettrica. I parametri che ci interessa sapere di questo adattatore sono due: tensione di uscita nominale e tensione di uscita a vuoto. La tensione nominale è riferita alla condizione tipica di utilizzo dell’adattatore, quindi con carico collegato. Senza alcun carico (come avviene nel nostro caso, dove siamo interessati soltanto al monitoraggio) la tensione è in genere superiore di circa il 20-25% rispetto al valore nominale.
Circuito di condizionamento
L’obiettivo di questo circuito è fare in modo che l’uscita dell’adattatore (che utilizzeremo per risalire al valore della tensione di rete) si adatti elettricamente all’ingresso dell’ADC: sarà quindi necessario convertirla in una tensione positiva compresa tra 0 V e 3,3 V (tensione di riferimento dell’ADC). Prendiamo come esempio un tipico adattatore con uscita pari a 9 VRMS, e tensione a vuoto di 11,2 VRMS. La tensione di picco si ottiene moltiplicando quest’ultima per la radice di 2, ottenendo un valore di 15,8 V. Moltiplicando quest’ultima per 2, si ottiene la tensione picco-picco, pari a 31,6 V. Il circuito, visibile in Figura 4, dovrà pertanto scalare la tensione dell’adattatore, e aggiungere un opportuno offset in modo tale da eliminare la componente negativa. Lo scalamento si ottiene tramite un partitore di tensione (R1/R2), mentre l’offset viene aggiunto utilizzando un altro partitore di tensione (R3/R4) applicato alla tensione di alimentazione di 3,3 V. Il condensatore C1 svolge soltanto una funzione di disaccoppiamento, creando un percorso verso massa di bassa impedenza per il segnale alternato. R1 e R2 devono essere scelte in modo tale che la tensione in uscita dal partitore sia di circa 1 V. Il segnale in ingresso all’ADC avrà ora un’ampiezza compresa tra circa 0,2 V e 3,09 V, quindi all’interno del range ammissibile.
Calibrazione
Il software, di cui parleremo in seguito, avrà il compito di eseguire la lettura dall’ADC, e da questa risalire al valore della tensione di rete. Per fare ciò, il programma dovrà rimuovere l’offset di tensione introdotto dal circuito di condizionamento, e applicare un opportuno fattore moltiplicativo (il fattore di calibrazione), espresso dalla seguente formula:
VCAL = VRETE / (RPARTITORE * (VADATTATORE * RADATTATORE)
dove:
VRETE = 230 V è il valore nominale della tensione di rete
RPARTITORE = 1/11 è il rapporto del partitore di tensione formato da R1 e R2
VADATTATORE = 9 V è la tensione di uscita nominale dell’adattatore
RADATTATORE = 1 + 20% = 1,20 - è la costante che moltiplicata per la tensione nominale dell’adattatore determina la tensione a vuoto dello stesso (supponendo una variazione del 20%).
[...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2620 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

La scheda ESPertino sta coinvolgendo tutti, con tanti progetti. Molto interessante questo energy meter! La misura di grandezze fisiche con l’implementazione del Bluetooth potrebbe rappresentare una vera e propria applicazione IoT.
Ciao Stefano, complimenti per l’articolo! Ho un’idea simile alla tua (anche se strizza di più l’occhio all’IoT), credo che prenderò qualche spunto per realizzarla! Ho una domanda: il campionamento delle misure di tensione e corrente da parte dell’ADC avviene in simultanea? Mi spiego: per poter calcolare dei valori efficaci veritieri di tensione e corrente, queste due grandezze devono essere campionate nel medesimo istante (con campionamento simultaneo da parte dell’ADC), altrimenti si commetterebbe un (seppur minimo) errore di fase. Il tuo progetto tiene conto di questa cosa? Grazie e ancora complimenti 🙂
Ciao Davide,
ti ringrazao anzitutto per i complimenti. Per quanto riguarda la tua domanda,la risposta è no: le misure di tensione e corrente acquisite dall’ADC non avvengono simultaneamente, ma in stretta sequenza (l’acquisizione avviene all’interno della funzione calcVI() della libreria EmonLib).
Tenendo conto della velocità del microcontrollore, dovrebbe comunque trattarsi di un tempo minimo.
Grazie e Saluti
Ciao Stefano.
Dato che i pins proposti come ingressi analogici per tensione e corrente ( tu dici GPIO39 e GPIO36) non sono accessibili su ESPertino, come hai fatto a misurare queste grandezze ?
Quindi se volessi utilizzare altri due pin accessibili (es: GPIO35 e GPIO34) come devo alterare il codice di emonlib.h ed è sufficiente fare questa modifica ?
Grazie e saluti
Salve Mario, probabilmente era stata usata una scheda prototipale, con qualche differenza rispetto a ESPertino. Comunque è sufficiente utilizzare 2 canali ADC, come quelli da te citati, che fanno capo ai gpio 34 e 35, disponibili sul connettore della scheda. La libreria non necessita di modifica, mentre occorre modificare l’inizializzazione nella funzione setup() dello sketch, sostituendo 36/39 con 34/35.
Salve Stefano.
Grazie per la pronta risposta. Perfetto; non avevo visto che i pins ADC utilizzati per V ed I erano definiti nel setup().
Così posso divertirmi e proseguire rapidamente con la realizzazione del misuratore.
Buon fine settimana
Articolo molto interessante che dimostra come ESPertino si possa utilizzare alla grande anche per applicazioni di domotica o domestiche in generale.
Ho potuto ammirare ila presentazione del prototipo di questo fantastico progetto a Milano all’hackatlon festival
.era da tempo che ci pensavo anche io ed un mio collega al quale girerò di sicuro l’articolo …e sono proprio contento di averlo visto svilupparsi.
Devo assolutamente provare a realizzarlo io ….ed un mio team (se riesco a ricostruirlo!) Vorrei tanto vederlo funzionare.
Sarebbe interessante implementarlo in un espertino che riesca a fare contemporaneamente da access point e web server per pubblicare su pagina web all’interno della rete wifi creata i valori letti. Esagerando (ma non troppo 😉 ) un allarme sonoro quando si supera una certa potenza (tipicamente la massima sopportatata dal contatore casalingo prima che scatti dopo 2 minuti) in modo da poter alleggerire (spegnere) i carichi in più