Hola a todos.
Llevo trabajando en mis poco tiempo libre…..un tiempo, en un proyecto que me permitirá controlar el excedente de la instalación para evitar la inyección a red.
Si recordáis, el immersun que tengo instalado tiene un margen de 120w que no es modificable, por lo que necesito algo más preciso.
Para desarrollarlo, me he basado en esta web http://openenergymonitor.org/emon/, que contiene todo el conocimiento necesario para entender como medir la energía, como controlarla, etc.
El concepto
El concepto es sencillo, solo queremos poder controlar la energía que consumimos, cuando, y hacia donde queremos enviarla. el sistema actual que tengo es el siguiente:
Es sencillo, la parte del cuadro azul es lo que se quiere alcanzar con este proyecto. Lo demás está ya instalado.
Por cierto, el medidor de voltaje y amperios casero, es semi-casero, lo hice con una carcasa de disco duro reciclado.
El Material
La premisa es sencilla, tiene que ser de bajo coste, por lo que reaprovecharemos todo lo que podamos y básicamente, consta de:
1.- Sensor de corriente (reciclado de un OWL que me sobraba)
2.- Un arduino + pantalla comprado por internet
3.- Relays para poder encender o apagar cosas
4.- Resistencias y componentes reciclados de TV o trastos varios
La estrategia
La estrategia a seguir es fácil:
1.- Medir la energía que pasa por el cable
2.- Medir si es excedentaria o no
3.- Si es excedentaria, aprovecharla para una estufa o frigorífico
En este primer tutorial, os contaré como se ha hecho el punto 1
Medir Watios de una instalación
Para medir la energía que pasa por un cable necesitamos un sensor CT, y algo que sea capaz de interpretar el resultado de la sonda.
La energía que pasa por el sensor, es muy pequeña, por lo que el arduino apenas es capaz de leerla, hay que amplificar el voltaje entre 0 y 5 voltios. Para ello se usan las resistencias. Yo he puesto 120 ohmios. Son la fila de resistencias grises
La onda en corriente alterna, es algo como esto: Medido con Arduino, ahora os cuento como:
Necesitamos que el centro del voltaje en las medidas sea 2,5 V, ya que así mediremos la onda completa. Si partiéramos de cero, solo mediríamos la mitad de la onda.
Eso quiere decir, que dividiremos los 5v que nos proporciona el arduino con dos resistencias:
Y con esto, ya conseguimos medir valores.
Arduino leerá voltajes de 0 a 1024, por lo que la media, es decir si no hay corriente, será de 512 aproximadamente. Esta será nuestra referencia, o punto de corte.
Este gráfico aclara un poco lo que hemos hecho: Podéis ver más información en http://openenergymonitor.org/emon/buildingblocks/ct-sensors-interface
Y por último, el resultado. Es una prueba, como podéis ver por el lío de cables
El programa que he hecho para el arduino es este:
#include <LiquidCrystal.h>
#include <LCDKeypad.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
char msgs[5][16] = {"Right Key OK ",
"Up Key OK ",
"Down Key OK ",
"Left Key OK ",
"Select Key OK" };
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
const int currentPin = A1;
const unsigned long sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
const unsigned long numSamples = 2500UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
const unsigned long sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time
const int adc_zero = 514; // relative digital zero of the arudino input from ACS712 (could make this a variable and auto-adjust it)
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.clear();
}
void loop()
{
unsigned long currentAcc = 0;
unsigned int count = 0;
unsigned long prevMicros = micros() - sampleInterval ;
while (count < numSamples)
{
if (micros() - prevMicros >= sampleInterval)
{
int adc_raw = analogRead(currentPin) - adc_zero;
currentAcc += (unsigned long)(adc_raw * adc_raw);
++count;
prevMicros += sampleInterval;
}
}
//float rms = (sqrt((float)currentAcc/(float)numSamples) * (75.7576 / 1024.0));
float rms = (sqrt((float)currentAcc/(float)numSamples) * (75.7576 / 1024.0));
Serial.println(rms);
lcd.clear();
String watios="Wats: ";
int apparent_power=rms*231;
if(apparent_power<10)apparent_power=0;
if(apparent_power>4000){
watios= watios + " ERROR";
}
else{
watios= watios + apparent_power;
}
lcd.print(watios);
}
En fín, esto es todo por hoy, me queda bastante por trabajar, pero de momento, un pequeño avance motiva para seguir.
Saludos!!