Passa al contenuto

← ChangeLog | Indice | Avanti: Guida hardware →

1. Panoramica dell'applicazione



1.1 Scopo

ACRouter è un controller open source per il reindirizzamento automatico dell'energia solare in eccesso verso carichi resistivi (come scaldacqua) invece di esportarla nella rete. Ottimizza inoltre il consumo energetico durante i periodi tariffari di punta e fuori punta con limiti di consumo.

Obiettivo principale: Minimizzare l'esportazione di energia verso la rete controllando dinamicamente la potenza del carico in base al bilancio attuale tra produzione e consumo. Ridurre i costi del consumo di elettricità dalla rete.


Vantaggi principali:

  • ✅ Gestione automatica dell'eccesso di energia solare
  • ✅ Ottimizzazione delle tariffe fuori punta e dei limiti di consumo
  • ✅ Riduzione dei costi dell'elettricità (autoconsumo)
  • ✅ Costi delle apparecchiature più bassi. Non sono necessarie batterie per l'accumulo di energia
  • ✅ Protezione dall'esportazione (modalità ECO)
  • ✅ Configurazione flessibile tramite interfaccia web
  • ✅ Supporto di più modalità operative
  • ✅ Controllo di più dispositivi di consumo. Dimmer e relè.
  • ✅ Codice sorgente aperto



1.2 Funzionalità


Misurazione e monitoraggio

  • Misurazione della tensione di rete (sensore di tensione AC ZMPT107)
  • Misurazione della corrente in 3 punti (sensori di corrente SCT-013/ACS-712):
  • Corrente di carico (Carico)
  • Corrente di rete (Rete) - rilevamento importazione/esportazione
  • Corrente di generazione solare (Solare)
  • Calcolo della potenza attiva in tempo reale
  • Frequenza di aggiornamento: 200 ms (5 volte al secondo)
  • Precisione di misurazione: ADC a 12 bit con DMA (fino a 80 kHz su 8 canali)


Controllo del carico

  • Controllo dimmer ad angolo di fase (dimmer TRIAC)
  • Regolazione graduale della potenza 0–100 %
  • Sincronizzazione con il rilevatore di passaggio per lo zero
  • Supporto per un massimo di 2 canali dimmer, espandibile ai GPIO disponibili
  • Uscite relè (ROADMAP: Sviluppo Fase 2)
  • 2 relè indipendenti, espandibile ai GPIO disponibili
  • Polarità programmabile (Active HIGH/LOW)


Algoritmi di controllo

  • Controller proporzionale (controller P)
  • Bilanciamento P_grid → 0
  • Coefficiente di guadagno regolabile (Kp)
  • Modalità operative: OFF, AUTO, ECO, OFFGRID, MANUAL, BOOST
  • Anti-sfarfallio - attenuazione delle variazioni del dimmer


Comunicazione

  • WiFi: Modalità AP (192.168.4.1) + modalità STA (connessione al router)
  • WebServer: REST API + interfaccia Material UI
  • Console seriale: Riga di comando per la configurazione (115200 baud)
  • Aggiornamenti OTA: Aggiornamenti firmware over-the-air (Fase 2)


Configurazione e archiviazione

  • NVS (Non-Volatile Storage):
  • Impostazioni ACRouter (modalità, Kp, setpoint)
  • Configurazione WiFi (SSID, password)
  • Configurazione hardware (pin GPIO, tipi di sensore)
  • Interfaccia web:
  • Dashboard con metriche in tempo reale
  • Pagina impostazioni WiFi
  • Pagina configurazione hardware
  • Selezione della modalità operativa
  • Terminale seriale (console):
  • Visualizzazione metriche in tempo reale
  • Riga di comando per la configurazione dell'hardware e dei parametri del dispositivo
  • Selezione della modalità operativa



1.3 Funzionamento


Controllo automatico

  1. Misurazione della potenza:
  2. Tensione e correnti vengono misurate ogni 200 ms
  3. Calcolo del valore efficace (RMS - Root Mean Square)
  4. Calcolo della potenza attiva (P = U × I × cos φ)

  5. Determinazione del bilancio:

  6. P_solar = potenza dei pannelli solari
  7. P_load = consumo attuale della casa
  8. P_grid = importazione/esportazione verso la rete
  9. P_dimmer = potenza del carico controllato

  10. Algoritmo di controllo:

  11. Obiettivo: P_grid → 0 (zero esportazione/importazione)
  12. Controller proporzionale: ΔDimmer = Kp × P_grid
  13. Applicato al dimmer con limiti 0–100 %


