Medidor de Consumo Eléctrico CHINT + ESP8266 y Matrix Led MAX7912


En esta post  volveremos a un tema recurrente en este blog: la medición del consumo eléctrico de forma invasiva en un ambiente doméstico ,pero esta vez  usaremos  el  medidor CHINT DDS666,lo que técnicamente es un medidor residencial o residencial tradicional  pero con  una salida óptica  (también llamada   salida de pulsos)-

Precisamente por esa característica  de salida óptica, dado que en el mercado existe una amplia variedad de dispositivos con este tipo de salida   , esta propuesta que vamos a ver es perfectamente viable  también para  todo tipo de contadores con salida de pulso, como la mayoría de los contadores modernos  para uso personal  que se comercializan para fijar en carril DIN en el cuadro de distribución de c.a. cuya velocidad de flash de salida de prueba es de  500 impulsos por kWh ( es decir cada impulso corresponde a un 2W/H)

Lógicamente dado que la relación de pulsos/kwh  es diferente  según el contador , tendremos que ajustar el código de nuestro  programa para que el resultado sea exacto , pero insistimos: como esta relación es conocida  no es demasiado complejo ajustar   el código para el contador que elijamos

Advertencia: Se recomienda precaución ya que este tipos de proyectos implican riesgo eléctrico o electrocución ya que se utiliza un  equipo conectado de 220VCA -120 VCA por los que  se requieren conocimientos básicos  de electricidad , por favor esté documentado previamente en este sentido.

Conviene recordar que por seguridad cuando trabaje en cuadros de baja tensión siempre trabaje cortando la alimentación general y asegúrese después con un polímetro o un busca-polos que efectivamente no hay tensión c.a.

Obviamente si no se tiene experiencia en cableados de baja tensión o no esta seguro de la instalación , le  recomendamos encarecidamente  que este tipo de trabajos lo realice un instalador  o un electricista pues  manejar por error tensiones de ca puede ser peligroso  .

 

El circuito

 

El viejo modelo CHINT DSS66 permite la medición de energía activa o potencia activa en instalaciones domésticas. Es  un registrador ciclométrico, registrando medidas siempre positivas que evitan pérdidas fraudulentas de conexiones. Como se trata de un medidor invasivo que se requiere para abrir nuestro circuito eléctrico, se capturan los pulsos generados, Genera 3200 imp / kWh, que nos permitirá medir la potencia y el consumo de energía. El medidor tiene un optoacoplador para aislar la salida de pulso para realizar la medición. 

 Algunos medidores tienen una salida de pulso asociada con el consumo eléctrico, en el caso de este medidor específico, cada vez que se enciende el diodo led frontal, envía un pulso que activa un optoacoplador para la salida de pulsos terminales (11 +) (12 -) y el medidor integrado realiza la medición e integración de kilovatios / hora y enviando pulsos según el consumo siendo la relación de  este medidor  de 3200 imp “impulsos” / kwh,.

Este medidor tiene 2 características:

  • Es invasivo, es decir el circuito debe abrirse para colocar en serie el medidor entre la fuente y la carga
  • No tiene un protocolo de comunicación en serie, siendo la relación de salida de pulsos de 3200imp / kwh.

Gracias a la ayuda de un microcontrolador “Arduino, ESP8266 o ESP32”  podemos medir los watios consumidos. La elección precisamente de un  ESP8266 12E   o Arduino Nano Clone   , de hecho dependerá de si necesitamos enviar los datos  o no a un servidor en la nube  o simplemente queremos mostrar la información en un display 

Como contábamos al   principio de este post el modelo  DSS66 es algo anticuado por lo que es perfectamente viable usar   de contadores con salida de pulso de carril DIN , como la mayoría  que se comercializan para fijar en el cuadro de distribución de c.a. cuya velocidad de flash de salida de prueba es de  500 impulsos por kWh ( es decir cada impulso corresponde a un 2W/H)

 

 

Durante las primeras pruebas  se conectaron el GPIO directamente al medidor,dado que el medidor de mentón tiene su propio optoacoplador, pero por alguna razón cada vez que se genera un pulso, el módulo ESP8266 grababa 2 pulsos, algo que no sucedió con Arduino .

La solución para el problema es  aislar la salida del watímetro mediante la adición de un optoacoplador 4n25 y una fuente de alimentación de 5v :de esta manera sólo llegaría un pulso y ademas por seguridad se aislan los circuitos .

