sábado, 5 de agosto de 2017

Sensor de consumo eléctrico para HomeAssistant (2)

Continuamos en este artículo con el montaje del sensor de consumo para la casa. Venimos de esta entrada.
En la entrada anterior vimos un poco la teoría tanto del sensor de corriente no invasivo CT013 como del esquema eléctrico básico que necesitaremos para leer los datos del mismo.
En esta entrada vamos a ver la implementación real del circuito.

Selección del controlador

Una de las decisiones más importante que tenemos que hacer es qué tipo de controlador vamos a utilizar.
Lo lógico, y lo primero que se nos viene a la cabeza es un Arduino, pero ¿es la solución más eficiente? ¿y qué tipo de Arduino utilizamos?
Normalmente, al iniciar un proyecto sabemos qué sensores vamos a necesitar, que son los componentes que más nos van a determinar el tipo de controlador: en base al voltaje requerido, el consumo, la alimentación disponible, etc.
En este caso utilizamos un sensor pasivo, esto es: no requiere alimentación y por tanto no nos va a condicionar. Pero por otro lado tenemos dos requisitos que tenemos que tener en cuenta:
  1. El dispositivo debe enviar sus lecturas de forma inalámbrica.
  2. El dispositivo debe funcionar, en la medida de lo posible, de forma autónoma. Lo ideal es que funcione con baterías.

Conexión inalámbrica

El primer requisito nos condiciona porque tenemos que utilizar algún componente que nos permita conectarnos con nuestro concentrador de forma inalámbrica:
  • Podríamos utilizar un transceptor nRF24L01+, que tiene un consumo muy bajo, pero como incoveniente necesitaríamos dos: uno en el emisor y otro en el receptor (OrangePi Zero).
  • También podríamos utilizar un dispositivo WiFi como el ESP8266, que nos permite conectarnos directamente con nuestra red doméstica sin más requisitos.
En el caso de elegir este segundo, tenemos una ventaja adicional: en la entrada en la que vimos su funcionamiento lo analizamos como componente puro que podíamos utilizar mediante su conexión a un Arduino. Este es el llamado encapsulado ESP8266-01, que tan sólo nos expone 8 pines (entre los cuales están los de alimentación) y que funciona como un modem enviándole comandos AT por el puerto serie.
Sin embargo, existen otros encapsulados del mismo chip que nos permiten explotar toda su pontencialidad, que no es otra que tratarse de un SoC completo con sus pines GPIO digitales, otro pin GPIO analógico, su memoria para ejecutar código y para almacenar datos, soporte para varios protocolos, etc.
Estos encapsulados como el ESP8266-12, ESP8266-07, etc, nos permiten utilizar este dispositivo a modo de controlador con el añadido de que tiene conectividad WiFi.
Este hecho, y teniendo en cuenta lo barato que es, ha propiciado que cada vez exista un mayor uso de este dispositivo en proyectos autónomos en detrimento del tándem Arduino + Wifi.
Tanto es así que ahora mismo en Aliexpress o cualquier otra tienda disponemos de distintos “empaquetados” de este chip como controladores autónomos que incluyen su interfaz USB para conectarlo al ordenador y programarlo, regulador de voltaje, etc. Principalmente encontraremos estos dos modelos:
NodeMCU

NodeMCU
D1Mini

Wemos D1 Mini
Además, el dispositivo se puede programar en lenguaje LUA (un lenguaje interpretado) o bien directamente mediante el IDE de Arduino con el mismo lenguaje (y mismas librerías) que utilizamos con el Arduino.
Por tanto, es muy fácil migrar un programa hecho para Arduino al NodeMCU o D1 Mini con muy pocos cambios.
El único impedimento que tendremos es que este dispositivo tiene menos pines GPIO que el Arduino. De hecho sólo tiene 1 pin analógico.
El dispositivo funciona a 3.3V y consume bastante, sobre todo al iniciarse (al igual que el ESP8266-01), pero afortunadamente dispone de un modo deep sleep (sueño profundo) en el que lo único que está alimentado es un pequeño oscilador de cristal que nos marca el tiempo en el que se tiene que “despertar” de nuevo para seguir funcionando. El consumo en el modo deep sleep es bajísimo, lo cual nos permite pensar en su uso por medio de baterías.

Funcionamiento autónomo

El segundo requisito nos lleva a depender de la alimentación por medio de baterías.
Dado que hemos visto que el ESP8266 funciona a 3.3V, lo lógico sería establecer este voltaje como el adecuado para el montaje. Por tanto, o bien utilizamos un Arduino y otro controlador que funcionen a 3.3V, o bien tendremos que tener un regulador que nos dé este voltaje para dicho componente.
LM1117
Podríamos tener como fuente de alimentación un pack de 3 baterías AA o AAA en serie que nos darían 4.5V. Esto en el caso de funcionar a 3.3V. Después o bien utilizaríamos el regulador interno del controlador o necesitaríamos un regulador del tipo LM1117 (en la imagen).
Otra opción es utilizar una batería recargable de iones de litio de tipo 18650, que nos da un voltaje inicial de 4.2V y va bajando hasta aproximadamente los 2.5V. El voltaje nominal es de 3.7V, el mismo que se usa en los teléfonos de hoy día, y no conviene descargarlas por debajo de los 3V porque pueden pasar cosas muy malas… desde que ya no podamos cargarla más hasta que explote al cargarla la próxima vez.
Yo voy a elegir esta segunda opción: utilizar una única batería recargable 18650, la cual me acabo de dar cuenta de que trae integrado el circuito de protección que evita sobre corrientes y descargas por debajo del mínimo aconsejable.
Baterías

