Inicio/Monitores de Energía/Monitorización de Consumo Eléctrico con Raspberry Pi Pico y MicroPython: Proyecto DIY de Bajo Coste
Monitores de Energía

Monitorización de Consumo Eléctrico con Raspberry Pi Pico y MicroPython: Proyecto DIY de Bajo Coste

Alex R.Escrito por: Alex R.
Fecha: 14 Jul 2026
Lectura de 10 min
Monitorización de Consumo Eléctrico con Raspberry Pi Pico y MicroPython: Proyecto DIY de Bajo Coste

La monitorización del consumo eléctrico se ha convertido en una necesidad para hogares y pequeñas empresas que buscan optimizar su eficiencia energética y reducir costes. Con el auge del Internet de las Cosas (IoT) y las plataformas de código abierto, es posible construir sistemas de medición precisos y asequibles. En este artículo, exploraremos en profundidad cómo desarrollar un medidor de consumo eléctrico utilizando una Raspberry Pi Pico y MicroPython, dos herramientas que combinan bajo coste, flexibilidad y una amplia comunidad de soporte. Desde los fundamentos teóricos hasta la implementación práctica, pasando por la calibración y la visualización de datos, esta guía te proporcionará todo lo necesario para llevar a cabo tu propio proyecto DIY de monitorización energética.

Fundamentos de la Medición de Consumo Eléctrico

Para medir el consumo eléctrico de un dispositivo o de una instalación completa, es necesario conocer dos magnitudes fundamentales: la tensión (V) y la corriente (I). La potencia instantánea se calcula como el producto de ambas (P = V × I), y la energía consumida a lo largo del tiempo se obtiene integrando la potencia. En corriente alterna (CA), que es la que se utiliza en la mayoría de los hogares, la tensión y la corriente varían sinusoidalmente, por lo que es necesario medir valores eficaces (RMS) para obtener una lectura precisa. Además, en cargas no lineales, el factor de potencia juega un papel importante, ya que la potencia real (activa) puede ser menor que el producto de los valores RMS. Para nuestro proyecto, nos centraremos en la medición de corriente mediante un sensor de efecto Hall no invasivo, que permite medir sin necesidad de cortar el cable, y asumiremos una tensión nominal constante (por ejemplo, 230 V en Europa o 120 V en América) para simplificar el cálculo. No obstante, también es posible añadir un transformador de tensión para medir la tensión real y calcular la potencia con mayor precisión.

El sensor de efecto Hall más común para este tipo de proyectos es el SCT-013, que ofrece diferentes rangos de corriente (por ejemplo, 30 A o 100 A) y proporciona una salida analógica de tensión proporcional a la corriente medida. Esta señal analógica puede ser leída por el convertidor analógico-digital (ADC) de la Raspberry Pi Pico. Sin embargo, la señal de salida del SCT-013 es una onda senoidal centrada en 0 V, pero el ADC de la Pico solo puede medir tensiones positivas entre 0 y 3.3 V. Por lo tanto, es necesario añadir un circuito de polarización que desplace la señal a un nivel de continua (DC) de aproximadamente 1.65 V (la mitad de la tensión de referencia). Esto se consigue con un simple divisor de tensión formado por dos resistencias iguales conectadas a 3.3 V y a masa, con la salida del sensor conectada a través de un condensador de acoplo para eliminar la componente continua no deseada. En las siguientes secciones detallaremos el esquema de conexión y el código necesario para realizar las lecturas y calcular el consumo.

Componentes Necesarios y Esquema de Conexión

Para construir nuestro medidor de consumo eléctrico, necesitaremos los siguientes componentes: una Raspberry Pi Pico (o Pico W para conectividad Wi-Fi), un sensor de corriente SCT-013 (modelo de 30 A o 100 A según la carga a medir), dos resistencias de 10 kΩ (para el divisor de tensión), un condensador de 10 µF (para el acoplo de la señal), una placa de prototipos (breadboard) y cables de conexión. Opcionalmente, podemos incluir una pantalla OLED (como la SSD1306) para visualizar los datos en tiempo real, o un módulo Wi-Fi (si usamos la Pico W) para enviar los datos a un servidor MQTT o a una plataforma como Home Assistant. A continuación, se describe el esquema de conexión paso a paso.

