domingo, 15 de mayo de 2016

Energy Monitor con Arduino!!


En esta entrada vamos a explicar como hacernos nuestro propio e-monitor, para saber el consumo que tenemos en nuestra casa. Hay muchas opciones comerciales con un mayor o menor precio, pero por muy poco dinero podemos hacernos nuestro propio medidor de consumo personalizado.
La verdad que es una herramienta muy útil, yo lo tengo instalado y siempre sabes el consumo que tienes en casa o si se te olvida algo encendido cuando te vas.

¿Que componentes necesitamos?

Los componentes podemos encontrarlos mismamente en Internet por muy poco dinero, sobre todo si lo compramos en una página de envío internacional.
  • Arduino Uno, Nano...
  • Sensor de corriente AC no invasivo SCT-013-030
  • Lcd 16x2
  • 1 condensador electrolitico de 10uF
  • 2 resistencias de 10k
  • 1 conector minijack hembra
¿Porque utilizar el sensor SCT-013-030?

Hay varios tipos de sensores para medir el consumo AC, pero yo me he decidido por este tipo principalmente porque no es un sensor invasivo, es decir, no tiene que circular la corriente por nuestro circuito.
Dentro de las características del sensor nos permite medir en su entrada de 0-30A y darnos una salida de 1 voltio.



Funcionamiento del sensor

Utiliza el principio de un transformador eléctrico. La pinza STC-013-030 tiene solo un bobinado(T2)
de unas 2000 espiras aprox. El cable que introducimos hace de transformador primario (T1).
El secundario T2 capta el flujo magnético generado que sería proporcional a la intensidad del cable (T1).


La señal obtenida en función del consumo(I) nos proporciona una tensión proporcional a la salida del sensor en los bornes del Burden Resistor.
El voltaje de entrada al microcontrolador tiene un rizado constante añadido al que eliminamos con el filtrado por software por ello calculamos la constante de calibracion.
La constante de calibración calculada se pasa como segundo parámetro con el método 
EnergyMonitor :: current () en el archivo de EmonLib.cpp . Está codificada como una constante 
en la llamada a la actual ( ) en el Sketch.

¿Como conectar el sensor a nuestro Arduino?

Para poder interpretar la señal que nos dará nuestro sensor utilizaremos las entradas analógicas de Arduino. Estas nos permiten medir tensiones de 0 a 5 voltios, con el conversor ADC de 1024 bits.
Como la señal obtenida tendra variaciones de 2.5 voltios, tendremos que establecer el offset a 2.5v. Para ello utilizaremos un simple divisor de tensión.

Desarrollo del proyecto

Después de la introducción pasamos al desarrollo y al conexionado. Tenemos que hacer un pequeño circuito con un divisor de tensión y un condensador para quitar el rizado. ¿Facil no? Yo lo hice con un trozo de placa de baquelita perforada. Os dejo el esquemático del circuito.



Básicamente montamos el divisor de tensión en una Pcb o una protoboard y soldamos la salida del divisor a la patilla del chasis del jack hembra. Después soldaremos otro cable al terminal medio del jack, el cual nos devuelve la señal del sensor, e irá a nuestra entrada A1 del Arduino.

Aquí tenemos el resultado...





A continuación pasaremos a conectar el LCD 16x2. Yo he utilizado un Lcd serie que utiliza protocolo I2c, el cual sólo necesita 4 hilos.
GND- GND
VCC-5V
SDA -  Analog Pin 4
SCL - Analog pin 5


Sketch!!!

Por último pasamos al código. Necesitaremos al librería EmonLib, que es la encargada de calcular la corriente leída a través de la entrada analógica de nuestro Arduino. Por lo demás como se puede ver en el Sketch, es muy sencillo. Obtenemos el dato de intensidad que almacenamos en una variable y podemos enviarlo por RF o hacer lo que queramos con él.