Monitoraggio tramite interfaccia web

  • Metriche in tempo reale:
  • Tensione di rete (V)
  • Correnti: Rete, Solare, Carico (A)
  • Potenza: Rete, Solare, Carico, Dimmer (W)
  • Livello dimmer (%)
  • Modalità operativa attuale

  • Informazioni di sistema:

  • Versione firmware
  • Tempo di attività
  • Memoria heap (RAM libera)
  • WiFi RSSI (livello del segnale)


Configurazione tramite interfaccia web

  • Selezione della modalità operativa (6 pulsanti)
  • Controllo manuale del dimmer (cursore 0–100 %)
  • Configurazione WiFi (scansione reti, connessione)
  • Configurazione pin GPIO e tipi di sensore
  • Calibrazione dei sensori (moltiplicatore, offset)
  • Riavvio del dispositivo



1.4 Modalità operative


OFF (0) - Disattivato

Descrizione: Il dimmer è completamente disattivato (0 %), il sistema è inattivo.

Usage:
- Maintenance
- Load disconnection
- Sensor testing without control

Behavior:
- Dimmer level = 0%
- Measurements continue (200 ms)
- Web interface is available
- Serial commands work



AUTO (1) - Automatico (router solare)

Descrizione: Modalità principale del router solare. Bilanciamento automatico di P_grid → 0.

Algoritmo:

cpp
// Every 200 ms
P_error = P_grid;  // Positive = import, negative = export
delta = Kp * P_error;  // Proportional controller
dimmer_level += delta;
dimmer_level = constrain(dimmer_level, 0, 100);

Behavior:
- P_grid > 0 (import from grid) → Increase dimmer (more load)
- P_grid < 0 (export to grid) → Decrease dimmer (less load)
- P_grid ≈ 0 → Dimmer stabilized

Settings:
- Kp (gain) - gain coefficient (default: 0.05)
- Higher Kp = faster response, but possible oscillations
- Lower Kp = smoother, but slower
- setpoint - target P_grid value (usually 0 W)

Esempio:

python
Initial state:
  P_solar = 2000 W
  P_load = 500 W
  P_grid = -1500 W (export!)
  Dimmer = 0%

After 5 seconds (AUTO mode, Kp=0.05):
  P_solar = 2000 W
  P_load = 500 W
  Dimmer = 75% (~1500 W to water heater)
  P_grid = 0 W ✅ (balance achieved)


ECO (2) - Economia (anti-esportazione)

Descrizione: Impedisce l'esportazione verso la rete. L'importazione è consentita, ma l'esportazione è vietata.

Algoritmo:

cpp
if (P_grid < 0) {  // Export to grid
    // Decrease dimmer (reduce load)
    delta = Kp * P_grid;  // Negative delta
    dimmer_level += delta;
} else {
    // Import is allowed, do not increase dimmer
    // Keep current level
}
dimmer_level = constrain(dimmer_level, 0, 100);

Behavior:
- P_grid < 0 (export) → Decrease dimmer (avoid export)
- P_grid > 0 (import) → Do not change dimmer (import is allowed)
- P_grid = 0 → Dimmer is stable

Applications:
- Export tariff is unfavorable or absent
- Need to use only excess energy
- Export protection when there is no grid export contract

Esempio:

python
Situation 1: Solar excess
  P_solar = 3000 W
  P_load = 1000 W
  P_grid = -500 W (export)
  → ECO mode will increase dimmer by ~500 W → P_grid = 0

Situation 2: Solar shortage
  P_solar = 500 W
  P_load = 1000 W
  P_grid = +500 W (import)
  → ECO mode will NOT change dimmer (import is allowed)


OFFGRID (3) - Fuori rete

Descrizione: Modalità per sistemi autonomi con batterie. Utilizza l'eccesso di energia solare per il carico.

Algoritmo:

cpp
// Balance by solar panel current
P_available = P_solar - P_load;  // Available power
if (P_available > 0) {
    // There is solar excess → increase dimmer
    dimmer_level = map(P_available, 0, P_dimmer_max, 0, 100);
} else {
    // No excess → turn off dimmer (save battery)
    dimmer_level = 0;
}

Behavior:
- Uses only solar energy
- Does not consider P_grid (no grid)
- Priority: main load → batteries → dimmer
- Dimmer works only when there is solar excess

Applications:
- Systems without grid connection
- Solar panels + batteries
- Maximize solar energy usage

Esempio:

python
Daytime (sunny):
  P_solar = 1500 W
  P_load = 800 W
  P_available = 700 W
  → Dimmer = 50% (~700 W to water heater)
  → Battery is not discharging

Evening (no sun):
  P_solar = 0 W
  P_load = 800 W (from battery)
  → Dimmer = 0% (battery saving)


MANUAL (4) - Modalità manuale

Descrizione: Il dimmer è impostato su un livello fisso (nessuna automazione).

Behavior:
- Dimmer level is set by user (0-100%)
- No automatic regulation
- Level is maintained until manually changed

Applications:
- Load testing
- Night tariff (set to 100%)
- Temperature control (set to 50%)
- System debugging

Settings:
- manual_level - dimmer level (0-100%)

Esempio:

bash
# Via Serial commands
set-manual 75        # Set dimmer to 75%
set-mode 4           # Switch to MANUAL mode

# Via web interface
1. Select MANUAL mode
2. Move slider to 75%
3. Click "Apply"


BOOST (5) - Potenza massima

Descrizione: Dimmer al 100 % (riscaldamento forzato).

Behavior:
- Dimmer level = 100% (constant)
- Ignores all sensors
- Maximum power to load

Applications:
- Fast water heater heating
- Using cheap tariff
- Emergency mode

Warnings:
- ⚠️ High grid consumption
- ⚠️ Possible load overheating
- ⚠️ Monitor temperature manually

Esempio:

python
Night tariff (23:00-07:00):
  1. Switch to BOOST mode
  2. Water heater heats at maximum
  3. In the morning switch back to AUTO

Result:
  Heating from cheap tariff
  Daytime operation in AUTO mode (solar)



1.5 Tabella comparativa delle modalità

Modalità Controllo dimmer Bilanciamento P_grid Importazione consentita Esportazione consentita Caso d'uso
OFF 0 % (fisso) ❌ No N/A N/A Manutenzione
AUTO Automatico ✅ Sì (→ 0) ✅ Sì ✅ Sì Router solare standard
ECO Auto (anti-esportazione) ⚠️ Parziale ✅ Sì ❌ No Nessun contratto di esportazione
OFFGRID Auto (solo solare) ❌ No N/A N/A Sistemi fuori rete
MANUAL Fisso (utente) ❌ No ✅ Sì ✅ Sì Test / Tariffa notturna
BOOST 100 % (fisso) ❌ No ✅ Sì ❌ No Riscaldamento rapido



1.6 Scenari d'uso


Scenario 1: Router solare standard

Equipment:
- 3 kW solar panels
- Sensors: Solar, Grid, Load, Voltage
- Load: 2 kW water heater

Modalità: AUTO

Operation:
1. During the day there is excess solar energy
2. P_grid is negative (export to grid)
3. Controller increases dimmer → water heater heating
4. P_grid balances → 0 (zero export/import)
5. All solar energy is used locally



Scenario 2: Protezione dall'esportazione (ECO)

Equipment:
- 5 kW solar panels
- No grid export contract
- Sensors: Solar, Grid, Voltage
- Load: Water heater element

Modalità: ECO

Operation:
1. During the day solar excess → export to grid begins
2. ECO mode detects P_grid < 0
3. Dimmer increases → water heating
4. Export prevented (P_grid ≥ 0)
5. Evening sun sets → dimmer decreases
6. Import allowed (grid purchase when needed)



Scenario 3: Sistema autonomo (OFFGRID)

Equipment:
- 2 kW solar panels
- 10 kWh batteries
- No grid connection
- Sensors: Solar, Load, Voltage
- Load: Tank heating element

