Programmiamo una ESP32 con ESPHome, adoperando un sensore di tensione per misurare l’alimentazione o le batterie dei dispositivi, integrando tutto in Home Assistant
Integrare il monitoraggio della tensione in un sistema domotico è molto utile, specialmente quando si vogliono tenere sotto controllo batterie, pannelli solari o alimentazioni esterne. L’ESP32, programmato con ESPHome, permette di leggere facilmente valori analogici e inviarli in tempo reale a Home Assistant, dove diventano sensori consultabili in dashboard, automazioni e notifiche. Poiché gli ingressi dell’ESP32 lavorano a 3,3 V, non è possibile collegare direttamente tensioni più alte: sarebbe pericoloso per il microcontrollore. Per questo motivo si utilizza un piccolo modulo basato su partitore resistivo, capace di ridurre la tensione di ingresso di un fattore cinque e renderla sicura per l’ESP32. In questo modo possiamo misurare fino a 16,5 V reali, trasformandoli in dati leggibili e integrati nella nostra piattaforma domotica.
- Acquistalo su Amazon: https://amzn.to/46rYOOx
Specifiche tecniche
Questo modulo utilizza un partitore resistivo progettato per ridurre la tensione di ingresso di un fattore cinque. Ciò significa che se al terminale si applica una tensione di 25 V, in uscita verso il microcontrollore ne arriveranno soltanto 5 V, rientrando così nei limiti accettabili da Arduino. Nel caso di un sistema basato su ESP32 o altri dispositivi a 3,3 V, il limite massimo si riduce proporzionalmente a 16,5 V.

Il modulo è compatibile con gli ingressi analogici e sfrutta la risoluzione nativa dell’ADC del microcontrollore. Su Arduino, che dispone di un convertitore a 10 bit, la risoluzione è pari a 0,00489 V (calcolata come 5 V diviso 1023).

Poiché il modulo riduce la tensione di un fattore cinque, la risoluzione effettiva in ingresso è di circa 0,02445 V, ovvero la minima variazione di tensione che il sistema è in grado di distinguere. L’intervallo di misura copre quindi da pochi centesimi di volt fino a 25 V in ambiente a 5 V, oppure fino a 16,5 V se si utilizza un sistema a 3,3 V.

Dal punto di vista fisico, il sensore è un piccolo PCB con tre pin di uscita (VCC, GND, e segnale S) e due morsetti a vite per l’ingresso in corrente continua. I resistori (solitamente da 30 kΩ e 7,5 kΩ) sono saldati direttamente sulla scheda e non ci sono componenti attivi: si tratta quindi di un dispositivo totalmente passivo. Questo lo rende robusto, economico e molto affidabile, ma significa anche che la precisione dipende dalla tolleranza delle resistenze usate. Nei moduli commerciali si trovano spesso resistenze con tolleranza del 1% o 5%, quindi se serve un monitoraggio molto preciso può essere utile calibrare via software i valori letti.

Collegamenti
Il modulo è estremamente semplice da collegare. L’uscita del modulo presenta tre pin: il primo va collegato alla tensione di riferimento del microcontrollore (5 V su Arduino, 3,3 V su ESP32), il secondo a massa, e il terzo al pin analogico scelto per l’acquisizione. Una volta effettuati i collegamenti, il modulo ridurrà automaticamente la tensione letta e fornirà al microcontrollore un segnale sicuro, proporzionale a quello reale.

L’ingresso in corrente continua dispone di due terminali: il positivo va connesso al punto del circuito di cui si desidera misurare la tensione, mentre il negativo va a massa. Nel nostro esempio, andremo a collegalo ad un alimentatore da banco regolato a 5V.

Codice
Andiamo a creare un nuovo device su ESPHome e chiamiamolo Tensione. Saltiamo per il momento la connessione e selezioniamo la scheda che dobbiamo programmare (ESP32).

Una volta creato, clicchiamo su EDIT per modificare il codice.

