Usando una Raspberry Pi para obtener información de dos sensores PZEM004T que están conectados al microcontrolador Arduino Mega


El objetivo de este post es ver un ejemplo der cómo medir el voltaje, la corriente y la potencia con dos sensores PZEM 004T de una Raspberry Pi .

En el ejemplo los sensores no están conectados directamente a la Raspberry, pero están conectados a un microcontrolador Arduino (Mega 2560) y este se conecta a la Raspberry a través de un cable USB.

Primero obtenemos todos estos valores usando el microcontrolador Arduino con capacidad de dos puertos serie como podria ser también un ESP32 (NodeMCU) o por supuesto un Arduino Mega, y luego los enviamos a la Raspberry Pi.

Es interesante observar cómo al proporcionar los módulos PZEM004 una salida serie necesitamos usar ese protocolo para recepcionar los datos motivo por el cual precisamente utilizamos dos puertos serie del microcontrolador ( y no sería posible por tanto añadir más módulos PZEM004)

Gracias a la biblioteca PZEM-004T v3.0 para el monitor de energía Peacefair PZEM-004T-10A y PZEM-004T-100A v3.0 utilizando la interfaz ModBUS y un microcontrolador, podemos monitorizar el consumo eléctrico junto a otras variables eléctricas como la tensión , la frecuencia , el factor de potencia, etc.

Es interesante destacar que debemos usar la ultima version del modulo, pues la versión 3.0 PZEM es una versión mejorada del antiguo PZEM-004T 

Respecto a las conexiones eléctricas debemos tener especialmente cuidado en el conexionado de las clemas de BT , las cuales viene claramente especificadas en la hoja de característica del modulo PZEM que usemos, pues una parte es para la medida del voltaje ( la medición se hace en paralelo ) y la parte contigua es la parte de la medida de la Intensidad (la medida se toma en serie en versiones de menos intensidad maxima admisible, pero para la version de 100A se suele tomar con una bobina toroidal o con un pinza amperimétrica)

¡Asegúrese de que el dispositivo esté conectado a la alimentación de CA! Los 5V solo alimentan los optoacopladores, no el chip real. Además, tenga cuidado, ¡la corriente alterna es peligrosa! ¡Si no sabe lo que estás haciendo, puede morir ! Es usted responsable de su propia estupidez. Así que no sea estúpido

Peor tanto ,debemos extremar el cuidado especialmente en estas conexiones (las que van con tornillo).

Observe por ejemplo las conexiones del módulo de 100 Amp. usado para escribir este post:

Esta versión PZEM tiene una UART Serial que funciona a 5V, por lo que se debe realizar una simple modificación soldando una resistencia de 1K a 1/4W para permitir que la comunicación funcione a 3.3v en los casos de placas como Raspberry Pi, ESP32 y esp8266, con esta modificación la UART funcionará a 5v o 3.3v.

Nota: Esta es la manera más sencilla y económica si no tienen al alcance un convertidor TTL de 5 a 3.3v, pero no se garantiza que funcione en todos los casos y con todos los medidores (en el prototipo probado funciona sin problemas).

El circuito final para el montaje de los dos PZEM quedaría como se puede ver en la imagen donde vemos como los alimentamos a +5V DC desde el microcontrolador, usamos las lineas tx/rx de forma inversa hacia el microcontrolador y finalmente el microcontrolador lo comunicamos con la Raspberry pi mediante un cable USB

Como se indicó anteriormente, el primer paso es recopilar todos los valores del microcontrolador Arduino, por lo que para hacerlo debemos usar la biblioteca . Esta biblioteca se puede descargar desde la página web: https://github.com/olehs/PZEM004T como un paquete zip, luego se debe agregar dentro del IDE de Arduino

El siguiente paso es conectar los sensores al microcontrolador arduino. Usaremos la librería SoftwareSerial para permitir la comunicación serial en otros pines digitales del Arduino y poder leer más de un dispositivo serial. Entonces, los terminales RX y TX del primer sensor están conectados a los pines 11 y 10 del microcontrolador y los terminales RX y TX del segundo sensor están conectados a los pines 13 y 12 respectivamente.

