El siguiente tutorial es una colaboración de varios amigos arduineros.
- Julio César (AKA @Jcca21) creador del hardware
- Bernando (AKA @BernaF84) creador de parte del código (envío de datos hacia el metro contador)
- Raisel Alfonso, creador del código (recepción de datos del metro contador y web)
- Fredy Mederos (AKA @fredy_mederos) creador de la apk.
Les comparto esta útil herramienta para llevar un histórico y monitoreo del consumo eléctrico de su hogar.
Resumen:
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.
Introducción:
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.
Listado de materiales para el proyecto:
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
Diagrama de conexiones:
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.
¿Cómo funciona el sistema?
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.
Programación del microcontrolador
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 } } //==========================================================================
La aplicación Kilowatts
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.
UPDATE
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:
Modo AP
- Podemos conectarnos directamente al módulo ya sea con un dispositivo móvil, una PC/laptop o desde cualquier dispositivo inalámbrico que soporte los 2.4GHz.
- El acceso a las lecturas esta disponible desde la página web alojada en el propio módulo (http://192.168.4.1).
- Utilizando la apk Kilowatt-esp8266.
- Contraseña por defecto: 12345678.
- La lectura se ejecuta: pasado el tiempo definido en la configuración, presionando el botón Leer situado en el módulo o estando en la interfaz web presionando el botón ejecutar.
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.
Modo estación sin Broker Mqtt
- El módulo se conecta a una red inalámbrica privada, solo es necesario introducir el nombre de la red y su contraseña.
- El acceso a las lecturas está disponible desde la página web alojada en el propio módulo (http://ip_asignada_por_la_red).
- Este modo depende de un servidor DHCP.
- La lectura se ejecuta: pasado el tiempo definido en la configuración, presionando el botón Leer situado en el módulo o estando en la interfaz web presionando el botón ejecutar.
- En este modo el acceso desde la apk Kilowatt-esp8266 está pendiente.
Nota: Entra de manera automática al no encontrar una configuración o conexión con el Broker Mqtt.
Modo estación con Broker Mqtt.
- El módulo se conecta a una red inalámbrica privada, es necesario introducir el nombre de la red y su contraseña.
- Este modo depende de un servidor DHCP.
- Es necesario completar todos los datos para la conexión con el Broker Mqtt.
- El acceso a las lecturas se puede realizar de la misma manera que el modo sin Broker Mqtt con la diferencia que ahora las lecturas se publicaran en el tópico definido en la configuración.
- La lectura se ejecuta: pasado el tiempo definido en la configuración, presionando el botón Leer situado en el módulo, estando en la interfaz web presionando el botón ejecutar y publicando “ask” en el tópico suscrito definido en la configuración.
- En este modo el acceso desde la apk Kilowatt-esp8266 está pendiente.
Notas generales:
- El campo contraseña se aplica para todos los modos de trabajo, por defecto es 12345678.
- El retardo del modo AP se define en segundos, solo números enteros.
- El intervalo entre lecturas se define en horas, se puede utilizar números decimales.
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
Mozilla/5.0 (Linux; Android 5.1.1; SM-J500M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36
Hola… cómo puedo conseguir uno ya fabricado??
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 OPR/75.0.3969.171
muy bueno
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
mi correo mratest82arroba gma1l todo en componentes de Iot
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Hola suplo componentes electronicos para Iot: arduinos raspberrys esp8266 esp32 etc me pueden contactar [email protected]
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Queria preguntar donde puedo adquirir el módulo wifi ESP-01.
Saludos
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
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.
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0
Bueno ya tienen el codigo, cualquier cambio que quieran hacerle y aportar comentenlo aqui