Decisión

Finalmente, mi decisión va a ser utilizar un módulo D1 Mini como controlador y una batería 18650 como alimentación, utilizando el regulador interno del dispositivo que nos proporciona 3.3V regulados. Intentaré por todos los modos utilizar el modo deep sleep aunque ya sé que tengo otros consumos que no puedo de momento bajar, como son el del propio regulador (que lo tendré que usar de todos modos) y el del interfaz USB (CHG340).

Montaje

Vamos ahora a montar el circuito completo, utilizando el controlador elegido, la fuente de alimentación y el circuito original del sensor de corriente.

Diseño del circuito

El diagrama del circuito básico que usaremos es el siguiente:
Esquema
Como se puede ver, para el divisor de tensión he elegido dos resistencias de 4K7 Ω, y para la resistencia de carga mantengo los cálculos de la entrada anterior, 3 resistencias en serie con un valor total de 91 Ω.
El montaje en el breadboard quedaría de la siguiente manera:
Montaje en breadboard
Y esta es una foto real de cómo quedaría montado físicamente:
Montaje

Librería emonlib

Para hacer las mediciones del sensor, utilizaremos la librería EmonLib, de OpenEnergyMonitor.
Esta librería funciona muestreando las lecturas del puerto analógico utilizado para conectar el circuito del sensor, y nos calcula todos los parámetros que necesitamos para tratar la Corriente Alterna.
Es importante tener en cuenta que, como la librería puede ser utilizada en una gran variedad de circuitos, cada uno con sus distintos valores relativos al sensor y a la resistencia de carga, es necesario indicar un parámetro de calibración, que se calcula según la documentación de la librería de la siguiente manera:


Siendo RatioTC el ratio del transformador de corriente (relación entre primario y secundario) y R la resistencia de carga calculada.
Por tanto, en nuestro caso el parámetro de calibración sería el siguiente:




Programa de prueba

El sketch o programa que utilizaremos para probar el circuito será el siguiente:
#include "EmonLib.h"

#define RatioTC 2000
#define ResCarga 91
#define VoltajeLinea 230

EnergyMonitor emon1;

/**
 * Configuración. Sólo se ejecuta la primera vez que se inicia el dispositivo
 */
void setup() {
    Serial.begin(9600);
    delay(10);
    Serial.println("");
    Serial.println("");
    Serial.println("Lector de consumo eléctrico");

    // Indicamos dónde está conectado el sensor de corriente (pin analógico A0) y el factor de calibración.
    emon1.current(A0, RatioTC / ResCarga);
}

/**
 * Bucle infinito que se ejecuta constantemente
 */
void loop() {
    // Calculamos la corriente efectiva indicando el número de muestras a tomar de la entrada analógica.
    double Irms = emon1.calcIrms(1480);

    Serial.print("I = ");
    Serial.print(Irms);
    Serial.print(" A, P = ");

    // Potencia efectiva = corriente efectiva * voltaje de línea
    Serial.print(Irms * VoltajeLinea);
    Serial.println(" W");

    delay(5000);
}
Una vez compilado, lo ejecutamos y ésta es la salida que obtenemos por el puerto serie:
Lector de consumo eléctrico 
I = 0.67 A, P = 153.95 W
I = 0.16 A, P = 36.60 W
I = 0.05 A, P = 12.24 W
I = 0.04 A, P = 9.64 W
I = 1.14 A, P = 262.96 W
I = 1.15 A, P = 264.73 W
I = 1.16 A, P = 265.78 W
I = 1.18 A, P = 271.47 W
I = 1.13 A, P = 260.15 W
I = 1.48 A, P = 341.17 W
I = 1.35 A, P = 309.65 W
I = 1.17 A, P = 269.78 W
I = 1.19 A, P = 273.09 W
I = 1.18 A, P = 271.46 W
I = 1.25 A, P = 287.18 W
I = 0.95 A, P = 218.53 W
I = 0.92 A, P = 211.87 W
I = 1.03 A, P = 236.09 W
I = 0.75 A, P = 171.41 W
I = 0.02 A, P = 4.92 W
I = 0.16 A, P = 35.81 W
I = 0.16 A, P = 36.02 W
I = 0.15 A, P = 35.48 W
I = 0.06 A, P = 14.40 W
Las lecturas no son demasiado estables (hice una prueba con un Arduino Pro Mini que tengo y las lecturas son algo más estables) porque el puerto analógico no es ninguna maravilla y mete algo de ruido, pero se puede ver perfectamente que a partir de la quinta le he metido una carga de unos 280-300W mientras que después he ido bajándola un poco hasta los 220W, dejándola luego de nuevo a 0.
Puede verse también que cuando teóricamente no hay carga, el sensor todavía detecta algunas décimas de amperio, debido también al ruido. De todos modos, estamos construyendo este componente para medir la potencia de una casa completa, y no pasa nada si tenemos un pequeño ruido de algunas décimas.
Related Posts Plugin for WordPress, Blogger...

No hay comentarios:

Publicar un comentario