Conexión del sensor SCT-013: El sensor tiene un conector jack de 3.5 mm con tres cables: uno de señal (generalmente blanco o amarillo), otro de referencia (negro) y otro de alimentación (rojo). En la mayoría de los modelos, el cable rojo no se utiliza (puede dejarse sin conectar), el negro se conecta a masa (GND) y el blanco es la salida de señal. Esta señal se conecta al circuito de polarización. El circuito de polarización consiste en un divisor de tensión formado por dos resistencias de 10 kΩ en serie entre 3.3 V y GND. El punto medio del divisor (entre las dos resistencias) se conecta a la entrada analógica del ADC (por ejemplo, GP26 en la Pico). Además, la señal del sensor se acopla a través de un condensador de 10 µF: un terminal del condensador se conecta a la salida del sensor (cable blanco) y el otro terminal se conecta al punto medio del divisor. De esta forma, la componente alterna de la señal se superpone a la tensión de polarización de 1.65 V, permitiendo que el ADC lea valores entre 0 y 3.3 V. Es importante asegurarse de que el condensador tenga la polaridad correcta si es electrolítico (el terminal negativo al divisor).

Una vez montado el circuito, podemos conectar la Raspberry Pi Pico al ordenador mediante un cable USB para alimentarla y programarla. El código en MicroPython se encargará de leer el ADC, calcular la corriente RMS y la potencia, y mostrar los resultados por el puerto serie o en una pantalla. En la siguiente sección, presentamos el código completo con explicaciones detalladas.

Programación en MicroPython: Código Completo y Explicación

El siguiente código en MicroPython realiza la lectura del sensor de corriente, calcula el valor RMS y la potencia aparente (asumiendo tensión constante de 230 V). Se incluye un filtro de media móvil para suavizar las lecturas y se muestran los resultados por el puerto serie cada segundo. El código está optimizado para la Raspberry Pi Pico y utiliza el ADC interno de 12 bits.

from machine import ADC, Pin
import time
import math

# Configuración del ADC en GP26 (ADC0)
adc = ADC(Pin(26))

# Parámetros del sensor SCT-013 (30 A)
VREF = 3.3          # Tensión de referencia del ADC
ADC_RES = 65535     # Resolución del ADC (16 bits en modo oversampling)
SENSIBILIDAD = 0.5  # Sensibilidad del sensor (V/A) para SCT-013-030
CORRIENTE_MAX = 30  # Corriente máxima del sensor (A)
NUM_MUESTRAS = 2000 # Número de muestras para cálculo RMS

def calcular_rms(num_muestras):
    suma_cuadrados = 0
    for _ in range(num_muestras):
        valor_adc = adc.read_u16()  # Lectura de 16 bits (0-65535)
        tension = (valor_adc / ADC_RES) * VREF  # Convertir a voltios
        # Eliminar el offset de 1.65 V y convertir a corriente
        corriente_instantanea = (tension - 1.65) / SENSIBILIDAD
        suma_cuadrados += corriente_instantanea ** 2
        time.sleep_us(50)  # Pequeña pausa entre muestras (20 kHz aprox)
    corriente_rms = math.sqrt(suma_cuadrados / num_muestras)
    return corriente_rms

while True:
    corriente = calcular_rms(NUM_MUESTRAS)
    potencia = corriente * 230  # Potencia aparente (VA)
    print("Corriente RMS: {:.3f} A | Potencia: {:.1f} W".format(corriente, potencia))
    time.sleep(1)

Explicación del código: Primero importamos las librerías necesarias y configuramos el ADC en el pin GP26. Definimos constantes como la tensión de referencia (3.3 V), la resolución del ADC (65535 para 16 bits, aunque la Pico tiene ADC de 12 bits, la función read_u16() devuelve un valor escalado a 16 bits), la sensibilidad del sensor (0.5 V/A para el modelo de 30 A) y el número de muestras para el cálculo RMS (2000 muestras, que a una frecuencia de muestreo de aproximadamente 20 kHz cubren unos 100 ms, suficiente para un ciclo de 50/60 Hz). La función calcular_rms() toma un número de muestras, lee el ADC, convierte la lectura a tensión, resta el offset de 1.65 V, divide por la sensibilidad para obtener la corriente instantánea, acumula el cuadrado y finalmente calcula la raíz cuadrada de la media. En el bucle principal, se obtiene la corriente RMS, se calcula la potencia aparente multiplicando por 230 V y se imprime por el puerto serie cada segundo. Es importante tener en cuenta que este método asume una tensión constante y un factor de potencia unitario, por lo que la potencia calculada es la aparente. Para una medición más precisa, se necesitaría un sensor de tensión y calcular la potencia activa con el factor de potencia.