Ahora es el momento de desarrollar el código en Arduino IDE de la siguiente manera:

///////////////////////////////////////////////////////// ///////////////////////////////////////////////// // /////////////////////////////////////////
 //* Código para obtener el voltaje, corriente y potencia de dos sensores AC PZEM conectados al microcontrolador Arduino Mega, luego todos los valores *//
 // se concatenan en una variable char para poder enviarla a través de comunicación serie //
 ///////////////////////////////////////////////////////// ///////////////////////////////////////////////// // ///////////////////////////////////////
  
 #include
           
 #include
           
            
  
 IPAddress ip(192,168,1,11);
 IPAddress ip1(192,168,1,10);
  
 charix[10];
 char iy[10];
 char iz[10];
 charconc[360];
  
 charix1[10];
 char iy1[10];
 char iz1[10];
  
 flotante V, V1;
 flotar i, i1;
 flotante p, p1;
  
 void setup () {
 Serial.begin(9600);
 }
  
 void loop () {
   
 PZEM004T pzem(10,11); //(RX TX)
 pzem.setAddress(ip);
 V=pzem.voltage(ip); //voltaje obtenido de la biblioteca pzem
 i = pzem.current(ip); // actual obtenido de la biblioteca pzem
 p = pzem.power(ip);//potencia obtenida de la biblioteca pzem
 dtostrf(V,7,3,ix); //función utilizada para almacenar el valor actual en la variable char ix, especificando 3 como el número de dígitos después del punto
 dtostrf(i,7,3,iy); //función utilizada para almacenar el valor actual en la variable char iy, especificando 3 como el número de dígitos después del punto
 dtostrf(p,7,3,iz); //función utilizada para almacenar el valor de potencia en la variable char iz, especificando 3 como el número de dígitos después del punto
 retraso (1000);
  
 PZEM004T pzem1(12,13); //(RX TX)
 pzem1.setAddress(ip1);
 V1=pzem1.voltage(ip1); //voltaje obtenido de la biblioteca pzem
 i1 = pzem1.current(ip1); // actual obtenido de la biblioteca pzem
 p1 = pzem1.power(ip1);//potencia obtenida de la biblioteca pzem
 dtostrf(V1,7,3,ix1);//función utilizada para almacenar el valor actual en la variable char ix1, especificando 3 como el número de dígitos después del punto
 dtostrf(i1,7,3,iy1); //función utilizada para almacenar el valor actual en la variable char iy1, especificando 3 como el número de dígitos después del punto
 dtostrf(p1,7,3,iz1); // función utilizada para almacenar el valor de potencia en la variable char iz1, especificando 3 como el número de dígitos después del punto
 retraso (1000);
  
 sprintf(conc,":%s,:%s,:%s,:%s,:%s,:%s,\n", ix,iy,iz,ix1,iy1,iz1); // función utilizada para concatenar todos los valores en una sola variable char
 Serial.write(conc);
  
 }  /////////////////////////
 

Observaciones:

  • Los sensores no se leen al mismo tiempo.
  • El tipo de los valores dados por el sensor es flotante.
  • Después de obtener todos los valores, estos se convierten de tipo flotante a char utilizando la función «dtostrf» en la que los lugares decimales se limitan a tres.
  • Los 6 valores se concatenan mediante la función «sprintf», en una única matriz de caracteres y luego se envían como datos en serie.
  • Además de poner todos los valores juntos en la matriz char, también ponemos los caracteres ‘:’ y ‘,’. Al final, la matriz de caracteres se ve así: “:val1,:val2,:val3,:val4,:val5,:val6,:”. Se hace con el fin de analizar y sacar los valores fácilmente en python.   

Después de cargar y probar el código en el microcontrolador, es hora de lidiar con el script de python. El microcontrolador Arduino debe conectarse a la Raspberry mediante un cable USB.

Antes de comenzar con el código, podría ser bueno saber cómo crear un archivo python desde la terminal de Linux. Se hace escribiendo la siguiente línea de comando:

toque PZEM_Sensors.py

Luego para abrir el archivo ya creado, debemos teclear la siguiente línea de comando:

nano PZEM_Sensores.py

import serial
 import time
 import re
  
 port = "/dev/ttyACM0"
 s1 = serial.Serial(port,9600)
  
 while True:
     if s1.inWaiting()>0:
         inputValue = s1.readline().decode() 
         m = re.search('.*:(.*),.*:(.*),.*:(.*),.*:(.*),.*:(.*),.*:(.*),',inputValue) # command used to read the information and split it between the charcaters ':' and ','
         v1 = m.group(1).replace(" ","") ## command used to saved the information splitted before in a the variable 
         i1 = m.group(2).replace(" ","")
         p1 = m.group(3).replace(" ","")
         v2 = m.group(4).replace(" ","")
         i2 = m.group(5).replace(" ","")
         p2 = m.group(6).replace(" ","")
         a = float(v1)
         b = float(i1)
         c = float(p1)
         d = float(v2)
         e = float(i2)
         f = float(p2)
         print("Voltage1:",+a)
         print("Current1:",+b)
         print("Power1:",+c)
         print("Voltage2:",+d)
         print("Current2:",+e)
         print("Power2:",+f)  


Observaciones:

  • Deberíamos especificar el puerto de la Raspberry donde está conectado el sensor. Para saberlo, solo debemos escribir el siguiente comando desde la ventana de la Terminal LX: ls /dev –> Los nombres de los dispositivos USB conectados comienzan con: “ttyUSBX”. Donde X indica el número de cada dispositivo USB conectado.
  • El puerto serie se lee y decodifica para asegurarse de que tenemos una cadena de caracteres. Se hace con la función readline() y decode() respectivamente.
  • Los seis valores se obtienen mediante el uso de expresiones regulares. Usando ‘.*:(.*),’, tomamos todos los caracteres que están entre ‘:’ y ‘,’ y luego los almacenamos en grupos.
  • Al final los valores se convierten de tipo char a tipo float.  

Después de escribir todo el código y presionar las teclas Ctrl + X, se le pedirá que lo guarde o no. Debe presionar la tecla y o n y luego Enter.

Para ejecutar el código, debemos escribir la siguiente línea de comando:

python PZEM_Sensores.py

Luego, todos los resultados y mensajes aparecerán en las ventanas de la Terminal o aparecerá un mensaje de error si hay algo incorrecto dentro del código.

La siguiente figura muestra todos los resultados obtenidos de los dos sensores PZEM. La corriente 1 es 0 debido a que no hay ningún sensor de corriente conectado y por eso la potencia 1 también es 0. Si hay algún problema de comunicación el valor que obtendremos es -1.

Mas información en https://miniprojets.net/index.php/2019/08/21/using-a-raspberry-pi-3-to-get-information-of-two-pzem004t-sensors-which-are-connected-to-the-arduino-mega-microcontroller/

Monitorización de una nevera con IoT


En este post vamos a ver una interesante idea que busca optimizar uno de los electrodomésticos que porcentualmente más consume en una vivienda: la nevera. Es un espectacular proyecto desarrollado en conjunto por G4lile0, programarfacil y Germán Martín que se presentaron como candidatos al Intel Hacks 2017.

La idea surgió de uno de los miembros del equipo, cuando un día descubrió que su factura eléctrica era demasiado alta lo cual lelo llevó a investigar para encontrar alguna forma de medir el consumo eléctrico de su casa. Encontro el sitio web de Open Energy Monitor , un sistema que permite medir el consumo eléctrico mediante Arduino . Esto cambió todo porque no dependía de terceros para hacer un análisis de sus electrodomésticos. De repente miró el refrigerador, ¿qué estaba pasando? Este electrodoméstico era el que más consumía por día en toda la casa con diferencia. Investigando más a fondo descubrió varias cuestiones interesantes sobre los frigoríficos. Pero quizás, lo más importante fue que debido al calor que se concentra detrás de estos dispositivos, su consumo eléctrico aumenta entre un 15% y un 25%.Esta fue la semilla de este proyecto.