Para las primeras  pruebas   se propone usar un  ESP8266 y/o arduino y solo  haremos la medición de Active Power, por ejemplo  utilizando una  bombilla de 45W, para tener una carga fija que represente un “hogar”.

 

Lista de componentes

 

 

Código IDE de Arduino

 

El código para el módulo ESP8266 por ahora no tiene ninguna rutina de comunicación de envio  hacia  el Cloud, así que por el momento visualizaremos la potencia con un Matrix led x4 MAX7912 pero se puede usar un display de 7 segmentos  o  simplemente la salida serie

El medidor solo tiene una salida de pulso,por lo que  para realizar el cálculo del consumo eléctrico, capturamos a través de una interrupción en el GPIO 5 (D1), técnicamente utilizando el factor apropiado del medidor 3200imp / kWh = 3.2, se calcula la potencia activa instantánea.

Una diferencia horaria entre pulsos y basada en 1 hora = 3600 s. potencia = (3600000000.0 / (pulseTime – lastTime)) / 3.2

Este cálculo se realiza en la interrupción, solo cada vez que se registra un nuevo pulso.

Inicialmente, gracias a OpenEnegyMonitor, por la documentación, el cálculo se tomó de una de las versiones anteriores de su página

 

Este es el codigo usado para probar la funcionlidad 


#include <SPI.h>
#include <bitBangedSPI.h>
#include <MAX7219_Dot_Matrix.h>
const byte chips = 4;

unsigned long lastMoved = 0;
unsigned long MOVE_INTERVAL = 20; // mS
int messageOffset;
int counters=0;


// 12 chips (módulos de pantalla), SPI de hardware con carga en D10


MAX7219_Dot_Matrix display (chips, 2); // Chips / LOAD

char message [64] = “mensaje  a mostrar inicial ….“;
char myCharMessage[64];
String Message;

// Número de pulsos, utilizados para medir la energía.
long pulseCount = 0;


// Se usa para medir la potencia.
unsigned long pulseTime,lastTime,diffTime;
long timeout_reset=0;


//power and energy
double power elapsedkWh,watts;

// Número de pulsos por wh – encontrado o configurado en el medidor.

//1000 pulsos/kwh = 1 pulso por wh 3200 imp = 3.2

float ppwh = 3.2     ; 

int First_pulse = 0;
///***********************************************************************************


const byte interruptPin = 5; /// pin 5 D1


#include <Ticker.h>
Ticker flipper;


void flip() /// displayed
{

//bucle para almacenar en un array el mensaje de bienvenida

for (int i=0;i<64;i++)
{
message[i] = myCharMessage[i];
}
updateDisplay ();

}

 

 

Y este es el cuerpo del programa_

void setup ()
{
pinMode(interruptPin, INPUT_PULLUP);    //define el pin como entrada binaria
attachInterrupt(digitalPinToInterrupt(interruptPin), onPulse, FALLING);
Serial.begin(115200);
display.begin ();
} // end of setup


//
void onPulse()
{
if(First_pulse<2){ First_pulse++; }

else {
/// se usa para medir el tiempo entre pulsos.
lastTime = pulseTime;
pulseTime = micros();

//Contador de pulsos
pulseCount++;

//Calculo de la potencia
power_ = (3600000000.0 / (pulseTime – lastTime))/ppwh;

if (power_ < 1000) {
watts= power_;
Serial.print(“watts = “);
Serial.print(watts,4);
Serial.println(“W”);
}
}
}

 

 

void updateDisplay ()
{
display.sendSmooth (message, messageOffset);
// la próxima vez muestra un píxel en adelante

if (messageOffset++ >= (int) (strlen (message) * 8))
messageOffset = – chips * 8;
} // end of updateDisplay

void loop ()
{

// DEBUG SERIAL
 Serial.print(“watts = “);
 Serial.println(watts,4);

////las cadenas se deben cargar a la variable (Message) para que se visualicen en la matriz

//Message =”Power “+String(watts)+” W :)”;
Message =String(watts)+”W”;

//sacamos por consola la potencia
Serial.println(Message);

int L_Message = Message.length(); ///length String
String(Message).toCharArray(myCharMessage, L_Message+1);

/// String to char array  y scroll
flipper.attach(0.1, flip);

// restardo


delay(100);


} //fin del bucle

 

 

 

En el siguiente video  podemos ver el circuito en acción:

 

 

 

 

Mas informacion en  https://www.instructables.com/id/Electric-Consumption-Meter-CHINT-ESP8266-Matrix-Le/