← 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
- Medición de potencia:
- El voltaje y las corrientes se miden cada 200 ms
- Cálculo del valor eficaz (RMS - Root Mean Square)
-
Cálculo de potencia activa (P = U × I × cos φ)
-
Determinación del balance:
- P_solar = potencia de los paneles solares
- P_load = consumo actual de la casa
- P_grid = importación/exportación a la red
-
P_dimmer = potencia de carga controlada
-
Algoritmo de control:
- Objetivo: P_grid → 0 (cero exportación/importación)
- Controlador proporcional: ΔDimmer = Kp × P_grid
- 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:
// 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:
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:
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:
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:
// 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:
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:
# 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:
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
┌─────────────────────────────────────────────────────────────┐
│ 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:
- Entusiastas del DIY - construir un enrutador solar por cuenta propia
- Propietarios con paneles solares - optimizar el autoconsumo
- Desarrolladores - base para proyectos personalizados (código abierto)
- Proyectos educativos - aprendizaje de IoT, gestión energética, ESP32
- Pequeñas empresas - reducir costos de electricidad
1.9 Limitaciones y advertencias
⚠️ IMPORTANTE:
- Seguridad eléctrica
- Trabajar con voltaje de red de 230V es peligroso
- Se requiere cualificación de electricista
- El aislamiento galvánico de los sensores es obligatorio
-
Un dispositivo de corriente residual (RCD) es obligatorio
-
Compatibilidad de carga para dimmers
- Adecuado solo para cargas resistivas (elementos calefactores, calentadores)
- NO adecuado para cargas inductivas (motores, transformadores)
-
NO adecuado para electrónica (drivers LED, fuentes de alimentación)
-
Potencia
- El máximo está limitado por el módulo TRIAC (habitualmente 2 kW)
- Se requiere refrigeración para cargas altas
-
Se recomienda protección contra sobrecalentamiento
-
Precisión de medición
- Se requiere calibración para la precisión
- Error de ±5–10 % con ajustes básicos
-
La temperatura afecta a los sensores
-
Requisitos de la red
- Frecuencia de red estable (50/60 Hz)
- Voltaje de calidad sin fluctuaciones fuertes
- El detector de cruce por cero es crítico para el TRIAC