Monitoraggio Corrente Batteria con ESP32, ADS1115 e Sensore Hall QNHCK2-16 da 100A

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:

CorrenteTensione
-100A1.875V
-50A2.1875V
0A2.500V
+50A2.8125V
+100A3.125V

Piedinatura del sensore

Dal corpo del sensore escono 4 fili.

ColoreFunzione
Rosso+5V
NeroGND
VerdeVOUT
BluVREF

Utilizzeremo solamente:

Rosso
Nero
Verde

Collegamenti ESP32 ↔ ADS1115

ADS1115ESP32
VDD3.3V
GNDGND
SDAGPIO21
SCLGPIO22

Collegamenti Sensore ↔ ADS1115

Sensore HallADS1115
VOUT (verde)A0
GND (nero)GND

Alimentazione Sensore

Sensore HallESP32
Rosso5V
NeroGND

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *