Como medir potencia y consumo con ACS712??

Lo que tienes que tener muy claro es la diferencia entre corriente continua y corriente alterna. Y a continuación cómo funciona el sensor, eso es vital. Recuerda lo que te puse:

Tengo una gran duda sobre el funcionamiento de este sensor. Cuando mide AC, ¿la tensión de salida es un valor proporcional a I(rms) o es proporcional a la intensidad instantánea?

Tras ver el pdf que enlazas entiendo que el sensor ACS712 mide la intensidad instantánea. Por eso la toma de lecturas, cuantas más hagas, verás que la media sale cero. Claro, tú vas tomando lecturas y el ADC te da un valor que varía desde -I de pico hasta +I de pico pasando por cero, dependiendo en qué momento de la onda senoidal tomes la lectura. El vatímetro del pdf por eso pone a la salida del ACS712 otro integrado que justo lo que hace es ir integrando todos los valores de intensidad en el tiempo para poder calcular Irms (Irms matemáticamente es la raiz cuadrada de la integral de la intensidad al cuadrado en el tiempo).

Por si te has perdido voy al grano. Con ese ACS712 tienes dos opciones para calcular la intensidad (Irms) en corriente alterna:

  • Una es calcular la verdadera Irms. Para eso puedes hacerlo con un integrado como el del pdf (BAE0910) que te va integrando los valores. O también puedes ir tomando lecturas con Arduino "muy rápido" para que haga el mismo Arduino el trabajo de integración. No sé si Arduino lo podrá hacer por velocidad de muestreo y posterior cálculo.

  • La otra es la opción sencilla aunque por supuesto menos precisa. Consiste en que a la salida del ACS712 implementes un circuito detector de pico (en el datasheet del ACS712 ya viene). Ese valor de pico lo llevas a Arduino, lo divides por raiz de dos (1,4142) y el valor que te da es Irms. Esto es así cuando la intensidad es una senoide pura. En la práctica existen armónicos y el valor así calculado difiere del verdadero Irms. Pero según lo que quieras medir y la precisión creo que te puede valer.

Por ahora voy a ver si lo puedo conseguir con arduino, he estado viendo algunas web como esta Workspace not found que usan un ade7753 con el arduino, que mide irms vrms w va y vaar,
me he encontrado con este codigo que usan con el acs712 para calcular tb el irms vrms , toman dos lecturas no se si del mismo acs712, pero hay cosas como lo del filtro paso alto que multipica por 0.996 que no entiendo y los coeficientes de calibración que no se como medirlos, me tiene que llegar un mini osciloscopio que he pillado que supongo que me sera util para estas cosas.

//Basic energy monitoring sketch - by Trystan Lea
//Licenced under GNU General Public Licence more details here
// openenergymonitor.org

//Sketch measures voltage and current. 
//and then calculates useful values like real power,
//apparent power, powerfactor, Vrms, Irms.

//Setup variables
int numberOfSamples = 3000;

//Set Voltage and current input pins
int inPinV = 2;
int inPinI = 1;

//Calibration coeficients
//These need to be set in order to obtain accurate results
double VCAL = 1.0;
double ICAL = 1.0;
double PHASECAL = 2.3;

//Sample variables
int lastSampleV,lastSampleI,sampleV,sampleI;

//Filter variables
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Stores the phase calibrated instantaneous voltage.
double calibratedV;

//Power calculation variables
double sqI,sqV,instP,sumI,sumV,sumP;

//Useful value variables
double realPower,
       apparentPower,
       powerFactor,
       Vrms,
       Irms;
       
void setup()
{
   Serial.begin(9600); 
}

void loop()
{ 

for (int n=0; n<numberOfSamples; n++)
{

   //Used for offset removal
   lastSampleV=sampleV;
   lastSampleI=sampleI;
   
   //Read in voltage and current samples.   
   sampleV = analogRead(inPinV);
   sampleI = analogRead(inPinI);
   
   //Used for offset removal
   lastFilteredV = filteredV;
   lastFilteredI = filteredI;
  
   //Digital high pass filters to remove 2.5V DC offset.
   filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
   filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
   
   //Phase calibration goes here.
   calibratedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
  
   //Root-mean-square method voltage
   //1) square voltage values
   sqV= calibratedV * calibratedV;
   //2) sum
   sumV += sqV;
   
   //Root-mean-square method current
   //1) square current values
   sqI = filteredI * filteredI;
   //2) sum 
   sumI += sqI;

   //Instantaneous Power
   instP = calibratedV * filteredI;
   //Sum
   sumP +=instP;
}

//Calculation of the root of the mean of the voltage and current squared (rms)
//Calibration coeficients applied. 
Vrms = VCAL*sqrt(sumV / numberOfSamples); 
Irms = ICAL*sqrt(sumI / numberOfSamples); 

//Calculation power values
realPower = VCAL*ICAL*sumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor = realPower / apparentPower;

//Output to serial
Serial.print(realPower);
Serial.print(' ');
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(powerFactor);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);