Funcionamiento de una nevera

Hay más de 7 mil millones de personas en el mundo. Uno de cada cinco tiene un refrigerador en su casa. Eso es más de 1.500 millones de refrigeradores .

Este electrodoméstico es uno de los pocos que está encendido las 24 horas del día y los 365 días del año. Esto significa que cada frigorífico consume una media de 450 KWh al año. Si multiplicamos el número de frigoríficos en todo el mundo (1.500 millones) y el consumo anual de cada uno, el total deja 649 millones de MWh de consumo anual.

Si lo miramos desde otra perspectiva, podemos afirmar que todos los frigoríficos domésticos del mundo consumen más que un país como Alemania.

Consumo de electricidad por país Fuente wikipedia

Por tanto, suponiendo que pudiéramos reducir un 10% el consumo de todos los frigoríficos del mundo, estaríamos ahorrando un total de 64,9 millones de MWh al año. Si un KWh equivale a 0,62 kg de CO2 , evitaríamos verter a la atmósfera 42.185.000.000 kg de CO2.

El mero hecho de disponer de los datos de consumo de los electrodomésticos, hace que tu factura eléctrica se reduzca un 10%. Como veremos a lo largo de este proyecto, este dispositivo se puede utilizar para otros electrodomésticos. Esto implica que podremos tener un ahorro considerable en la factura eléctrica.

El funcionamiento de un frigorífico consiste en trasladar el calor del interior al exterior, lo cual permite que la temperatura dentro de la nevera sea mucho más baja que la temperatura ambiente de la habitación enfriando por tanto los alimentos y bebidas que hay en su interior.

funcionamiento de un frigorífico

Si no hay suficiente lugar para ser expulsado, el aire caliente que expulsa el propio aparato se condensa en la parte posterior, lo que afecta la eficiencia del compresor. Esto provoca que se necesite más tiempo para enfriar y como consecuencia, un aumento en el consumo eléctrico.

Una posible solución es ventilar la parte trasera a través de un flujo de aire fresco. Esto se puede lograr de varias formas, dando más espacio en la parte trasera o moviendo el aire con ventiladores.

funcionamiento de un frigorífico

Pero claro, todo esto no tiene sentido si no tenemos datos de consumo y temperaturas. Aquí es donde entra en juego Arduino, donde conectaremos los sensores de temperatura y consumo de energía para transmitirlos a una base de datos en la nube.

Planteado el problema y una posible solución, ya podemos intuir de lo que va el proyecto.

Cómo lo construimos

El eje central de este proyecto es el Arduino 101 . Esta placa lleva el microcontrolador Intel Curie . Es un chip pequeño pero completo. Entre sus características tiene incorporada una IMU o Unidad de Medida Inercial que cuenta con acelerómetro y giroscopio y conectividad Bluetooth a través de la tecnología BLE o Bluetooth Low Energy.

Una cosa importante a tener en cuenta con esta placa prototipo es que debe tener el firmware más actualizado posible. Esto se debe a que lo que en realidad estás haciendo es emular un Arduino.

Para actualizar el Firmware siga estas instrucciones .

Volviendo al planteamiento inicial del proyecto, debemos hacer varias cosas con el Arduino 101. Medir varias temperaturas, consumo de energía y controlar los ventiladores para generar ese flujo de aire fresco en la parte trasera del refrigerador.

En particular, tomamos la decisión de medir la temperatura de la parte trasera, la temperatura frontal, el congelador y el refrigerador. Esto nos da 4 sensores de temperatura y un sensor para medir el consumo eléctrico.

esquema general

Para la toma de datos se utilizó el sensor de temperatura DS18B20 y el sensor SCT-013 que mide el consumo eléctrico.

No es obligatorio utilizar estos modelos, se puede utilizar cualquier otro sensor similar para obtener la información de temperatura y consumo.

