Construye un Monitor de Energía y Registrador de Datos Fiable con Arduino – Guía Paso a Paso
Componentes y materiales
| Arduino UNO | 1 |
| Placa de Monitor de Energía Dr. Wattson | 1 |
| Carcasa para Placa Dr. Wattson | 1 |
| Placa Adaptadora MicroSD Adafruit | 1 |
| LED (genérico) | 1 |
| Botón Táctil Adafruit | 1 |
| Resistencia 221 ohm | 1 |
Sobre este proyecto
(Esta publicación se basa en un post publicado originalmente el 19 de septiembre de 2017 en Medium, y ha sido actualizado y está más actualizado aquí, incluyendo detalles de la publicación de la librería y ejemplos en GitHub).
En este post, te mostraré cómo construí un monitor de energía y registrador de datos Arduino que me ayudaría a recopilar datos de corriente y energía para diferentes cargas fácilmente, y graficar esa información usando un programa como Excel.
Algunos de ustedes podrían saber que he creado una nueva placa breakout de monitor de energía que llamo Dr. Wattson (basada en el #Microchip #MCP39F521, un IC de monitor de potencia) junto con una #librería Arduino y #librería Python (para placas como #RaspberryPi y #BeagleBoneBlack) para una fácil integración de datos de energía de calidad en tu próximo proyecto. Si no has oído hablar de él y quieres más información, consulta https://upbeatlabs-wattson.launchrock.com/ para más información. También está disponible en Tindie.
Para ayudarme a estudiar las características energéticas de diferentes cargas, creé un Monitor de Energía y Registrador de Datos Arduino, ¡que es el tema de este post!
Consiste en un Arduino (¡por supuesto!) hablando con la placa Dr. Wattson para obtener datos de energía, junto con una tarjeta SD para escribir los datos. También he añadido un botón para alternar el registro de datos, junto con un indicador LED para mostrar cuándo se están registrando datos. El botón junto con el LED hicieron muy fácil iniciar el registro de datos cuando tenía la carga apropiada enchufada.
Para facilitar el registro y el análisis posterior, también implementé un esquema de rotación de logs, así que cada ejecución se registrará en un archivo diferente. La salida está en formato CSV, lo que significa que se puede importar fácilmente a Excel (o Numbers en Mac u otro equivalente), y graficar los datos.
Configuración
Coloqué la placa Dr. Wattson en una carcasa acrílica para que los cables de CA estén encerrados, ¡y puedas usarla de forma segura! Más tarde actualicé la carcasa y ahora está disponible en Tindie. Se ve un poco más limpia con un enchufe IEC adicional y conectores de pala para conexiones fáciles.
He preparado un Manual de Usuario mostrando cómo hacer el cableado, que ahora está disponible en GitHub.
La salida digital que viene de Dr. Wattson está completamente aislada de la red eléctrica, ya que la medición de energía se hace de forma aislada usando transformadores de corriente y voltaje, así que la salida digital es perfectamente segura de manipular.
Una vez en la carcasa, todo lo que necesitas hacer es enchufar el cable a un enchufe existente, y enchufar cualquier dispositivo en el enchufe de la carcasa — la PCB está diseñada para corrientes hasta 12A, ¡así que está bastante bien construida! Está calibrada para medir corrientes hasta 4A (para poder medir corrientes realmente pequeñas para medir potencia en standby — el chip MCP39F521 en el que se basa tiene una relación dinámica de 4000:1, lo que significa que puede medir desde 4A hasta 1mA).
Circuito
Aquí está el circuito que usé:
Usé un breakout de tarjeta SD similar al de Adafruit (así que usé ese en Fritzing, ya que era la pieza más cercana). La conexión es bastante estándar — CLK (pin 13 Arduino Uno), MISO (pin 12 Arduino Uno), MOSI (pin 11 Arduino Uno) y CS (Chip select). CS es configurable, aunque por defecto es pin 10 para CS de hardware — solo uso ese.
Para el botón, uso la librería Button de Jack Christensen, que proporciona anti-rebote y una variedad de cosas útiles en un paquete fácil de usar. El botón usa el pull-up interno del Arduino, así que no tiene pull-ups externos y también usa lógica invertida (alto es OFF, bajo es ON) — ¡todo esto es configurable como parámetros del constructor Button! He conectado el botón al pin 4, pero puedes usar cualquier pin disponible que quieras.
Realmente no tuve el tiempo y la paciencia para modelar Dr. Wattson como una nueva pieza en Fritzing, así que hice trampa, y usé el consejo de Z-HUT para crear fácilmente una pieza personalizada sin mucho ado. ¡Muy recomendable verlo!
Aquí tienes un vistazo a los pines de Dr. Wattson (de izquierda a derecha):
- SCL — para comunicación I2C, va a Arduino Uno A5
- SDA — para comunicación I2C, va a Arduino Uno A4
- ZCD — Detección de Cruce por Cero — no usamos esta característica en este ejemplo
- Event — Indicador de evento — no usamos esta característica en este ejemplo
- GND — Conectar a Arduino GND
- VIN — Conectar a Arduino 5V
- 3.3v — Conectar a Arduino 3.3V
- GND — Conectar a Arduino GND (solo necesitas conectar uno de los pines GND)
Sketch
Bien, ahora pasemos a la programación real.
Permíteme empezar explicando el sketch. En setup(), primero configuro las comunicaciones de la tarjeta SD y de Dr. Wattson llamando a sus respectivos métodos begin().
// ver si la tarjeta está presente y puede inicializarse:
if (!SD.begin(CHIP_SELECT)) {
Serial.println(F("Tarjeta fallida, o no presente"));
// no hacer nada más:
}
wattson.begin(); // Pasar la dirección apropiada. Por defecto 0x74
// inicializar el pin digital como salida.
pinMode(LED, OUTPUT);
El botón se declara globalmente así que no tengo que hacer nada en setup para el botón.
#define BUTTON_PIN 4 // Conectar un interruptor de botón táctil (o similar)
// desde el pin 4 de Arduino a tierra.
#define PULLUP true // Para mantener las cosas simples, usamos la resistencia pull-up interna de Arduino.
#define INVERT true // Como la resistencia pull-up mantendrá el pin alto a menos que
// el interruptor se cierre, esto es lógica negativa, es decir, un estado alto
// significa que el botón NO está presionado. (Asumiendo un interruptor normalmente abierto.)
#define DEBOUNCE_MS 20 // Un tiempo de anti-rebote de 20 milisegundos suele funcionar bien para interruptores táctiles.
Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); // Declarar el botón
Mi registro de datos se hace en archivos con un nombre como DATAXX.CSV, donde XX es un número (de 00 a 99, así que 100 archivos). Verifico la tarjeta SD por nombres de archivos existentes, y elijo el último nombre de archivo sin usar — por ejemplo DATA15.CSV
char filename[] = "DATA00.CSV";
setup() {
...
// crear un nuevo archivo
for (uint8_t i = 0; i < 100; i++) {
filename[4] = i/10 + '0';
filename[5] = i%10 + '0';
if (! SD.exists(filename)) {
Serial.print(F("Archivo de datos es "));
Serial.println(filename);
// solo abrir un nuevo archivo si no existe
break; // salir del bucle! filename ahora será el que deseamos
}
}
...
}
En la función loop(), una vez que se presiona el botón, alterna la variable readData, que controla si leo los datos de energía.
void loop() {
...
myBtn.read(); // Leer el botón
if (myBtn.wasReleased()) {
// Si el botón fue soltado, cambiar el estado del LED
readData = !readData;
digitalWrite(LED, readData);
}
if (readData) {
... // leer datos y guardar en tarjeta SD, etc ...
}
}
Una vez que readData se alterna, leo los datos de energía de Dr. Wattson, y también registro el tiempo:
UpbeatLabs_MCP39F521_FormattedData fData;
int readMCPretval = wattson.readMCP39F521(&data, NULL);
unsigned long currentMillis = millis();
y lo escribo en la tarjeta SD:
// si el archivo está disponible, escribir en él:
File dataFile = SD.open(filename, FILE_WRITE);
if (dataFile) {
dataFile.print(currentMillis);
dataFile.print(",");
dataFile.print(fData.currentRMS);
dataFile.print(",");
dataFile.print(fData.activePower);
dataFile.print(",");
dataFile.print(fData.reactivePower);
dataFile.print(",");
dataFile.println(fData.apparentPower);
// imprimir también en el puerto serie:
dataFile.close();
}
// si el archivo no está abierto, mostrar error:
else {
Serial.print(F("error abriendo "));
Serial.println(filename);
}
Si el botón se alterna de nuevo, detengo la lectura/registro de datos.
¡Acción!
Una vez compilado y subido el sketch a mi Arduino, obtener datos de energía fue bastante fácil.
Conecté la carga de elección — una lámpara CFL. Quería ver el consumo de corriente y energía desde una perspectiva de arranque en frío, así como de arranque en caliente. Conecté la lámpara, pero no la encendí.
Presioné el botón en mi circuito para iniciar las mediciones de energía — cuando registraba, ¡el LED ROJO me lo indicaba! Luego encendí la lámpara CFL, y esperé hasta que pensé que tenía suficientes datos — ves, la CFL, al arrancar, consume más energía que la anunciada (en mi caso, una bombilla CFL de 14W), y luego se estabiliza eventualmente a unos 14W. Esperé hasta que las lecturas se estabilizaron. Luego presioné el botón para apagar la lectura.
Ahora podía expulsar mi tarjeta SD y empezar a mirar los datos.
PS — Para registrar datos de dispositivos adicionales, todo lo que tienes que hacer es reiniciar el Arduino — elegirá el siguiente DATAXX.CSV disponible para registrar los datos, así que puedes mantener fácilmente los datos separados.
Nota: En lugar de usar el Monitor Serie de Arduino, uso el comando "screen" integrado en mi terminal Mac como terminal serie. En mi Sketch, imprimo los datos de energía en Serie, y también emito un comando "clearscreen", así que la salida no se mueve.
Serial.write("\x1B" "c"); // Limpiar la pantalla en un terminal regular
wattson.printMCP39F521Data(&data);
Esto solo funciona en un terminal regular que pueda aceptar comandos de terminal como el anterior, y no funciona en el Monitor Serie de Arduino desafortunadamente. Sin embargo, una vez que pruebes screen, ¡quizás nunca vuelvas al Monitor Serie de Arduino!
El comando será algo como esto:
$ screen /dev/tty.usbmodem1411 9600
donde el primer parámetro es el "puerto serie", y el segundo es la velocidad que has configurado para tu conexión Serie en tu sketch de Arduino.
Graficar los datos en Excel
Como el archivo está en formato CSV, cargarlo y graficarlo en Excel fue bastante fácil. No entraré en detalles aquí, ya que hay muchos tutoriales para crear un gráfico en Excel. Inserté una fila conteniendo los encabezados de columna:
timestamp, currentRMS, activePower, reactivePower, apparentPower
(nota para mí mismo — esto será una mejora futura en mi Sketch — ¡añadir los encabezados de columna en el CSV directamente!)
Elegí los puntos de datos anteriores para registrar y graficar. El consumo de corriente a lo largo del tiempo es obviamente interesante. ¿Por qué activePower, reactivePower y apparentPower? Basado en las características eléctricas del dispositivo, puede ser una carga resistiva, una carga reactiva, o algo intermedio, y los tres parámetros de potencia nos dicen sus características generales, y también si cambian con el tiempo. O al menos eso creo…
Veamos mis resultados para una lámpara CFL desde un arranque en frío:
La corriente pica en unos 0.21 amperios antes de estabilizarse eventualmente en unos 0.18 amperios.
La potencia activa pica en unos 17 vatios antes de estabilizarse eventualmente en unos 14.2 vatios.
Después de que se estabilizó, apagué la CFL y esperé un poco, antes de volver a encenderla (de ahí la caída en la corriente en el gráfico de arriba). Puedes ver que una vez que una CFL se ha "calentado", se estabiliza rápidamente a su consumo en estado estable.
Conclusión
Hay muchos datos e experimentos interesantes que puedes hacer con datos de energía de tus electrodomésticos y dispositivos. ¡Estaba emocionado de empezar a obtener algunos datos y compartirlos contigo!
Mi objetivo con Dr. Wattson es permitir datos de energía de calidad para el Maker y hacerlos más accesibles, para que puedas usarlos como bloque de construcción para tus ideas locas y salvajes.
Dr. Wattson está diseñado para ser seguro de usar (especialmente con la carcasa), viene calibrado (para que puedas obtener datos de energía de calidad de inmediato), pero también expone funcionalidad más compleja para el usuario serio:
- rutinas de calibración
- ZCD (Detector de Cruce por Cero)
- Notificación de eventos (sobrecorriente, sobrepotencia, eventos de caída/sobretensión de voltaje)
- la capacidad de personalizar el rango de lecturas (modificando resistencias de carga y/o CT y recalibrando usando las rutinas de calibración mencionadas),
- usar múltiples Dr. Wattsons juntos con un solo MCU (cambiando la direccionamiento I2C configurable).
Si estás interesado en monitorización de energía y te gusta Dr. Wattson, por favor regístrate en (https://upbeatlabs-wattson.launchrock.com/) para mantenerte al día de noticias y actualizaciones.
Saludos,
Sridhar
Aquí tienes el Sketch completo, para tu referencia. También puedes encontrarlo y la librería Dr. Wattson, junto con una serie de otros ejemplos, en el repositorio GitHub drwattson de Upbeat Labs.
Código
Código completo del sketch disponible (incluye librería UpbeatLabs_MCP39F521, librería Button, y ejemplos en GitHub)
Esquemáticos
Esquemático disponible
Proceso de manufactura
- Dominando el Mantenimiento Preventivo: Construcción y Optimización de Programaciones Fijas y Flotantes
- Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
- Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
- Leer Temperatura y Humedad con DHT11 en Blynk – Tutorial Paso a Paso con Arduino
- Sistema Avanzado de Monitorización Doméstica con Arduino Mega y Sensores IoT
- Construye un Monitor de Energía Inteligente Fiable con Arduino UNO – Guía Paso a Paso
- Registrador GPS Avanzado: Seguimiento de Vuelo en Tiempo Real, Monitor de Altitud y Velocidad Máxima
- Construye un Sistema de Monitorización ECG y Respiración Basado en Arduino
- Construye una Brújula Digital en Tiempo Real con Arduino y Processing
- Construyendo un Autoencoder Variacional con TensorFlow: Guía Práctica
- La revolución cloud: cómo el cloud computing transforma TI, seguridad y carreras