//Reset accumulators
sumV = 0;
sumI = 0;
sumP = 0;

}

Lo primero decir que un medidor de potencia es lo que llevo en mente como pequeño proyecto para hacer algún día.

El enlace que pones realizan los cálculos como la primera opción que te indicaba, realizando todos los cálculos Arduino, por lo que ya vemos que sí que tiene suficiente velocidad y cálculo para realizarlo.

El filtro paso alto tal como indican quita los 2,5 V de continua que introduce el ACS712 sobre las medidas reales. No lo he mirado detenidamente pero imagino que el factor 0.996 será una calibración empírica que han hecho sobre los valores que entrega el ACS712, pero vamos que de esto no estoy nada seguro.

Imagino que el código no está completo, ¿no? Es que por ejemplo no veo que reseteen la variable n del contador. También me parece curioso que en cada muestra de lecturas (el bucle for) no establezcan el tiempo, es decir, que esa parte de programa saben que Arduino siempre la ejecuta en el mismo tiempo. La verdad es que eso hace más sencillo el programa.

Como ves utilizan dos entradas de Arduino tal como te dije que haría falta, una entrada mide la tensión y otra la intensidad. Así pueden calcular los valores de Vrms, Irms, potencia aparente y potencia activa. Y con esto pueden calcular el factor de potencia sin tener que calcular en ningún sitio los pasos por cero de tensión e intensidad y su diferencia en el tiempo.

flico:
En mi casa domotica tenia pensado usar un sensor de corriente como el uso @sergegsx o como el de este enlace
45AMP AC/DC Non-Invasive Hall-Effect Current Sensor. porque la verdad me da un poco de "canelo" usar un sensor que tienes que meterle tension por sus pines para medir el consumo, estando tan cerca el pin que va al arduino.

flico el dia que vayas a meterte con el tema de los consumos avísame, pensé que podía terminar la documentación mucho antes pero no tengo tiempo ahora. Pero vamos que si vas a ponerte te puedo ayudar mucho.

riscknig
yo te recomendaria que si vas a medir respecto de un aparato de alterna, que uses un CT current transformer sensor. el codigo que pegas es el correcto para este tipo de sensores y lo mas importante es que no son intrusivos.

flico el dia que vayas a meterte con el tema de los consumos avísame, pensé que podía terminar la documentación mucho antes pero no tengo tiempo ahora. Pero vamos que si vas a ponerte te puedo ayudar mucho.

Pues tomo nota segegsx

Hola,

El sensor, tal como te decían, mide corrientes instantaneas, añadiendo un ofset de 2,5v, para dar tensones positivas aunque haya intensidades negativas. , si son 66mV por A para 30 A tienes que tener na tension de 4,48V. 0,066x30+2,5.

Tendras problemas de precisión en las corrientes bajas.
Ojo, tal como te decían si es corriente alterna tienes valores instantáneos, los promedios dan cero.

Las respuestas están bastante bien explicadas en una app note de Atmel, hay un. Link en esta entrada de mi blog http://www.zigbe.net/?p=540

También hay ejemplos de código para arduino, inspirados en esta appnote, smilares a los de openenergy, que también están extraidos del mismo lugar.

http://www.zigbe.net

Hola, voy a probar medirlo con un integrado ade7753 o ade7759 y un transformador de corriente, he estado mirando algunos pero hay tantos que no se en que me debo fijar, me gustaria que fuese de los que se pueden abrir para meter el cable, he visto 3, de estos cual creeis que iria mas fino, osea mas preciso?? Seria para medir unos 10A como mucho mucho 15A.
http://www.seeedstudio.com/depot/noninvasive-ac-current-sensor-100a-max-p-547.html?cPath=144_154
http://www.seeedstudio.com/depot/noninvasive-ac-current-sensor-30a-max-p-519.html?cPath=144_154
http://iteadstudio.com/store/index.php?main_page=product_info&cPath=4&products_id=203
He encontrado otros dos:
http://www.dentinstruments.com/media/20A_Mini_Hinged_CT_Specs_112310.pdf
http://www.dentinstruments.com/media/50A_Mini_Hinged_CT_Specs_112310.pdf

Hola.

Al final hiciste funcionar el sensor?
Porque yo estoy ahora mismo igual que tú y no salgo del atasco.

Salu2.
Uraken.