Modalità: OFFGRID

Operation:
1. System is autonomous (no grid)
2. During the day solar excess → water heating
3. At night heating element is off (no sun)
4. Batteries are used for main load
5. Maximize solar energy usage



Scenario 4: Tariffa notturna + scaldacqua

Equipment:
- Two-tariff meter (day/night)
- Sensors: Grid, Voltage
- Load: Water heater

Modalità: MANUAL (notte) / OFF (giorno)

Operation:
1. Night (23:00-07:00): MANUAL 100% (cheap tariff)
2. Day (07:00-23:00): OFF (expensive tariff)
3. Programmable via schedule (Phase 2: SCHEDULE mode)




1.7 Architettura del sistema

python
┌─────────────────────────────────────────────────────────────┐
│                      ESP32 Controller                        │
│                                                               │
│  ┌─────────────┐  ┌──────────────┐  ┌────────────────────┐ │
│  │ PowerMeter  │  │   Router     │  │  DimmerHAL         │ │
│  │   ADC       │→ │  Controller  │→ │  (Zero-cross)      │ │
│  └─────────────┘  └──────────────┘  └────────────────────┘ │
│         ↓                                      ↓             │
│    Measurements                           TRIAC Control      │
│    (200ms cycle)                          (50Hz sync)        │
│                                                               │
│  ┌──────────────────────────────────────────────────────┐   │
│  │              WiFi Manager                            │   │
│  │  ┌──────────────┐  ┌────────────────────────────┐   │   │
│  │  │ AP Mode      │  │ WebServer (Material UI)    │   │   │
│  │  │ 192.168.4.1  │  │ + REST API                 │   │   │
│  │  └──────────────┘  └────────────────────────────┘   │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌──────────────────────────────────────────────────────┐   │
│  │         ConfigManager + HardwareConfigManager        │   │
│  │                    (NVS Storage)                      │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
        ↑                              ↓
   ┌────────────┐             ┌──────────────────┐
   │  Sensors   │             │  Dimmer Output   │
   ├────────────┤             ├──────────────────┤
   │ ZMPT107    │             │  TRIAC           │
   │ (Voltage)  │             │  (0-100%)        │
   │ SCT-013    │             │                  │
   │ ACS-712    │             │  Load:           │ 
   │ (Current)  │             │  Heater/Boiler   │
   │ x3 sensors │             │  (up to 2kW)     │
   └────────────┘             └──────────────────┘



1.8 Pubblico di destinazione

ACRouter è progettato per:

  1. Appassionati di fai da te - costruire un router solare da soli
  2. Proprietari di casa con pannelli solari - ottimizzare l'autoconsumo
  3. Sviluppatori - base per progetti personalizzati (open source)
  4. Progetti educativi - apprendimento di IoT, gestione energetica, ESP32
  5. Piccole imprese - ridurre i costi dell'elettricità



1.9 Limitazioni e avvisi

⚠️ IMPORTANTE:

  1. Sicurezza elettrica
  2. Lavorare con tensione di rete a 230V è pericoloso
  3. È richiesta la qualifica di elettricista
  4. L'isolamento galvanico dei sensori è obbligatorio
  5. Un dispositivo differenziale (RCD) è obbligatorio

  6. Compatibilità del carico per i dimmer

  7. Adatto solo a carichi resistivi (elementi riscaldanti, riscaldatori)
  8. NON adatto a carichi induttivi (motori, trasformatori)
  9. NON adatto all'elettronica (driver LED, alimentatori)

  10. Potenza

  11. Il massimo è limitato dal modulo TRIAC (solitamente 2 kW)
  12. È necessario il raffreddamento per carichi elevati
  13. Si raccomanda la protezione dal surriscaldamento

  14. Precisione di misurazione

  15. È necessaria la calibrazione per la precisione
  16. Errore di ±5–10 % con le impostazioni di base
  17. La temperatura influenza i sensori

  18. Requisiti della rete

  19. Frequenza di rete stabile (50/60 Hz)
  20. Tensione di qualità senza forti fluttuazioni
  21. Il rilevatore di passaggio per lo zero è critico per il TRIAC

← ChangeLog | Indice | Avanti: Guida hardware →