Monitoriza el Consumo Energético con Modbus, MKR WiFi 1010 y RS485
Componentes y suministros
| Arduino MKR WiFi 1010 | ×1 | |
| Arduino MKR 485 Shield | ×1 | |
| Cable USB-A a Micro-USB | ×1 | |
| Fuente de alimentación USB | ×1 | Cualquier fuente compatible. El shield MKR485 tiene un buck converter 7-24V integrado. |
| Cable trenzado par simple blindado | ×1 |
Herramientas y máquinas necesarias
- Multímetro digital Digilent Mastech MS8217
- Tijeras de electricista
- Destornillador plano pequeño (para terminales MKR485)
- Destornillador Phillips mediano
Aplicaciones y servicios en línea
- Home Assistant
- Arduino Web Editor
- MQTT
Sobre este proyecto
Si realmente quieres hacer tu hogar más inteligente, probablemente querrás empezar por tus facturas mensuales (energía, gas, etc...). Como dicen algunos, Bueno para el Planeta, la Cartera y el Balance Final. ¡El hardware de código abierto es nuestra forma de alcanzar la sostenibilidad en el entorno doméstico! Esta idea nos llevó a construir una solución simple y segura, fácil de integrar con cualquier software de domótica ya que expone datos sobre MQTT (en nuestro caso te mostraremos cómo integrarlo en Home Assistant).
Visión general
Para medir el consumo de energía eléctrica, elegimos el Medidor de Energía Finder, ya que está diseñado para uso en carril DIN y encaja perfectamente en el cuadro eléctrico principal de nuestra casa. Lo genial de este producto es que tiene una interfaz RS485 Modbus, un protocolo de comunicación estándar industrial que facilita hablar con un Arduino. De hecho, Arduino ha lanzado un shield oficial, el MKR485 y dos librerías para decodificar el protocolo. Como placa principal, elegimos el Arduino MKR WiFi 1010, ya que comparte el factor de forma MKR y tiene conectividad WiFi.
Instalación
¡Advertencia! Verifica las regulaciones de tu país sobre manipulación del sistema eléctrico de tu casa y ten extremo cuidado porque puede ser mortal. Si no sabes cómo hacerlo, llama a un electricista. El primer paso es instalar el medidor en tu cuadro eléctrico. Para asegurar un entorno de trabajo seguro, corta la alimentación desde el borne eléctrico anterior a tu sistema y verifica con el multímetro que no hay tensión entre los bornes.
Luego coloca el medidor de energía dentro de tu cuadro y conecta los cables de fase y neutro del interruptor principal a la entrada del medidor, recuerda usar la convención de colores (azul para neutro y marrón/negro/gris para fase en UE). La salida debe conectarse al resto del sistema.
¿Listo? Es hora de atornillar la conexión RS485. Usaremos cable trenzado de par simple con tierra, típico para líneas telefónicas. Con este cable puedes transmitir a larga distancia (1.2 km). Sin embargo, solo usamos un cable lo suficientemente largo para salir del cuadro y colocar el Arduino en un lugar accesible.
La interfaz RS485 nombra sus terminales A, B y COM.
Como el shield MKR también soporta Full Duplex, verás dos terminales más, Y y Z. Aquí vamos a atornillar el otro extremo del cable, ya que sabemos por la hoja de datos que la comunicación half-duplex ocurre solo en los terminales Y y Z. El terminal COM debe conectarse a ISOGND. Como usamos una conexión half-duplex y el cableado es punto a punto, debemos configurar los switches en el shield MKR485 para que coincidan con nuestra configuración: ponemos HALF (2 a OFF) y terminación en Y-Z (3 a ON); el primero no importa. La terminación es una resistencia que conecta los dos terminales de datos, para amortiguar interferencias.
Esto es todo. Ahora puedes cerrar el cuadro y centrarte en el lado del software.
Software
Enciende tu computadora y abre tu IDE. Puedes usar Arduino IDE o Arduino Create Editor. El código cumple con los siguientes requisitos:
- Comunicación Modbus
- Gestión WiFi
- Protocolo MQTT
Modbus es un protocolo abierto para sensores y máquinas industriales. Para hacer que Arduino hable Modbus, vamos a usar la librería Arduino Modbus. Esta librería empaqueta todos los manejadores y hace que conectar cualquier dispositivo Modbus sea muy rápido. Como vamos a leer registros, siguiendo la hoja de datos del medidor, podemos encontrar toda la información que necesitamos como códigos de función, dirección del registro y tamaño del registro en palabras. Pero para hacerlo más claro, expliquemos cómo funciona Modbus:
Los mensajes Modbus siguen una estructura simple:
01 03 04 00 16 00 02 25 C7
0x01es la Dirección del Dispositivo0x03es el Código de Función que dice al dispositivo si queremos leer o escribir datos (en este caso leer holding registers)0x04para Conteo de Bytes00 16- Enviamos 4 bytes de dirección de registro (00 16) que dice al dispositivo qué queremos leer00 02- Luego el tamaño del registro (00 02) en palabras (cada palabra son 2 bytes)- Últimos 4 bytes son código CRC. Este código se genera de una función matemática sobre los bytes previos, asegurando que el mensaje se recibió correctamente.
En Arduino todo esto se maneja en la condición if:
// Creado por Alberto Perro - Officine Innesto
// Leer entero desde un dispositivo modbus holding registers
float readCurrent(){
float ampere = 0.;
// siguiente comando formatea la petición y la envía por RS485
if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) {
// Manejo de errores
Serial.print("fallo al leer voltaje! ");
Serial.println(ModbusRTUClient.lastError());
} else {
uint16_t word1 = ModbusRTUClient.read(); // leyendo MSW del buffer
uint16_t word2 = ModbusRTUClient.read(); // leyendo LSW del buffer
int32_t milliamp = word1 << 16 | word2; // unir palabras para recuperar int
ampere = milliamp/1000.0; // convertir a amperios
}
return ampere;
}
En la parte else tenemos el manejador de respuesta.
Como este registro tiene dos palabras de largo, tenemos que unirlas con matemáticas binarias. Leemos las palabras del buffer y las guardamos en un entero sin signo de 16 bits (2 bytes o una palabra), luego las unimos en un entero con signo de 32 bits desplazando la primera palabra a la izquierda y aplicando un OR sobre la segunda palabra. Así recuperamos la medición de corriente en mA, dividiéndola por 1000 tenemos la corriente en amperios.
Este mismo proceso se adapta a todo lo que queramos leer.
El resto del código está dedicado a manejar MQTT y redes WiFi.
Integración con Home Assistant
Añadir el medidor a Home Assistant es bastante directo. Asumiendo que tienes un broker MQTT configurado (aquí está la guía), todo lo que necesitas hacer es añadir nuevas definiciones bajo el archivo configuration.yaml.
sensor:
- platform: mqtt
name: "Voltaje Principal"
state_topic: "energy/main/voltage"
unit_of_measurement: "V"
Aquí pones el nombre de la medición, el tema MQTT para leer y la unidad de medida de la cantidad. Guarda el archivo, verifica la configuración y recarga Home Assistant, ahora las mediciones aparecerán en la página principal.
Home Assistant se encargará de crear gráficas y automatizar procesos disparados por tus lecturas. Este tutorial ha terminado, ¡ahora depende de ti añadir funciones y personalizarlo para tus propósitos!
Código
Puente Modbus RTU a MQTT para Finder
Este sketch proporciona un puente completo entre el medidor de energía Finder y MQTT. Desarrollado para monitorizar costos y uso de electricidad en Casa Jasmina.
Proceso de manufactura
- Construya un robot con streaming de vídeo controlado por Internet con Arduino y Raspberry Pi
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Construye un Monitor de Energía y Registrador de Datos Fiable con Arduino – Guía Paso a Paso
- Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
- Servidor Web Arduino Uno WiFi: Controla un LED desde el Navegador
- Arduino UNO + Shield WiFi: Visualización de Temperatura en Tiempo Real en Web vía Serial
- Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
- Energía cinética y potencial: fórmulas, formas y ejemplos cotidianos