puff que va, lo queria para alterna y al final no sacaba nada en claro y al final lo acabe dejando, si consigues algo con el porfavor dime que tengo 2 unidades cogiendo polvo.
Un saludo

Pues nada.... a seguir investigando.

Salu2.
Uraken.

¿Alguien me puede decir como se conectaría el elemento donde quiero medir la intensidad?

https://www.google.co.il/search?q=acs712&espv=210&es_sm=122&source=lnms&tbm=isch&sa=X&ei=0uzlUtK8HpOBhAfSwYGwCA&ved=0CAkQ_AUoAQ&biw=1600&bih=775&pws=0

mira los modulos que venden en ebay, te ayudara.
, solo hay que identificar los pines. tienes ejemplos de conexión aquí.

Hola , estamos tratando de este mismo tema y ya se ha avanzado muy bien, está en el siguiente link:

Ya se tiene las mediciones de tensión y corriente, y estamos en camino de leer el factor de potencia, invoco a la comunidad que brinden todas las ideas y aportes.

Para medir voltaje estoy usando un transformador de voltaje 220/12 VAC, esto lo puedes encontrar de un adaptador y le quitas la parte de rectificación, aquí está:
http://openenergymonitor.org/emon/buildingblocks/measuring-voltage-with-an-acac-power-adapter

y para que midas corriente si no es mucha usa el sensor de efecto hall ACS712 con capacidad de hasta 30 A. Si deseas medir mas potencia ya a nivel industrial yo estoy actualmente desarrollando la medición con bobinas rogowski, es muy efectiva esta bobina en comparación a los de efecto hall, shunt, incluso transformadores de corriente.

Espero te sirva, y sigamos comentando y aportando ideas a todos.

Hasta luego.

Esta es la imagen de la medición que realizaba con el sensor hall ACS 712
proceso FOCO DE 100 W Y LICUADORA(FLECHA AL ENCENDER LICUADORA, Luego se estabiliza y se apaga, solo queda foco de 100 W)

riscking:
Por ahora voy a ver si lo puedo conseguir con arduino, he estado viendo algunas web como esta Workspace not found que usan un ade7753 con el arduino, que mide irms vrms w va y vaar,
me he encontrado con este codigo que usan con el acs712 para calcular tb el irms vrms , toman dos lecturas no se si del mismo acs712, pero hay cosas como lo del filtro paso alto que multipica por 0.996 que no entiendo y los coeficientes de calibración que no se como medirlos, me tiene que llegar un mini osciloscopio que he pillado que supongo que me sera util para estas cosas.

//Basic energy monitoring sketch - by Trystan Lea

//Licenced under GNU General Public Licence more details here
// openenergymonitor.org

//Sketch measures voltage and current.
//and then calculates useful values like real power,
//apparent power, powerfactor, Vrms, Irms.

//Setup variables
int numberOfSamples = 3000;

//Set Voltage and current input pins
int inPinV = 2;
int inPinI = 1;

//Calibration coeficients
//These need to be set in order to obtain accurate results
double VCAL = 1.0;
double ICAL = 1.0;
double PHASECAL = 2.3;

//Sample variables
int lastSampleV,lastSampleI,sampleV,sampleI;

//Filter variables
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Stores the phase calibrated instantaneous voltage.
double calibratedV;

//Power calculation variables
double sqI,sqV,instP,sumI,sumV,sumP;

//Useful value variables
double realPower,
      apparentPower,
      powerFactor,
      Vrms,
      Irms;
     
void setup()
{
  Serial.begin(9600);
}

void loop()
{

for (int n=0; n<numberOfSamples; n++)
{

//Used for offset removal
  lastSampleV=sampleV;
  lastSampleI=sampleI;
 
  //Read in voltage and current samples. 
  sampleV = analogRead(inPinV);
  sampleI = analogRead(inPinI);
 
  //Used for offset removal
  lastFilteredV = filteredV;
  lastFilteredI = filteredI;
 
  //Digital high pass filters to remove 2.5V DC offset.
  filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
  filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
 
  //Phase calibration goes here.
  calibratedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
 
  //Root-mean-square method voltage
  //1) square voltage values
  sqV= calibratedV * calibratedV;
  //2) sum
  sumV += sqV;
 
  //Root-mean-square method current
  //1) square current values
  sqI = filteredI * filteredI;
  //2) sum
  sumI += sqI;

//Instantaneous Power
  instP = calibratedV * filteredI;
  //Sum
  sumP +=instP;
}

//Calculation of the root of the mean of the voltage and current squared (rms)
//Calibration coeficients applied.
Vrms = VCALsqrt(sumV / numberOfSamples);
Irms = ICAL
sqrt(sumI / numberOfSamples);

//Calculation power values
realPower = VCALICALsumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor = realPower / apparentPower;

//Output to serial
Serial.print(realPower);
Serial.print(' ');
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(powerFactor);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);