Sensor de temperatura DS18B20

El sensor de temperatura Maxim Integrated DS18B20 ofrece un rango de temperatura entre -55 °C y 155 °C, con una precisión de ± 0,5 °C.

El modelo que utilizamos es el comercializado como sonda estanca evitando cualquier problema en el interior del frigorífico o congelador. Este sensor utiliza el protocolo de comunicación de 1 cable de Maxim Integrated que permite la conexión simultánea de más de 100 sensores a través de un solo pin.

DS18B20

Sensor de consumo eléctrico SCT-013

Para medir el consumo, utilizamos un sensor de corriente no invasivo. Así que no nos preocupamos por tener que alterar demasiado el cable de alimentación del frigorífico. Lo único que tenemos que hacer es pelar el cable y abrazar solo uno de los dos cables de alimentación, vivo o tierra.

Este tipo de sensores se conocen como Transformadores de Corriente y uno de los más comunes es el SCT-013. Operan bajo el principio de inducción electromagnética. La salida de estos sensores es una intensidad proporcional a la que pasa por un cable o circuito eléctrico.

Hay dos tipos de sensores, que proporcionan una corriente o un voltaje. Lo mismo que usas, pero el más sencillo es el que nos ofrece un voltaje.

SCT-013

Aficionados

Finalmente conectaron ventiladores. Teniendo en cuenta el consumo, las dimensiones y el ruido que pueden generar. Podemos usar cualquier modelo, pero debemos estar muy atentos a estos componentes ya que hay diferentes modelos para diferentes usos y no todos valen. La idea es poder adaptar el proyecto para utilizar los típicos ventiladores de los ordenadores ya que consumen muy poco y son muy económicos. Los que están probando a José Manuel y Germán son tipo Boxer Fan.

VENTILADOR DEL BOXEADOR

Conexión de Arduino 101 a Internet

Aunque, como decía, es una placa muy robusta y muy útil, el gran inconveniente es que no tiene conexión a Internet. Esto nos obligó a buscar soluciones para enviar toda la información adquirida a una plataforma en la nube .

Hay diferentes opciones como usar Bluetooth para conectarse a otro dispositivo que tenga conexión a Internet. Pero quizás lo más sencillo y económico que encontramos fue utilizar un NodeMCU .

Este kit de desarrollo está basado en el ESP8266 y es muy fácil de usar (es compatible con el IDE de Arduino) y tiene un precio muy económico y tiene una librería para configurar WiFi como WiFiManager

Toda la lógica del proyecto reside en el Arduino 101 y NodeMCU solo hace de puente entre la placa e Internet.

NodoMCU

Envía información a la plataforma en la nube

Los datos deben ser visibles en tiempo real en todo momento. Solo así comprobaremos si el proyecto es viable y podemos tomar las decisiones adecuadas.

Como plataforma en la nube los creadores de este proyecto eligieron Firebase , pues una de sus ventajas es que es muy fácil de usar gracias a la API REST que incorpora. Con solo una llamada HTTP podemos almacenar los datos obtenidos de temperatura, consumo y uso de los ventiladores. Todo esto se envía en formato JSON. Por lo tanto, la integración entre Firebase y NodeMCU es instantánea.

La base de datos de Firebase

Las características que buscaban sus creadores para integrar un servicio en la nube en este proyecto son la facilidad y el costo. En la actualidad son muchos los servicios que podemos llegar a utilizar como Thingspeak, ThingerIO o el propio Arduino Cloud. Todo puede ser una buena elección.

Firebase tiene a su favor de que dispone de APIs para muchos lenguajes de programación entre los que se encuentra JavaScript.

La base de datos tiene limitaciones ya que es una cuenta gratuita.

  • No permite más de 100 conexiones simultáneas.
  • Tienes un límite de 1 GB de almacenamiento.
  • Tienes un límite de 10GB de descarga.

Con todo esto, el proyecto tras un mes de recogida de datos cada minuto de dos frigoríficos, tenemos un consumo de almacenamiento de 3,9 MB y 158,4 MB de descarga.

