El siguiente tutorial es una colaboración de varios amigos arduineros.
Les comparto esta útil herramienta para llevar un histórico y monitoreo del consumo eléctrico de su hogar.
En mi país (Cuba) se está llevando a cabo un ordenamiento de la economía por lo que los salarios aumentaron, pero también el precio de los servicios y la vida. Ahora se preguntarán, ¿qué tiene que ver esto con Arduino? Pues que el costo de la corriente subió y es de vital importancia llevar un monitoreo del consumo del hogar para saber cuándo debemos ahorrar. Aquí les mostrare como crear un lector por IR (infrarrojos) para ser usado en metro contador de corriente.
En Cuba existen varios modelos de metro contadores. Los más comunes son:
CHINT DDS666 CICLOMETRICO: Medidor monofásico bifilar y trifilar (electrónico) DDS666 / DDS666p marca CHINT.
Debido al alto consumo del sector estatal, cuenta propista y al fraude eléctrico creciente en el sector privado el país comienzo una migración de metros contadores a una versión con infrarrojo. Esta versión es más difícil de violar y hacer fraude en su lectura. La Unión Nacional Eléctrica (UNE) comenzó el cambio a metros contadores infrarrojos en municipios como Trinidad (Sancti Spíritus), Varadero (Matanzas) y Playa (La Habana), con altos índices de consumo y gran concentración de trabajadores por cuenta propia.
CHINT DDS666 CICLOMETRICO: Medidor monofásico bifilar y trifilar (electrónico) DDS666 pantalla LCD y lector infrarrojo.
Que propone este proyecto?
Crear una interfaz electrónica basada en el módulo wifi ESP-01, cuyo componente principal es el microcontrolador ESP8266 capaz de leer los pulsos infrarrojos en forma no invasiva que emite el metro contador. Enviar esta información vía wifi hacia su móvil donde será leído por una aplicación(Kilowatts). Dicha aplicación en Android(apk) guardara las lecturas para su monitoreo y auditoria, permitiéndonos tener una idea del consumo diario además de una predicción del consumo mensual. Al proyecto le he llamado IReader por lo que en lo adelante me refiero a él con su nombre.
1 x Esp-01 v090
Resistencias:
4 x 10 Kohms
1 x 2,7 Kohms
1 x 10 ohms
1 x 100 ohms
Transistor:
1x Transistor PNP (2N3905) o similar
Diodos:
1 x Diodo IR (el de cualquier mando a distancia nos sirve)
1 x Módulo sensor receptor IR infrarrojo 38kHz/Diodo LED VS1838B o similar que se alimente con 3.3 v
o en forma de módulo de Arduino
Regulador:
1 x Micro Fuente DC-DC 5v a 3.3v. AMS1117-3.3 800mA o el AMS1117-3.3 suelto
NOTA: Si se usara el IR TSOP1738 deben alimentarlo con 5v
Para facilitarles la vida hice el diseño y la creación del PCB en kicad y les dejo los archivos aquí. El encapsulado del pcb y la ubicación del dispositivo para hacer las lecturas es a gusto de ustedes. Realmente queda muy pequeño el diseño sobre todo porque el esp-01 es de solo 14.3 x 24.8mm. Así que les será muy fácil de ubicar en una forma no invasiva frente al sensor IR del metro.
Una muestra de un prototipo construido sobre un tablero perforado.
El metro-contador digital marca CHINT, modelo DDS666, dispone de una interfaz infrarroja de comunicaciones, basada en el protocolo serial 1200_7E1, a través de la cual se puede obtener, entre otros datos, la lectura actual, posibilitando el monitoreo automatizado del consumo eléctrico.
En esencia, el programa cargado al ESP-01 implementa un punto de acceso, AP por sus siglas en inglés, que hospeda un pequeño servidor web cuya respuesta a las peticiones de los clientes, es una página web simple que contiene el identificador del contador y la lectura actual. El programa fue desarrollado sobre la plataforma Arduino.
El microcontrolador ESP8266, además de soportar la implementación del protocolo TCP/IP, dispone de varios pines de entrada-salida y de un par de UARTs, que se pueden usar en diferentes aplicaciones. El móvil debe estar conectado, por wifi, al AP creado en el ESP-01 y cuyo SSID es «METRO». Cuando el apk Kilowatts (cliente) hace la petición de lectura al servidor web hospedado en el AP, la interfaz electrónica envía el comando LEER_CONTADOR, a través de un LED infrarrojo, hacia el metro-contador. Después de una breve negociación o «handshaking» con la interfaz, el contador responde con una serie de datos que se reciben en el módulo IR cuya salida está conectada al pin RX del ESP-01. Los datos correspondientes al ID del contador y a la lectura actual, se incorporan a la página web, la cual es devuelta al cliente, es decir, al apk Kilowatts.
En el código está definido un AP (access point) con el cual nos conectaremos a la apk Kilowatts. Donde el SSID es METRO y la clave por defecto es 12345678. La ip también esta por defecto y es la 192.168.4.1 y el puerto usado es el 80. Las variables que se manejan son el ID del metro y la lectura en Kwh. Tiene embebida una web muy simple en la cual podemos leer los valores del metro. Dicha web es la que encuesta el apk Kilowatts. Dentro del código también esta la forma de generar una frecuencia de 38kHz por TX1(TX1 –> GPIO2) para controlar el led IR y transmitir la secuencia de LEER y de ACK. En este enlace se explica cómo programar un esp-01 usando un fichero binario que le programaremos a nuestro IReader sino desean compilarlo ustedes. Aqui les dejo el código que finalmente decidieron compartir.
#include <ESP8266WiFi.h> const char *ssid = "METRO"; const char *pass = "12345678"; //Debe tener 8 caracteres como mínimo String ID; String Kwh; String Invert; WiFiServer server(80); void setup() { uint32_t ip = 0x0104A8C0; // 192.168.4.1 IPAddress subnet = {255, 255, 255, 0}; Serial.begin(1200, SERIAL_7E1); //---------------------------------------- Serial1.begin(76923, SERIAL_6N1); //Configuración UART1 (TX1 --> GPIO2) //---------------------------------------- WiFi.mode(WIFI_AP); WiFi.softAP(ssid, pass); WiFi.softAPConfig(ip, ip, subnet); server.begin(); } void ask() { //char ACK[] = {0x06, 0x30, 0x32, 0x30, 0x0d, 0x0a}; boolean found = false; ID = ""; Kwh = ""; Invert = ""; Serial.flush(); //------------------------------------------ Tx_CmdLeer(); //Serial.println("/?!"); //------------------------------------------ String line = Serial.readStringUntil('\n'); while (line && line.length() > 0) { if (line.equals("/ZTY2ZT\r")) found = true; line = Serial.readStringUntil('\n'); } if (found) { Serial.flush(); //------------------------------------------- Tx_ACK(); //Serial.write(ACK, 6); //------------------------------------------- line = Serial.readStringUntil('\n'); while (line && line.length() > 0) { int start = line.indexOf("96.1.0("); if (start != -1) { start += 7; int end = line.indexOf(")", start); if (end != -1 && end - start == 12) { ID = line.substring(start, end); } } else { int start = line.indexOf("1.8.0("); if (start != -1) { start += 6; int end = line.indexOf("*kWh)", start); if (end != -1 && end - start == 9) { Kwh = line.substring(start, end); } } else { int start = line.indexOf("2.8.0("); if (start != -1) { start += 6; int end = line.indexOf("*kWh)", start); if (end != -1 && end - start == 9) { Invert = line.substring(start, end); } } } } line = Serial.readStringUntil('\n'); } } } void loop() { WiFiClient client = server.available(); if (client) { String line = client.readStringUntil('\n'); while (line && line.length() > 0) { line = client.readStringUntil('\n'); } client.flush(); ask(); String s = F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" /><title>Metro</title></head><body>"); s += F("<table align=\"center\" border=\"0\"><tr><th align=\"right\" scope=\"col\">ID:</th><th scope=\"col\">"); s += ID; s += F("</th></tr><tr><td align=\"right\">Value:</td><td>"); s += Kwh; s += F("</td></tr><tr><td align=\"right\">Invert:</td><td>"); s += Invert; s += F("</td></tr></table></body></html>"); client.print(s); } } //========================================================================= // AGREGADO /*========================================================================= 0x15 es el número mágico para generar una frecuencia de 38kHz por TX1 con esta configuración (serial1_76923_6N1). 8 es el número mágico para la cantidad de 0x15 que hay que transmitir para un tiempo de 833 us, el bitTime de 1200 baudio. Este paquete de 38 kHz, corresponde al 0 y una demora de 833 us, corresponde al 1. Tx_0(): Transmite por TX1, una frecuencia de 38 kHz, durante 833 us, correspondiente a un bit en estado CERO Tx_CmdLeer(): Transmite la secuencia de LEER ("/?!") Tx_ACK(): Transmite la secuencia de ACK ("\6020") Tx(byte *sec, byte n): Transmite una secuencia de n bytes modulando la señal IR (38 kHz) *///====================================================================================== void Tx_0() { byte ir38[] = {0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15}; Serial1.write(ir38, 8); Serial1.flush(); } // void Tx_CmdLeer() { //Ya incluye el bit de paridad byte sec1[] = {0xAF, 0x3F, 0x21, 0x8D, 0x0A}; Tx(sec1, 5); } // void Tx_ACK() { //Ya incluye el bit de paridad byte sec2[] = {0x06, 0x30, 0xB2, 0x30, 0x8D, 0x0A}; Tx(sec2, 6); } // void Tx(byte *sec, byte n) { for (byte j = 0; j < n; j++) { Tx_0(); //StartBit del byte for (byte i = 0; i < 8; i++) { // Cada bit del byte if (bitRead(*sec, i)) delayMicroseconds(832); else Tx_0(); } delayMicroseconds(832); //StopBit del byte sec++; //Próximo byte } } //==========================================================================
Ya por último referirme a esta magnífica aplicación, una de las mejores que visto en todos los sentidos y creada por un cubano (Fredy Mederos). Dicha apk puede ser descargada tanto desde la tienda de google(google store) como de la tienda cubana (apklis). Pero la versión que poseen ambas no tiene la opción de leer nuestro IReader. Pero generosamente el creador nos dio una versión modificada para la lectura del IReader. Conectamos nuestro móvil al AP METRO y usamos la contraseña por defecto. Una vez conectada se agrega la lectura del metro con solo oprimir un botón.
Espero que los entusiastas a la electrónica que posean un metro contador con la opción de sensor IR no dejen pasar esta oportunidad. Con este tutorial le doy las gracias a esas personas anónimas que sin muchos recursos saben ingeniárselas y crear proyectos útiles. En los comentarios espero ver sus dudas y sobre todo fotos de sus IReaders. Si modifican el codigo, lo mejoran o le insertan opciones extras por favor compartir con nosotros en los comentarios, y le iremos incluyendo sus mejoras al tutorial.
Bueno esta será la primera mejora del proyecto llevada a cabo por Anatoli Josenovich (AKA @venenodcuba) que compartió con nosotros. El proyecto fue mejorado para convertirlo en una unidad modular que consta de unidad control o principal y una unidad de lectura donde está el IR. Se separo el diseño para su comodidad de ubicación en el metrocontador. Se le mejoro la web embebida y se le agregaron modos de trabajo. En la página principal de la web se muestra el ID del metro contador, las lecturas, el nombre del host y la intensidad de la señal en la conexión Wifi.
Al oprimir el botón Lectura se realiza una lectura actual en el metro contador, el botón Configurar nos envía al panel de configuración del módulo. En el panel de configuración nos encontramos con las diferentes opciones disponibles para el funcionamiento del módulo que más se acomode a cada escenario.
Existen 3 modos disponibles:
Nota: Opción por defecto. Entra de manera automática al transcurrir el tiempo definido en la casilla “Retardo AP” al no lograr una conexión en modo estación.
Nota: Entra de manera automática al no encontrar una configuración o conexión con el Broker Mqtt.
Notas generales:
El botón de reset se puede deshabilitar, recordar bien la contraseña ya que si deshabilita dicho botón no podrá resetear la configuración del módulo.
A continuación, los esquemáticos de la unidad principal y de lectura:
El listado de componentes así como esquemas y diseño de PCB se los dejo aquí.
El Código y la Web embebida aquí.
Asi luce esta nueva version del IReader:
Como pueden apreciar es una versión más completa y más componentes.
Finalmente les estaré dejando los updates de la apk Kilowatts. En esta última versión se le agrego compatibilidad para este nuevo modelo del IReader el dato ya no se entrega en forma plana. También como extra ya podrán agregar la IP de nuestro IReader sin tener que usar una fija.
NOTA: Si están usando el código sencillo de la primera versión en la configuración de la IP solo especificaran la IP del IReader. Si están usando la versión más modular de @venenodcuba entonces la configuración seria como en la siguiente imagen. (IP/ask_env)
Alex out
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…
La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…
Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…
Percona Monitoring and Management (PMM) es una herramienta de código abierto para la supervisión y…
Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…
Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…
View Comments
Hola... cómo puedo conseguir uno ya fabricado??
muy bueno
mi correo mratest82arroba gma1l todo en componentes de Iot
Hola suplo componentes electronicos para Iot: arduinos raspberrys esp8266 esp32 etc me pueden contactar mrates82@gmail.com
Queria preguntar donde puedo adquirir el módulo wifi ESP-01.
Saludos
Agregar la configuración de la wifi para poder ponerlo en modo estación y conectarlo a la red local, así no tener que cambiar de conexión entre la red wifi de la casa y el MetroWifi, contar también con la opción de poder enviar los datos a un servidor MQTT ya estaríamos hablando de un módulo que se puede integrar perfectamente a la domótica.
Bueno ya tienen el codigo, cualquier cambio que quieran hacerle y aportar comentenlo aqui