Watimetro con Arduino

Realmente construir un watimetro no es demasiado  complejo cuando hablamos de corriente continua , por ejemplo pensando en una instalación fotovoltaica , pues basta  simplemente en recordar  la formula física de la  Potencia(P)   , la cual es el producto de la tensión instantánea(voltios) por la intensidad  (Amp ) , es decir  P = V x I ,  expresándose la unidad de potencia en  Watt o KW
Pero la potencia  en watios,  no expresa  ensimismo  potencia energética, por lo  que se recurre  al  producto de la potencia (vatios)  por el tiempo (en horas) , es  decir  E = P x t , expresándose  la unidad de energía que  todo conocemos como  vatios hora(Wh) o kilovatios hora (kWh).

Si unimos ambas formulas sustituyendo el valor de P obtenemos E =Px t= (V xI) x t , es decir  el producto de la tensión  e intensidad por el el tiempo

Precisamente pues de la ultima fórmula anterior queda claro que para medir la energía que necesitamos tres parámetros:

  1.  Tensión
  2.  Intensidad
  3.  Tiempo

Veamos pues como  obtener estas valores con un Arduino  para obtener en tiempo real en un display lcd  la potencia en kwh de un sistema en cc

En el siguiente  video podemos ver el proyecto funcionando, incluso enviando datos al IoT  con  Xively (esta opción ya no esta disponible para aficionados)

Medida de tensión

El voltaje se puede medir con la ayuda de un circuito divisor de tensión  formado  por dos resistencias iguales  . Como el  voltaje de entrada en cualquier pin analógico de ARDUINO esta limitado a 5V por se logica TTL , el  divisor de voltaje servirá para  que el voltaje de la salida de ella sea menor que 5V y no queme la electronica interior.

Por ejemplo para una batería  que se utilice para almacenar la energía de un  panel solar de  6v  y   5.5Ah  de capacidad , tendríamos que bajar la  tensión desde 6.5v a una tensión menor que 5V para no estropear el Arduino.

Si usamos R1 = 10k y R2 = 10K  nos da una corriente pequeña 6.5v/(10k+10K)=0,325mA .

Es cierto que se podrían  tomar valores de R1 y R2    inferiores, pero el problema es que cuando la resistencia es menor  mayor corriente  pasas  a través de ella generando como resultado gran cantidad de energía  disipada en forma de calor(recuerde  que P = I ^ 2R) . por tanto el valor de las resistencias  puede ser elegido diferente pero debe tenerse cuidado para reducir al mínimo la pérdida de energía a través de las resistencias.

El resultado de la tensión entre una de las resistencias y masa seria igual a R xI =10k  x 0.325mA=3.25v que es inferior a 5v y, tensión soportada sin problemas  para el pin analógico de  ARDUINO

Calibración de voltaje:

Cuando la batería está completamente cargada (6.5v) obtenemos una Vout = 3.25v y ese seria el valor  que iría al  convertidor analógico digital  de un puerto analógico  de  Arduino

Si tenemos que medir los 3.25v desde el divisor de tensión   obtendremos un valor aproximado de 696 en el monitor serial (  sample1 es el valor de ADC corresponde a 3.25v)  .

Precisamente con ese valor o tendremos que extrapolar  que 3.25v  es equivalente a 696,  1 es equivalente a 3.25/696=4.669mv    por lo que podemos usar  estas dos reglas:

Vout = (4.669 * sample1 ) / 1000 voltios
voltaje de la batería real = (2 * Vout) voltios

Con el siguiente código de Arduino  podemos obtener el valor de tensión:

/ / tomar 150 muestras de divisor de tensión con un intervalo de 2 segundos y medio samples data collected for(int i=0;i<150;i++)
{
sample1=sample1+analogRead(A2); //leer  el voltaje del circuito divisor
delay (2);
}
sample1=sample1/150;
voltage=4.669*2*sample1/1000;

Medición de intensidad

Para mediciones de intensidad  es típico usar una resistencia en serie  de poco  valor con la carga  y medir la diferencia de potencial entre los extremos   de esta  y luego calcular   la intensidad gracias a la la ley de ohm (I=V/R  ) donde como vemos   dividiríamos este valor por el valor en ohmios de la resistencia

El efecto Hall se basa en  la producción de una diferencia de potencial(el voltaje de Hall) a través de un conductor eléctrico, transversal a una corriente eléctrica en el conductor y un campo magnético perpendicular a la corriente.

Afortunadamente actualmente existen CI especializados  como   son  los   sensores de corriente basados en efecto Hall ACS 712

Existen comercialmente  sensores de la gama ACS712  para  diferentes  rangos de corrientes máximas , así que se debe escoger este  según su requisito,como por ejemplo para una corriente máxima de 20 A.

ACS712.png

En el  esquema vemos un LED como una carga ( aunque  la carga real sera diferente) .

Tambien vemos el  ACS 712 (soporta  20Amps DC)  ofreciendo una una salida analógica 100mV/A

Tambien es destacar la alimentación del Arduino  cuya salida alimenta a través de la placa de prototipos a la ACS712

La calibración  es muy sencilla :
La lectura analógica  produce un valor de 0-1023, equiparando a 0v a 5v analógico .Leer 1 = (5/1024) V = 4.89mv
Valor = (4,89 * valor analógico leído) / 1000 V,  pero según hojas de datos offset 2.5V (cero corriente obtendrá 2.5V del sensor de salida)
valor Actual = (valor 2.5) V
corriente en amp = valor real * 10

Código de ARDUINO:

/ / tomando 150 ejemplos de sensores con un intervalo de 2 segundos y luego media de los datos de las muestras recogidos
for (int i = 0; i < 150; i ++)
{
+= sample2 analogRead(A3);  //  leer la corriente de sensor
delay(2);
}
sample2 = sample2/150;
=(5.0*sample2)/1024.0; 
actualval = val-2.5;  //tensión de offset es 2.5v
amperios = actualval * 10;

 Medición del tiempo

Para la medida del tiempo no se necesita ningún hardware externo, pues ARDUINO en sí mismo tiene contador de tiempo incorporado.

La función millis() devuelve el número de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual.

Código de ARDUINO:

long milisec = millis();  // calcular el tiempo en milisegundos
long time=milisec/1000; // convertir de milisegundos a segundos

 Calculo de la potencia y energía

Estas son las formulas basicas empleadas por el fw  en Arduino:
  • totamps = totamps + amperios;  //calcular amperios total
  • avgamps = totamps/tiempo;  // promedio de amps
  • amphr =(avgamps*time)/3600;  // Ah
  • Watts = voltaje * amperios;  //Potencia = Voltaje * corriente
  • energía =(watt*time)/3600;  // Vatios-seg vuelve a convertir en Watt-hora dividiendo 1hr(3600sec)
  •  energy=(watt*time)/(1000*3600); //para la lectura en kWh

completo.jpg

Todos los resultados se pueden visualizar en el monitor serial o mediante una pantalla LCD   de 16 x 2 caracteres para mostrar todos los resultados obtenidos en los pasos anteriores.

El conexionado del LCD sigue la conexión estandar de 4 pines para la linea de  datos mas las señales de control RS,RW  y Enable

Asimismo también es necesario un trimer de 10k  para el contraste de la pantalla

Resumidamente estas son pues las conexiones para el lcd

LCD -> Arduino
1. VSS -> GND de Arduino
2. VDD -> Arduino + 5v
3. VO -> Arduino GND pin + resistencia o potenciómetro
4. RS -> Arduino pin 8
5. RW -> Arduino pin 7
6. E -> pin Arduino 6
7. D0 -> Arduino – no conectado
8. D1 -> Arduino – no conectado
9. D2 -> Arduino – no conectado
10. D3 -> Arduino – no conectado
11. D4 -> Arduino pin 5
12. D5 -> Arduino pin 4
13. D6 -> Arduino pin 3
14. D7 -> pin Arduino 2
15. A -> Pin 13 de Arduino + resistencia (potencia de luz de fondo)
16. K -> Arduino GND (tierra de luz de fondo)

A continuación este es el  código de ejemplo para sacar por el monitor serie  los valores calculados

Serial.Print («tensión:»);
Serial.print(voltage);
Serial.println(«Volt»);
Serial.print («actual:»);
Serial.print(amps);
Serial.println(«Amps»);
Serial.print («potencia:»);
Serial.print(watt);
Serial.println(«Watt»);
Serial.print («energía consumida:»);
Serial.print(energy);
Serial.println(«Watt-Hour»);
Serial.println(«»);  //imprimir los siguiente conjuntos de parámetro después de una línea e
delay(2000);
Para manejar el  LCD tiene que primero importar la biblioteca de «LiquidCrystal» en el código.
A continuación este es el  código de ejemplo para sacar por el display  lcd  los valores calculados:
#include
lcd (8, 7, 6, 5, 4, 3, 2);
luz int = 9;
void setup()
{
pinMode (luz de fondo, salida); //set pin 9 como salida
analogWrite (contraluz, 150); //controls la intensidad de luz 0-254
lcd.begin(16,2); / / columnas, filas. tamaño de pantalla
LCD.Clear(); claro la pantalla
}
void loop()
{
lcd.setCursor(16,1); / / establecer el cursor fuera de la cuenta de pantalla
lcd.print(«»); imprimir carácter vacío
delay(600);
impresión de potencia y energía que un LCD / / /
lcd.setCursor(1,0); coloca el cursor en la columna 1 y fila 1

LCD.Print(Watt);
lcd.print («W»);
lcd.print(voltage);
lcd.print(«V»);
lcd.setCursor(1,1); coloca el cursor en la fila 1 columna y 2 º
lcd.print(energy);
lcd.print («WH»);
lcd.print(amps);
lcd.print(«A»);
}

 

Componentes

A continuación por ultimo algunos de los componentes necesarios para llevar a cabo este circuito:

 

1. ARDUINO UNO  (unos 9€ en Amazon)


3. Display LCD de 16 x 2 caracteres LCD (en Amazon con I2C  menos de 5€ )

4. ACS 712 SENSOR de corriente .Rango de corriente: 30A; Tamano: 31 x 13mm / 1.2 «x 0.5» (L * W) ( en Amazon unos 2€ )


Varios : resistencias de 10k v2,resistencia de 330ohm, POTENCIÓMETRO de 10K ,cables puente , placa de prototipos,etc

 

🤞 No se pierda nuestro boletín mensual !es gratis!

¡No hacemos spam! Más información en nuestra política de privacidad

Un comentario sobre “Watimetro con Arduino

  1. Hola buenas. Muy buen trabajo, es exactamente lo que estaba buscando hacer. Espero que me puedas ayudar.
    Quiero hacer exactamente lo que has hecho pero con celdas 18650, no tendria que hacer lo del divisor de tensión ya que no supero el voltaje máximo del arduino. Pero en vez de mostrar los valores en la pantalla lcd me gustaría guardar los datos en una SD a traves de una placa wireles SD y poder abrirlo con un excel para hacer graficas de descarga de amperios hora/ tiempo.
    Espero que me puedas ayudar! un saludo y buen trabajo!

Deja una respuesta