Usar base de datos

Aplicación web para visualización de datos

Con todo previamente montado, ya no queda nada para ver la información de manera amigable en cualquier dispositivo.

Si queremos monitorizar los datos en tiempo real, desde cualquier parte del mundo y cualquier dispositivo, una de las opciones más rápidas es crear una aplicación web.

Firebase tiene una API de Javascript que hace que sea muy fácil integrar una base de datos de esta plataforma en una página web.

Además, se puede agregar el marco Bootstrap para que responda utilizado una plantilla abierta para este marco, SB Admin 2 .

Todo esto ha dado como resultado un sitio web que se puede ver en www.iotfridgesaver.com . Consta de dos pantallas.

La pantalla inicial muestra un mapa de Google donde iremos ubicando los diferentes frigoríficos que se utilizan.

Inicio web IoT Fridge Saver

Una vez que encuentres el que deseas consultar, solo dale al icono y hacemos clic en info. Desde aquí se puede acceder al histórico de temperatura, consumo y uso de ventilador.

Histórico

Desafíos

Han sido muchos los retos a los que nos hemos enfrentado en este proyecto. Primero la integración de una placa sin conexión a Internet que resolvieron usando una placa basada en ESP8266 como NodeMCU. Quizás haya una solución mucho mejor, pero la más simple y rápida fue esta.

A la hora de realizar la ventilación trasera, el problema es principalmente cómo hacer que fluya aire fresco para bajar la temperatura.Han seguido diferentes fases para decidir cuándo encender los ventiladores.En una primera fase han hecho una recogida de datos para analizar la información. Luego se activan manualmente para verificar qué sucede en ciertas situaciones. Esto les llevó a pensar que la diferencia de temperatura entre la parte trasera y la delantera era un buen indicador de un alto consumo.

Diferencia de temperatura.

Sin embargo, mientras recopilában datos, se dieron cuenta de que el mejor momento es cuando se activa el compresor y al mismo tiempo aumenta la temperatura trasera lo cual es mucho más fácil en términos de programación controlar esta situación pues sin duda, la temperatura trasera está íntimamente ligada a la actividad del compresor.

Las primeras pruebas muestran que puede haber una mejora de la eficiencia energética de alrededor del 20 % al activar el flujo de aire lo cual verificaron que, cuando el soplador mueve el aire detrás del refrigerador, la actividad del compresor y la velocidad de reducción de la temperatura interna se reducen significativamente.

Efecto de la eficiencia del soplador

Logros de este proyecto

En el equipo está muy orgullosos de haber logrado un sistema que es capaz de dos tareas. Por un lado controlar parámetros ocultos de los frigoríficos a los usuarios. Por otro lado se han podido minimizar el consumo eléctrico en determinadas condiciones.

En una primera etapa, fue difícil asignar sensores de temperatura a cada punto de medición. Tuvieron que verificar sus direcciones de hardware para identificarlos y escribirlo en el código fuente. Ahora, usan diferencias de temperatura para identificar sensores automáticamente. Esto facilita la configuración del sistema. No cabe duda de que aún queda mucho camino por recorrer en este proyecto, pero con el solo hecho de tener toda esta información pueden ayudar a las personas a reducir el consumo de sus electrodomésticos.

Con solo aplicar algunas modificaciones a la instalación, podemos reducir su consumo. Pero todo esto no es posible si no disponemos de datos analíticos que lo corroboren. Aquí es donde entran en juego las tecnologías abiertas. Nos dan la posibilidad de crear dispositivos que se adapten a nuestros requerimientos. Sin estas tecnologías nada de esto sería posible.

También han encontrado que puede haber grandes diferencias en el consumo de diferentes refrigeradores de modo que este este proyecto puede ayudar a identificar los modelos más eficientes.

El consumo puede ser muy diferente

Solo si conocemos el mundo que nos rodea, podemos cambiarlo .

Finalmente han creado un video explicando el funcionamiento de su proyecto

Mas Informacion en https://devpost.com/software/freeze-optimizer