Questo è il codice per configurare una ESP32 per leggere la tensione e inviarli a Home Assistant tramite ESPHome. Il dispositivo sarà accessibile in rete tramite Wi-Fi e potrà essere aggiornato via OTA (Over-The-Air) senza bisogno di connessione fisica. Potete scaricarlo a questo LINK.
All’inizio, il codice definisce il nome del dispositivo, sia quello tecnico (“tensione”) che quello più leggibile per Home Assistant (“Tensione”).
esphome:
name: tensione
friendly_name: Tensione
Poi si specifica che il microcontrollore utilizzato è un ESP32 e che il firmware verrà compilato usando il framework Arduino, che è più semplice e supportato rispetto ad altre alternative come ESP-IDF.
esp32:
board: esp32dev
framework:
type: arduino
Il codice attiva il logger, che serve a registrare gli eventi e inviare messaggi di debug. Inoltre, viene attivata l’API di ESPHome, che permette a Home Assistant di comunicare con il dispositivo in modo sicuro grazie a una chiave di crittografia.
logger:
api:
encryption:
key: "lG2fhkorpoczyIPwitwJ5IZUhyqqUrV/mN/wNcloyJs="/
Per evitare di dover collegare il dispositivo fisicamente ogni volta che si vuole aggiornare il firmware, viene attivata la modalità OTA (Over-The-Air), con una password di sicurezza. Inoltre, è presente la funzione captive portal, che permette di riconfigurare il Wi-Fi direttamente da un browser in caso di problemi di connessione.
ota:
- platform: esphome
password: "43f01c7b641c48280ae959bdd2de34e9"
captive_portal:/
Per collegarsi alla rete, il codice usa le credenziali Wi-Fi salvate nei secrets di ESPHome (file separato non visibile nel codice). Se la connessione fallisce, il dispositivo crea un hotspot Wi-Fi di emergenza (“Pulsante Fallback Hotspot”) con una password predefinita, in modo che sia possibile riconfigurarlo.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Tensione Fallback Hotspot"
password: "nHucmfVko2Ii"
La configurazione definisce un sensore di tipo ADC, cioè un ingresso analogico, collegato al pin GPIO34 dell’ESP32. Il valore letto viene chiamato “Tensione Ingresso” e identificato internamente con l’id input_voltage, così che possa essere riutilizzato in altre parti della configurazione. L’unità di misura è impostata in Volt e, per rendere più chiara la visualizzazione in Home Assistant, viene associata un’icona a forma di fulmine.
sensor:
- platform: adc
pin: GPIO34
name: "Tensione Ingresso"
id: input_voltage
unit_of_measurement: "V"
icon: "mdi:flash"
Un aspetto importante è il parametro di attenuazione: con l’impostazione a 11 dB l’ESP32 è in grado di leggere tensioni fino a circa 3,3 V sul pin. Questo significa che se si vogliono misurare tensioni più alte, ad esempio quelle di una batteria da 12 V, bisogna prima ridurle tramite un partitore resistivo. Per questo nel codice è stato inserito anche un filtro di moltiplicazione: ogni valore letto dall’ADC viene moltiplicato per 5, in modo da compensare il rapporto del partitore resistivo.
attenuation: 11db
Così, se il pin riceve 2,4 V, il sistema interpreta correttamente che la tensione reale all’ingresso era 12 V. Il sensore viene aggiornato ogni secondo e il valore mostrato ha due decimali, per dare una lettura abbastanza precisa senza esagerare con la sensibilità. In sostanza, questo codice permette di trasformare l’ingresso analogico dell’ESP32 in un voltmetro digitale collegato a Home Assistant, tenendo conto della necessaria protezione e scalatura della tensione in ingresso.
update_interval: 1s
accuracy_decimals: 2
filters:
- multiply: 5.0
Salvate e verificate con Validate se il codice è stato scritto correttamente.

Collegate la ESP32 al computer tramite cavo USB, e cliccate su Install.

Conclusa l’installazione, integriamo il device su Home Assistant. Dovrebbe essere arrivata una notifica sulla plancia. In ogni caso, per integrarlo andate su Impostazioni -> Dispositivi e servizi e apparirà il dispositivo Tensione da integrare.

Autorizzate la configurazione e collegate una batteria o un alimentatore da banco al sensore per misurarne la tensione. Se tutto è stato configurato e collegato correttamente, appariranno le letture di tensione.
