Medidor de Consumo Eléctrico WiFi con ESP32 y Sensor SCT-013: Guía DIY para Monitorización Local
Escrito por: Alex R.La monitorización del consumo eléctrico se ha convertido en una necesidad para hogares inteligentes y eficientes. Conocer en tiempo real cuánta energía consume cada electrodoméstico permite identificar derroches, optimizar horarios de uso y reducir la factura de la luz. Si bien existen soluciones comerciales como Shelly PM o Sense, muchas dependen de servicios en la nube y tienen un coste elevado. Una alternativa potente, open source y completamente local es construir tu propio medidor de consumo WiFi utilizando un microcontrolador ESP32 y un sensor de corriente SCT-013. Esta guía te llevará paso a paso por todo el proceso: desde los fundamentos teóricos hasta la visualización de datos en una interfaz web local, pasando por el montaje, la programación y la calibración. Al finalizar, tendrás un dispositivo capaz de medir la potencia activa, la energía acumulada y enviar los datos a tu servidor MQTT o plataforma de domótica como Home Assistant, todo sin depender de internet.
Fundamentos Técnicos: Medición de Corriente Alterna con ESP32
Para medir el consumo eléctrico en un hogar, lo más común es utilizar un transformador de corriente de tipo toroidal, como el SCT-013. Este sensor se coloca alrededor de uno de los conductores de fase (nunca alrededor del neutro y fase juntos) y genera una señal de tensión alterna proporcional a la corriente que circula. El SCT-013-030, por ejemplo, entrega 1V a 30A de corriente máxima. Sin embargo, la salida del sensor es una señal analógica de corriente alterna (CA) que oscila alrededor de 0V, con valores positivos y negativos. El ESP32, como la mayoría de microcontroladores, solo puede leer tensiones positivas en sus pines ADC (0-3.3V). Por ello, es necesario acondicionar la señal para que esté centrada en 1.65V (la mitad de la tensión de referencia) y así poder medir tanto los semiciclos positivos como negativos.
El acondicionamiento se logra mediante un circuito de polarización con un divisor de tensión y un condensador de desacoplo. También es recomendable añadir un filtro paso bajo para eliminar el ruido de alta frecuencia. Además, dado que la señal del sensor puede alcanzar picos de hasta 1V (en el modelo de 30A), es necesario atenuarla ligeramente para no saturar el ADC del ESP32, cuyo rango máximo es 3.3V. Una configuración típica usa dos resistencias de 10kΩ para crear un punto de polarización de 1.65V, y un condensador de 10µF en paralelo para estabilizar la referencia. La salida del sensor se conecta a través de una resistencia de 1kΩ a la entrada analógica, formando un filtro RC con un condensador de 100nF a tierra. Este circuito simple asegura que la señal se mantenga dentro del rango de 0-3.3V y sea legible por el ADC.
El ESP32 dispone de dos convertidores analógico-digital (ADC) de 12 bits, pero su linealidad no es perfecta, especialmente en los extremos. Para obtener lecturas precisas, se recomienda utilizar el ADC1 (pines GPIO32-GPIO39) y calibrarlo mediante la función `analogReadMilliVolts()` de la librería Arduino-ESP32, que devuelve el valor en milivoltios. Además, es fundamental realizar un promedio de múltiples muestras (por ejemplo, 2000 muestras tomadas durante un segundo) para calcular el valor RMS de la corriente. La fórmula para la corriente RMS es: Irms = (Vrms_medido - Voffset) / sensibilidad, donde Voffset es la tensión de polarización (1.65V) y sensibilidad es la relación de transformación del sensor (por ejemplo, 1V/30A = 0.0333 V/A). La potencia aparente se obtiene multiplicando Irms por la tensión de red (asumiendo 230V en Europa o 120V en América), aunque para una medición real de potencia activa se necesitaría un sensor de tensión y un circuito de detección de cruce por cero para calcular el factor de potencia. En esta guía básica asumimos una carga resistiva (factor de potencia = 1), lo que es suficiente para la mayoría de electrodomésticos.
Materiales Necesarios y Esquema de Conexión
Para construir el medidor necesitarás los siguientes componentes:
- ESP32 (cualquier placa con WiFi): Recomendamos el ESP32 DevKit V1 o NodeMCU-32S.
- Sensor SCT-013-030 (30A/1V): El más común para uso doméstico. También válido el SCT-013-000 (salida en corriente, requiere resistencia de carga).
- Resistencias: 2x 10kΩ, 1x 1kΩ, 1x 100kΩ (opcional para filtro).
- Condensadores: 1x 10µF (electrolítico), 1x 100nF (cerámico).
- Fuente de alimentación: 5V DC para el ESP32 (usar un cargador de móvil o un módulo HLK-PM01).
- Cables y protoboard: Para montaje temporal.
El esquema de conexión es el siguiente: Conecta el pin de tierra del sensor (cable negro en SCT-013) a GND del ESP32. El pin de señal (cable blanco) se conecta a la entrada analógica (por ejemplo, GPIO34) a través de una resistencia de 1kΩ. Entre este pin y GND, coloca un condensador de 100nF para filtrar ruido. Para la polarización, usa dos resistencias de 10kΩ en serie entre 3.3V y GND; el punto medio (1.65V) se conecta a la entrada analógica a través de otra resistencia de 10kΩ (opcional) o directamente si se usa una impedancia alta. El condensador de 10µF se coloca entre el punto de polarización y GND para estabilizar la referencia. Es importante que todas las conexiones sean firmes y usar cables apantallados si el entorno es ruidoso.
| Componente | Conexión |
|---|---|
| SCT-013 (negro) | GND |
| SCT-013 (blanco) | GPIO34 (a través de 1kΩ) |
| Resistencias 10kΩ | Divisor de tensión: 3.3V - 10kΩ - punto medio - 10kΩ - GND |
| Condensador 10µF | Entre punto medio y GND |
| Condensador 100nF | Entre GPIO34 y GND |
Programación del ESP32: Código Base para Medición RMS
El firmware del ESP32 se encarga de muestrear la señal analógica, calcular el valor RMS, convertir a corriente y potencia, y publicar los datos vía MQTT o servidor web. A continuación se presenta un código base en Arduino que puedes adaptar. Asegúrate de tener instaladas las librerías WiFi, PubSubClient (para MQTT) y ArduinoJson (opcional).
El código comienza definiendo los pines y constantes: el pin ADC (34), la tensión de referencia (3.3V), la resolución del ADC (4095), el offset de polarización (1.65V) y la sensibilidad del sensor (0.0333 V/A). En el setup, se configura el ADC con atenuación de 11dB (para medir hasta 3.3V) y se conecta a WiFi. En el loop, se toman 2000 muestras en un bucle, se calcula el promedio, se resta el offset, se eleva al cuadrado, se promedia y se obtiene la raíz cuadrada para obtener Vrms. Luego se calcula Irms = Vrms / sensibilidad, y la potencia aparente P = Irms * Vred (asumiendo 230V). Finalmente, se publica en MQTT o se sirve vía HTTP.
Ejemplo de fragmento de código para el cálculo RMS:
const int ADC_PIN = 34;
const float VREF = 3.3;
const int ADC_RES = 4095;
const float VOFFSET = 1.65;
const float SENSITIVITY = 1.0 / 30.0; // 1V por 30A
const float V_RED = 230.0;
const int NUM_SAMPLES = 2000;
void loop() {
float sumSq = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
float v = analogReadMilliVolts(ADC_PIN) / 1000.0;
float v_centered = v - VOFFSET;
sumSq += v_centered * v_centered;
delayMicroseconds(500);
}
float vRms = sqrt(sumSq / NUM_SAMPLES);
float iRms = vRms / SENSITIVITY;
float power = iRms * V_RED;
// Publicar por MQTT...
}
Es importante destacar que la función `analogReadMilliVolts()` proporciona una lectura calibrada en milivoltios, lo que mejora la precisión respecto a `analogRead()`. El bucle de muestreo debe ejecutarse lo más rápido posible para capturar múltiples puntos de la onda de 50/60 Hz. Con 2000 muestras y un delay de 500 µs, el tiempo total es de 1 segundo, suficiente para un promedio estable. Para evitar el bloqueo del programa, puedes usar un temporizador o RTOS.
Calibración y Precisión: Ajuste Fino del Medidor
Una vez montado el circuito y cargado el código, es necesario calibrar el medidor para obtener lecturas precisas. La calibración consiste en ajustar el offset (VOFFSET) y la sensibilidad real del sensor, ya que los valores nominales pueden tener tolerancias. Para ello, conecta una carga conocida (por ejemplo, una bombilla incandescente de 100W) y compara la lectura del medidor con la de un monitor de energía comercial o un multímetro en modo amperímetro.
Procedimiento de calibración:
- Sin carga (corriente cero), mide el valor de offset. Debería ser aproximadamente 1.65V. Si no es así, ajusta el divisor de tensión o modifica VOFFSET en el código.
- Conecta una carga resistiva de potencia conocida (por ejemplo, 100W a 230V corresponde a 0.435A). Toma la lectura de Irms y ajusta SENSITIVITY hasta que coincida. Por ejemplo, si el sensor indica 0.40A, la sensibilidad real sería 1V / (0.435A) = 2.3 V/A, pero como el sensor es lineal, puedes escalar el factor.
- Repite con varias cargas para verificar la linealidad. Si las lecturas se desvían, considera usar una tabla de lookup o un ajuste polinomial.
La precisión final dependerá de la calidad del ADC del ESP32 y del ruido eléctrico. En condiciones ideales, se puede lograr un error inferior al 5% para corrientes superiores a 0.5A. Para corrientes muy bajas (menos de 0.1A), el error puede ser mayor debido al ruido y la resolución del ADC. Si necesitas alta precisión, considera usar un ADC externo como el ADS1115 de 16 bits.
Integración con Home Assistant y Visualización Local
Una vez que el ESP32 está midiendo y publicando datos vía MQTT, es fácil integrarlo con Home Assistant. Configura un sensor MQTT en Home Assistant para recibir la potencia y la energía. Puedes usar el siguiente ejemplo de configuración en configuration.yaml:
sensor:
- platform: mqtt
name: "Potencia Cocina"
state_topic: "casa/cocina/potencia"
unit_of_measurement: "W"
device_class: power
- platform: mqtt
name: "Energía Cocina"
state_topic: "casa/cocina/energia"
unit_of_measurement: "kWh"
device_class: energy
Además, puedes crear un servidor web en el propio ESP32 para visualizar los datos sin necesidad de Home Assistant. Usando la librería ESPAsyncWebServer, puedes servir una página HTML con gráficos en tiempo real usando Chart.js. Esto permite una monitorización completamente local y sin dependencias externas.
1Ventajas de la Monitorización Local
Privacidad total: los datos nunca salen de tu red. Sin dependencia de internet. Latencia mínima. Personalización total del firmware.
2Posibles Mejoras
Añadir sensor de tensión ZMPT101B para medir potencia activa real. Usar ADC externo ADS1115 para mayor precisión. Implementar detección de cruce por cero para factor de potencia.
Comparativa: SCT-013 vs Otras Alternativas
Existen varios sensores de corriente para proyectos DIY. La siguiente tabla compara el SCT-013 con otras opciones populares.
| Característica | SCT-013-030 | SCT-013-000 | ACS712 (5A) |
|---|---|---|---|
| Tipo de salida | Tensión (1V a 30A) | Corriente (requiere resistencia de carga) | Tensión (185 mV/A) |
| Alimentación | Pasivo (no necesita) | Pasivo | 5V (activo) |
| Precisión | Buena | Moderada | Baja (ruidosa) |
| Rango | 30A | 30A (con resistor) | 5A |
| Aislamiento galvánico | Sí | Sí | No |
El SCT-013-030 es la opción más equilibrada para monitorización doméstica: no requiere alimentación externa, ofrece aislamiento galvánico (seguridad) y buena precisión. El ACS712 es más fácil de conectar pero no aísla y es más ruidoso. El SCT-013-000 requiere una resistencia de carga y cálculos adicionales.
Preguntas Frecuentes sobre el Medidor de Consumo WiFi con ESP32
¿Es seguro instalar el sensor SCT-013 en el cuadro eléctrico?
¿Puedo medir varios circuitos con un solo ESP32?
¿Qué precisión tiene este medidor casero?
¿Puedo usar este medidor sin WiFi?
Conclusión y Próximos Pasos
Construir tu propio medidor de consumo eléctrico WiFi con ESP32 y sensor SCT-013 es un proyecto DIY gratificante que te proporciona datos valiosos para optimizar tu consumo energético. Con unos pocos componentes y conocimientos básicos de electrónica y programación, puedes tener un monitor de energía local, privado y personalizable. Los pasos clave son: montar el circuito de acondicionamiento de señal, programar el ESP32 para calcular RMS, calibrar con una carga conocida e integrar con Home Assistant o un servidor web.
Recuerda siempre priorizar la seguridad: trabaja con el cuadro eléctrico desconectado, utiliza fusibles y no expongas el circuito a la humedad. Con estas precauciones
Este análisis técnico es independiente. No recibimos pagos de fabricantes para alterar valoraciones. Si realizas una compra a través de enlaces en este sitio, podríamos percibir una comisión de afiliación que ayuda a mantener el servidor activo, sin coste extra para ti.