Ir al contenido

← ChangeLog | Contenido | Siguiente: Guía de hardware →

1. Descripción general de la aplicación



1.1 Propósito

ACRouter es un controlador de código abierto para redirigir automáticamente el excedente de energía solar a cargas resistivas (como calentadores de agua) en lugar de exportarlo a la red. También optimiza el consumo de energía durante los períodos tarifarios pico y valle con límites de consumo.

Objetivo principal: Minimizar la exportación de energía a la red controlando dinámicamente la potencia de la carga en función del balance actual entre producción y consumo. Reducir los costos de consumo de electricidad de la red.


Beneficios principales:

  • ✅ Gestión automática del excedente de energía solar
  • ✅ Optimización de tarifas valle y límites de consumo
  • ✅ Reducción de costos de electricidad (autoconsumo)
  • ✅ Menores costos de equipamiento. No se requieren baterías para almacenamiento de energía
  • ✅ Protección contra exportación (modo ECO)
  • ✅ Configuración flexible a través de interfaz web
  • ✅ Múltiples modos de operación compatibles
  • ✅ Control de múltiples dispositivos de consumo. Dimmers y relés.
  • ✅ Código fuente abierto



1.2 Características


Medición y monitoreo

  • Medición de voltaje de red (sensor de voltaje AC ZMPT107)
  • Medición de corriente en 3 puntos (sensores de corriente SCT-013/ACS-712):
  • Corriente de carga (Carga)
  • Corriente de red (Red) - detección de importación/exportación
  • Corriente de generación solar (Solar)
  • Cálculo de potencia activa en tiempo real
  • Frecuencia de actualización: 200 ms (5 veces por segundo)
  • Precisión de medición: ADC de 12 bits con DMA (hasta 80 kHz en 8 canales)


Control de carga

  • Control de dimmer por ángulo de fase (dimmer TRIAC)
  • Ajuste suave de potencia 0–100 %
  • Sincronización con detector de cruce por cero
  • Soporte para hasta 2 canales de dimmer, ampliable a GPIO disponibles
  • Salidas de relé (ROADMAP: Desarrollo Fase 2)
  • 2 relés independientes, ampliable a GPIO disponibles
  • Polaridad programable (Active HIGH/LOW)


Algoritmos de control

  • Controlador proporcional (controlador P)
  • Equilibrado P_grid → 0
  • Coeficiente de ganancia ajustable (Kp)
  • Modos de operación: OFF, AUTO, ECO, OFFGRID, MANUAL, BOOST
  • Anti-parpadeo - suavizado de cambios del dimmer


Comunicación

  • WiFi: Modo AP (192.168.4.1) + modo STA (conexión al router)
  • WebServer: REST API + interfaz Material UI
  • Consola serie: Línea de comandos para configuración (115200 baudios)
  • Actualizaciones OTA: Actualizaciones de firmware por aire (Fase 2)


Configuración y almacenamiento

  • NVS (Non-Volatile Storage):
  • Ajustes de ACRouter (modo, Kp, punto de ajuste)
  • Configuración WiFi (SSID, contraseña)
  • Configuración de hardware (pines GPIO, tipos de sensor)
  • Interfaz web:
  • Panel de control con métricas en tiempo real
  • Página de configuración WiFi
  • Página de configuración de hardware
  • Selección de modo de operación
  • Terminal serie (consola):
  • Visualización de métricas en tiempo real
  • Línea de comandos para configuración de hardware y parámetros del dispositivo
  • Selección de modo de operación



1.3 Funcionalidad


Control automático

  1. Medición de potencia:
  2. El voltaje y las corrientes se miden cada 200 ms
  3. Cálculo del valor eficaz (RMS - Root Mean Square)
  4. Cálculo de potencia activa (P = U × I × cos φ)

  5. Determinación del balance:

  6. P_solar = potencia de los paneles solares
  7. P_load = consumo actual de la casa
  8. P_grid = importación/exportación a la red
  9. P_dimmer = potencia de carga controlada

  10. Algoritmo de control:

  11. Objetivo: P_grid → 0 (cero exportación/importación)
  12. Controlador proporcional: ΔDimmer = Kp × P_grid
  13. Aplicado al dimmer con límites 0–100 %


