Se stai realizzando un sistema di monitoraggio energetico per Home Assistant o ESPHome, una soluzione economica e precisa consiste nell’utilizzare un ESP32 insieme a un convertitore ADC ADS1115 e un sensore di corrente Hall QNHCK2-16.
In questo articolo vedremo passo passo:
- Come funziona il sensore Hall
- Come collegare ESP32, ADS1115 e QNHCK2-16
- Come leggere la corrente di carica e scarica della batteria
- Il codice ESPHome completo e funzionante
- Come calibrare il sensore
Materiale utilizzato
ESP32
Scheda WiFi utilizzata per ESPHome e Home Assistant.
ADS1115
Convertitore ADC a 16 bit.
Vantaggi:
- Risoluzione molto superiore all’ADC interno dell’ESP32
- Comunicazione I²C
- Elevata precisione
- 4 ingressi analogici disponibili
Sensore Hall QNHCK2-16
Modello acquistato:
QNHCK2-16
100A
2.5V ±0.625V
Alimentazione 5V
Corrente nominale: ±100A
Tensione a 0A: 2.5V
Tensione a +100A: 3.125V
Tensione a -100A: 1.875V
Sensibilità: 6.25mV/A
Come funziona il sensore Hall
Il sensore non richiede il contatto elettrico diretto con il cavo.
È sufficiente far passare il cavo all’interno della finestra del sensore.
Esempio:
Batteria (+)
│
│
▼
┌───────────┐
│ QNHCK2-16 │
└───────────┘
│
│
▼
Inverter
Il sensore genera una tensione proporzionale alla corrente.
Per il modello da 100A:
| Corrente | Tensione |
|---|---|
| -100A | 1.875V |
| -50A | 2.1875V |
| 0A | 2.500V |
| +50A | 2.8125V |
| +100A | 3.125V |
Piedinatura del sensore
Dal corpo del sensore escono 4 fili.
| Colore | Funzione |
|---|---|
| Rosso | +5V |
| Nero | GND |
| Verde | VOUT |
| Blu | VREF |
Utilizzeremo solamente:
Rosso
Nero
Verde
Collegamenti ESP32 ↔ ADS1115
| ADS1115 | ESP32 |
|---|---|
| VDD | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |
Collegamenti Sensore ↔ ADS1115
| Sensore Hall | ADS1115 |
|---|---|
| VOUT (verde) | A0 |
| GND (nero) | GND |
Alimentazione Sensore
| Sensore Hall | ESP32 |
|---|---|
| Rosso | 5V |
| Nero | GND |
Schema completo
ESP32
┌─────────────┐
│ │
│ GPIO21 SDA ├──────────── SDA ADS1115
│ GPIO22 SCL ├──────────── SCL ADS1115
│ 3.3V ├──────────── VDD ADS1115
│ GND ├──────────── GND ADS1115
│ GND ├──────────── GND Sensore
│ 5V ├──────────── +5V Sensore
│ │
└─────────────┘
ADS1115
┌─────────────┐
│ │
│ A0 ├────────── VOUT Sensore
│ │
└─────────────┘
QNHCK2-16
┌────────────┐
│ Rosso +5V │
│ Nero GND │
│ Verde VOUT │
└────────────┘
Formula di conversione
Per il modello acquistato:
0A = 2.5V
Sensibilità:
0.625V / 100A
= 0.00625V/A
Formula:
Corrente = (Tensione - 2.5) / 0.00625
Codice ESPHome completo
# Board: ESP32 DevKit V1 (Espressif)
# Definition: definitions/boards/esp32-devkit-v1/manifest.yaml
esphome:
name: esp32-shunt
friendly_name: ESP32 shunt
esp32:
variant: esp32
flash_size: 4MB
framework:
type: esp-idf
logger:
api:
encryption:
key: "6nWLRhmkOvM2QjtcRAAtkBXzZ1XVOB+e+8XU8HcuLV8="
ota:
- platform: esphome
wifi:
ssid: xx
password: xx
ap:
ssid: ESP32 shunt Fallback Hotspot
password: "xxxx"
i2c:
sda: GPIO21
scl: GPIO22
scan: true
ads1115:
- address: 0x48
sensor:
- platform: ads1115
multiplexer: A0_GND
gain: 4.096
sample_rate: 860 # Portato a 860 sps per mediare via l'effetto ripple dell'inverter
id: hall_voltage_raw
name: "Hall Voltage"
update_interval: 500ms
unit_of_measurement: "V"
accuracy_decimals: 3
- platform: template
name: "Corrente Batteria"
id: corrente_batteria
unit_of_measurement: "A"
device_class: current
state_class: measurement
accuracy_decimals: 2
update_interval: 500ms
lambda: |-
float volts = id(hall_voltage_raw).state;
if (isnan(volts)) return {};
return volts;
filters:
# 1. Zero centrato sul punto medio esatto del rumore (2.495V)
- calibrate_linear:
- 1.876 -> -100.0 # (1.881 - 0.005)
- 2.495 -> 0.0 # Punto medio reale tra 2.494V e 2.496V
- 3.126 -> 100.0 # (3.131 - 0.005)
# 2. Elimina i picchi spuri
- median:
window_size: 5
send_every: 1
# 3. Media mobile per la massima stabilità
- exponential_moving_average:
alpha: 0.05
send_every: 1
# 4. Zona morta portata a 0.25A per assorbire l'oscillazione +/- 0.16A
- lambda: |-
if (std::abs(x) < 0.25) {
return 0.0;
}
return x;
Calibrazione dello zero
Ogni sensore presenta una piccola tolleranza.
Con batteria senza carica e senza scarica controllare il valore:
Hall Voltage
Potresti leggere:
2.503V
oppure:
2.497V
In tal caso modificare:
const float VZERO = 2.500;
con:
const float VZERO = 2.503;
oppure:
const float VZERO = 2.497;
ottenendo una lettura molto più precisa.
Monitoraggio carica e scarica separatamente
Per un impianto fotovoltaico è consigliabile utilizzare due sensori.
Sensore 1
MPPT → Batteria
Misura la corrente di carica.
Sensore 2
Batteria → Inverter
Misura la corrente di scarica.
Collegamenti:
Sensore 1 → A0 ADS1115
Sensore 2 → A1 ADS1115
In questo modo Home Assistant mostrerà separatamente:
- Corrente di carica
- Corrente di scarica
- Potenza di carica
- Potenza di scarica
Una soluzione molto interessante per il tuo impianto Victron perché permette di avere un monitoraggio locale tramite ESPHome e confrontare i dati con quelli dello SmartShunt e degli SmartSolar.