//Reset accumulators
sumV = 0;
sumI = 0;
sumP = 0;

}

Hice correr este código y funciona perfectamente, por lo que ahora revisaré el código y ver los factores de calibración y corregirlos.

Saludos.

El filtro es un filtro digital y esos son coeficientes del filtro digital.

Por favor para usar códigos y enlaces debes usar tags y leer Normas del Foro

Tienes muchos elementos a considerar.
// Voltage is reduced both by wall xfmr & voltage divider
#define AC_WALL_VOLTAGE  220 // 122   
#define AC_ADAPTER_VOLTAGE 15.2   // valor a ajustar segun salida de tu trafo
// Ratio of the voltage divider in the circuit
#define AC_VOLTAGE_DIV_RATIO 11   // 220/12 = 18.33
// CT: Voltage depends on current, burden resistor, and turns
#define CT_BURDEN_RESISTOR 68    // si usas transformador de intensidad 
#define CT_TURNS 1012                    // propio del trafo de intensidad

Quien tolera esto en ram

int numberOfSamples = 3000;

Para el #define AC_ADAPTER_VOLTAGE 15.2 
lo mejor es el osciloscopio, mides el valor Pico y listo ese es tu dato, de lo contrario lees con un voltimero en AC y su valor lo multiplicas por Raiz(2) o sea 1.41

Saludos
Esto parece the walking dead. Este post tenia un año inactivo. En cuanto pueda paso un sketch que hice para un medidor de factor de potencia para compartir

max_saeta:
Saludos
Esto parece the walking dead. Este post tenia un año inactivo. En cuanto pueda paso un sketch que hice para un medidor de factor de potencia para compartir

Saludos

Creo que mi inquietud la puedo plantear aquí porque esta relacionada con este modulo.

Creo que el modulo ACS712 tiene muchos contras o no se si es que los tres que tengo no funcionan.
De lo aqui leido he rescatado algunas cosas para convencerme de porque funcionan de tal manera.

Mi idea para utilizarlos era para el encendido doble de un circuito, mediante arduino, reles y mediante un interruptor conmutable manual conectado a los reles. La idea era que cuando encendiera el circuito de forma manual y la ultima orden en el arduino era apagado, este se enterara que estaba encendido manualmente y actualizara el código a encendido, desviandolo en el programa a otro IF(). Al mismo estilo que si un bombillo esta encendido de forma manual y si lo manejo desde internet, el me muestre la información correcta que esta encendido.

La función del ACS712 en mi circuito era medir el voltaje que circulara por el cable de accion manual y enviar esta información al arduino para que este sepa en que estado esta el circuito y maneje el codigo de acuerdo a esta informacion.
El circuito mencionado es los conectores o tomacorrientes de pared del TV, Receiver, Consola de juegos, DVD, media player, woofer, PC portatil etc, en fin se manejaran mas de 15A. Opte por un modulo de 20A para que soporte la carga cuando todo esto este encendido.
Contras:
Al encender manualmente el circuito, debería el modulo ACS enviar información de encendido, pero todos los electrodomésticos iniciaran en Standby, con lo cual el voltaje que se manejara por el cable que contiene este modulo sera una poca cantidad de mV y dado que este modulo no es sensible a bajos amperes, las variaciones que se dan no son detectadas por el modulo o estan dentro del porcentaje de error y por tanto no puede informarle al arduino que se ha accionado manualmente.
Y si quiero algo mas sensible a pocos mV deberia utilizar un modulo de 5A o menos si existiera, pero este me fallaria o lo dañaria cuando encienda todos los electrodomesticos que me demandan mas de 15A.

Existe algún modulo que me permita realizar la función que requiero, que tenga soporte para los amperes iniciales y que soporte los amperes finales?
o si el modulo ACS712 20A puede hacerlo, como se manejaria? para que tome bajos mV?
Si lo anterior no es posible, saben de que otra forma puedo manejar este encendido doble (arduino-manual), enterando al arduino del estado del circuito? (no mediante botones pulsadores, solo con interruptores de pared normales)
O si este tipo de manejo de circuito ya lo han resuelto en algun foro, pueden por favor regalarme un link a este para resolver mi duda.

Gracias de antemano

Cuando escribiste esta consulta no recibiste un mensaje de advertencia en letras Rojas?

El mensaje dice que hace mas de 120 dias que este tema no tiene movimientos.

Desde el 25-01-2015, 08:30:38 en este caso nadie responde en este hilo.

Deberías crear un nuevo tema.
Con gusto responderé cuando lo hagas.