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:
- Tensión
- Intensidad
- 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:
{
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.
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
- 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
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(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
lcd (8, 7, 6, 5, 4, 3, 2);
luz int = 9;
{
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);
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
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!
Me gustaMe gusta