Monitoreo a través de interfaz web

  • Métricas en tiempo real:
  • Voltaje de red (V)
  • Corrientes: Red, Solar, Carga (A)
  • Potencia: Red, Solar, Carga, Dimmer (W)
  • Nivel del dimmer (%)
  • Modo de operación actual

  • Información del sistema:

  • Versión de firmware
  • Tiempo de actividad
  • Memoria heap (RAM libre)
  • WiFi RSSI (nivel de señal)


Configuración a través de interfaz web

  • Selección de modo de operación (6 botones)
  • Control manual del dimmer (deslizador 0–100 %)
  • Configuración WiFi (escaneo de redes, conexión)
  • Configuración de pines GPIO y tipos de sensor
  • Calibración de sensores (multiplicador, offset)
  • Reinicio del dispositivo



1.4 Modos de operación


OFF (0) - Desactivado

Descripción: El dimmer está completamente desactivado (0 %), el sistema está inactivo.

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) - Automático (enrutador solar)

Descripción: Modo principal del enrutador solar. Equilibrado automático de 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)

Ejemplo:

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) - Economía (anti-exportación)

Descripción: Evita la exportación a la red. La importación está permitida, pero la exportación está prohibida.

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

Ejemplo:

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) - Fuera de red

Descripción: Modo para sistemas autónomos con baterías. Usa el excedente de energía solar para la carga.

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

Ejemplo:

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) - Modo manual

Descripción: El dimmer se establece en un nivel fijo (sin automatización).

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%)

Ejemplo:

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) - Potencia máxima

Descripción: Dimmer al 100 % (calentamiento forzado).

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

Ejemplo:

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 Tabla comparativa de modos

Modo Control del dimmer Equilibrio P_grid Importación permitida Exportación permitida Caso de uso
OFF 0 % (fijo) ❌ No N/A N/A Mantenimiento
AUTO Automático ✅ Sí (→ 0) ✅ Sí ✅ Sí Enrutador solar estándar
ECO Auto (anti-exportación) ⚠️ Parcial ✅ Sí ❌ No Sin contrato de exportación
OFFGRID Auto (solo solar) ❌ No N/A N/A Sistemas fuera de red
MANUAL Fijo (usuario) ❌ No ✅ Sí ✅ Sí Prueba / Tarifa nocturna
BOOST 100 % (fijo) ❌ No ✅ Sí ❌ No Calentamiento rápido



1.6 Escenarios de uso


Escenario 1: Enrutador solar estándar

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

Modo: 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



Escenario 2: Protección contra exportación (ECO)

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

Modo: 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)



Escenario 3: Sistema autónomo (OFFGRID)

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

Modo: 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



Escenario 4: Tarifa nocturna + calentador de agua

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

Modo: MANUAL (noche) / OFF (día)

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 Arquitectura 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 Público objetivo

ACRouter está diseñado para:

  1. Entusiastas del DIY - construir un enrutador solar por cuenta propia
  2. Propietarios con paneles solares - optimizar el autoconsumo
  3. Desarrolladores - base para proyectos personalizados (código abierto)
  4. Proyectos educativos - aprendizaje de IoT, gestión energética, ESP32
  5. Pequeñas empresas - reducir costos de electricidad



1.9 Limitaciones y advertencias

⚠️ IMPORTANTE:

  1. Seguridad eléctrica
  2. Trabajar con voltaje de red de 230V es peligroso
  3. Se requiere cualificación de electricista
  4. El aislamiento galvánico de los sensores es obligatorio
  5. Un dispositivo de corriente residual (RCD) es obligatorio

  6. Compatibilidad de carga para dimmers

  7. Adecuado solo para cargas resistivas (elementos calefactores, calentadores)
  8. NO adecuado para cargas inductivas (motores, transformadores)
  9. NO adecuado para electrónica (drivers LED, fuentes de alimentación)

  10. Potencia

  11. El máximo está limitado por el módulo TRIAC (habitualmente 2 kW)
  12. Se requiere refrigeración para cargas altas
  13. Se recomienda protección contra sobrecalentamiento

  14. Precisión de medición

  15. Se requiere calibración para la precisión
  16. Error de ±5–10 % con ajustes básicos
  17. La temperatura afecta a los sensores

  18. Requisitos de la red

  19. Frecuencia de red estable (50/60 Hz)
  20. Voltaje de calidad sin fluctuaciones fuertes
  21. El detector de cruce por cero es crítico para el TRIAC

← ChangeLog | Contenido | Siguiente: Guía de hardware →