Calibración y Precisión del Sensor

La precisión de nuestro medidor depende en gran medida de la calibración del sensor. El sensor SCT-013 tiene una sensibilidad nominal, pero puede variar ligeramente entre unidades. Además, el circuito de polarización introduce pequeñas tolerancias en las resistencias que afectan al offset. Por lo tanto, es recomendable realizar una calibración con una carga conocida, como una bombilla incandescente de 100 W (que consume aproximadamente 0.435 A a 230 V). Conectamos la carga y ajustamos el factor de sensibilidad en el código hasta que la corriente medida coincida con el valor esperado. También podemos medir el offset real midiendo la tensión en el punto medio del divisor sin carga (debería ser 1.65 V) y ajustarlo en el código si es necesario. Otra fuente de error es la resolución del ADC: con 12 bits, la resolución es de 3.3 V / 4096 ≈ 0.8 mV, que para una sensibilidad de 0.5 V/A corresponde a una resolución de corriente de aproximadamente 1.6 mA. Esto es suficiente para la mayoría de aplicaciones domésticas, pero para cargas muy pequeñas (menos de 10 W) puede no ser preciso. En ese caso, se puede utilizar un amplificador operacional para amplificar la señal antes del ADC, o emplear un sensor con mayor sensibilidad, como el SCT-013-000 que requiere una resistencia de carga externa.

Para mejorar la precisión, también podemos implementar un filtro digital más sofisticado, como un filtro de media móvil o un filtro de Kalman, que reduzca el ruido de alta frecuencia. Además, es importante tener en cuenta que el sensor SCT-013 no está diseñado para medir corriente continua (DC), solo corriente alterna (AC). Si se necesita medir DC, se debe utilizar un sensor de efecto Hall diferente, como el ACS712. En la siguiente sección, presentamos una tabla comparativa de sensores de corriente para ayudar a elegir el más adecuado según la aplicación.

ModeloTipoRangoSensibilidadPrecisiónPrecio
SCT-013-030No invasivo (AC)0-30 A0.5 V/A±3%Bajo
SCT-013-100No invasivo (AC)0-100 A0.1 V/A±3%Bajo
ACS712 (5A)Invasivo (AC/DC)±5 A185 mV/A±1.5%Medio
ACS712 (30A)Invasivo (AC/DC)±30 A66 mV/A±1.5%Medio
INA219I2C (DC)±3.2 A0.1 mA/LSB±0.5%Alto

Visualización de Datos y Conexión a la Nube

Una vez que tenemos las lecturas de corriente y potencia, el siguiente paso es visualizar los datos de forma útil. Podemos añadir una pantalla OLED SSD1306 (128x64 píxeles) conectada por I2C para mostrar en tiempo real la corriente, potencia y energía acumulada. La conexión I2C de la Pico utiliza los pines GP4 (SDA) y GP5 (SCL). El código para la pantalla es sencillo: inicializar el bus I2C, crear un objeto SSD1306 y dibujar texto con los valores actualizados cada segundo. También podemos almacenar los datos en una tarjeta SD o enviarlos a un servidor mediante Wi-Fi si utilizamos la Raspberry Pi Pico W. Para la comunicación inalámbrica, una opción popular es usar el protocolo MQTT, que permite publicar los datos en un broker (como Mosquitto) y suscribirse desde cualquier dispositivo. De esta forma, podemos integrar nuestro medidor en plataformas de domótica como Home Assistant, OpenHAB o Node-RED, y crear paneles de control personalizados.

Para la Pico W, el código incluye la conexión a la red Wi-Fi y la publicación de los datos en un tópico MQTT. A continuación, se muestra un fragmento de código que envía la potencia cada 5 segundos al broker local. Es necesario instalar la librería umqtt.simple en la Pico (disponible en el repositorio de MicroPython).

import network
import time
from umqtt.simple import MQTTClient

# Configuración Wi-Fi
SSID = "tu_ssid"
PASSWORD = "tu_password"

# Configuración MQTT
BROKER = "192.168.1.100"
TOPIC = "casa/consumo/potencia"

def conectar_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)
    while not wlan.isconnected():
        time.sleep(1)
    print("Wi-Fi conectado")

def publicar_mqtt(valor):
    client = MQTTClient("pico
TRANSPARENCIA INFORMATIVA

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.