#include "EmonLib.h"                   // Incluimos la librería EmonLib.h
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
EnergyMonitor emon1;                   // Creamos una instancia
int potencia=0,n=0;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
// VARIABLES GLOBALES   ///////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES   ////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight
  emon1.current(1, 30);             // Current: pin de entrada A1, calibracion.
  /* Constante de corriente SCT-013-030 = 30A ÷ 1V = 30  ya lleva integrada la Burden Resistor
     Constante de corriente SCT-013-000 = (100 ÷ 0.050) ÷ 18 = 111.11    // 0.050A × 18R= 0.9V en Burden Resistor 18ohm  0.9V×100A= 111.1
  */
  lcd.setCursor(0,1);
  lcd.print("Bienvenido Jose");
  delay(3000);
}
}
// PRINCIPAL   ////////////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
  double Irms = emon1.calcIrms(1480);  // Calculamos Irms
  potencia=Irms*227.0;
  Serial.print(potencia);       // Potencia Aparente
  Serial.print(" ");
  Serial.println(Irms);       // Irms
  lcd.setCursor(0,0);
  lcd.print("Vatios:    ");
  lcd.print(Irms*230.0);
  lcd.setCursor(0,1);
  lcd.print("Amperios:   ");
  lcd.print(Irms);
}

Una vez cargado el Sketch a nuestro Arduino, ya podemos instalar nuestro Energy monitor. Recuerda siempre que vayas a manipular el cuadro eléctrico trabajar sin tensión por tu seguridad. Ojo que aunque bajes el magnetotérmico principal, aguas arriba siempre tendrás tensión.
Respecto a que cable conectar la pinza, eso depende si quieres medir el consumo total o por circuitos.



He comparado la lectura con la pinza amperimétrica y como se puede ver la lectura es muy aproximada en ambos. Si he apreciado que en consumos muy bajos es un poco mas imprecisa, pero dentro de unos márgenes aceptables.


En la siguiente entrada, mi intención es enviar los datos por bluetooth y recibirlos con una raspberry Pi. Espero que os haya gustado el tuto y lo pongáis en practica!!
Podéis encontrar mucha mas información en ingles en... https://openenergymonitor.org/emon/.


8 comentarios:

  1. hola amigo dispculpa en mi caso yo tengo el arduino uno como seria el programa en este caso porfa necesito ayuda

    ResponderEliminar
  2. en el caso de no tener una lcd y quisiera mostrarlo en la computadora que tendria que cmabiarle al programa??

    ResponderEliminar
  3. este es el error que marca el programa:




    Arduino: 1.6.13 Generación por hora 2016/11/22 04:34 (Windows 10), Tarjeta: "Arduino / Genuino Uno"

    C: \ Users \ DAVIDA ~ 1 \ AppData \ Local \ Temp \ arduino_modified_sketch_758298 \ sketch_nov23a.ino: 1: 74: error fatal: EmonLib.h: Ningún archivo o directorio

    #include "EmonLib.h" // Incluimos la librería EmonLib.h

    unesdoc.unesco.org unesdoc.unesco.org

    Compilación terminada.

    Estado de salida 1
    Error de compilación en tarjeta Arduino / Genuino Uno.

    Este reporte podría tener más información con
    "Mostrar salida durante la compilación"
    Opción habilitada en Archivo -> Preferencias.

    ResponderEliminar
  4. Estimado, lo felicito por su aporte, sin embargo, por un tema de semántica le es conveniente corregir en la sección "¿Como conectar el sensor a nuestro Arduino?" la frase "ADC de 1024 bits." por "ADC de 10 bits de resolución". Esto lo menciono basado en que el conversor análogo digital del Arduino posee una resolución de 10 bits, lo que permite una lectura de 1024 puntos de medición. Saludos y felicitaciones por su trabajo.

    ResponderEliminar
  5. Buen post, me informó bastante. Quería consultar en cuanto al valor de calibración, para un sensor SCT-013-010 de 10A, el cual también tiene salida 1V y resistencia de carga integrada. Si aquí el valor de calibración para el modelo de 30A es 30, ¿para el modelo de 10A sería 10? Muchas gracias de antemano. Saludos!

    ResponderEliminar
  6. Buen post, me informó bastante. Quería consultar en cuanto al valor de calibración, para un sensor SCT-013-010 de 10A, el cual también tiene salida 1V y resistencia de carga integrada. Si aquí el valor de calibración para el modelo de 30A es 30, ¿para el modelo de 10A ser https://coaching-mastery.com/el-mejor-software-o-programa-de-contabilidad/

    ResponderEliminar