Popular channels

wattimetro de alterna con nano

Hola comunidad:

Siguiendo con mi espíritu arduinero les traigo ahora un watimettro de alterna casero.-,
Como siempre el mismo no es un instrumento en si , solo que el proyecto tiene carácter educativo y/o recreativo si se quiere.-
Me dedique al mismo debido a que no encontré mucha información en la red al respecto.-
El mismo verdaderamente funciona ,con un error, que yo estimo entre del 3 al 5% ; así que los animo a que lo pongan en practica . Eso si , mucho cuidado con el 220 !!! ya que una mala conexión o un descuido seguramente nos quemara el arduino o podemos recibir una descarga que puede ser muy peligrosa e inclusive mortal.-

Por supuesto no me hago responsable por un uso incorrecto o mala conexión de quien ponga en practica este proyecto .-

Principio de funcionamiento:

Sabemos que la potencia eléctrica P= V*I
Para el caso de corriente alterna es P(activa)=V*I*cos (fi)
Si la tensión y la corriente están en fase o sea tenemos carga resistiva pura cos(fi)=1 y la P=V*I (valores eficaces).-
El código del presente solo esta pensado para este caso , aunque ya estoy maquinando algo para poder medir el desfase (Je je). En conclusión solo tenemos que medir V e I y luego mostrar su producto en un display.-
Por cierto la conexión al display puede traer algo de dificultad , pero hay mucha información y con la librería adecuada funciona joya.-
Para la medida de tensión empleo un divisor resistivo al 1% . Para la corriente coloco un sensor de corriente Allegro ACS 712 de 30 A. Es un sensor de efecto hall que da Vcc/2 para corriente cero y aumenta o disminuye su salida a razón de 66 mV/A .-
Esa tensión es directamente proporcional a la corriente y se mide con el mismo algoritmo del voltímetro
Para medir la tension y corriente se toman en una matriz 50 valores cada 1 milisegundo( dos ciclos y medio) y el software elige cual es el mayor de todos.
Ese es el valor pico!!!! , luego el mismo se divide por raiz de 2 = 1.41 y se obtiene e valor eficaz.-
Les dejo un esquema de conexionado , el código y un vídeo de funcionamiento

[/url]]

En cuanto al código he visto que cuando lo pego aquí mas abajo aparecen algunos emoticones y puede faltar algún carácter ! que no puedo arreglar . Ojo revisarlo antes de cargarlo al Arduino
De todos modos si esta bien cargado cuando lo compilen no tendrán problemas !!

Por ultimo como siempre quedo a la espera de sugerencias o correcciones que se ameriten y espero que les guste Hasta siempre.-

PD: Perdón si hay algún error ( es involuntario )


Mide potencia de alterna solo "senoidal".-
Se uso un transformador de relación 20/1 para aislar de la linea de 220v
Se coloca un divisor de tension de 0,95 Kohms y 8 Kohms al 1% para mayor exactitud
en la entrada analógica Ao para tomar las lecturas.- (ojo muy importante !!)
Los valores de intensidad entran en A5




link: http://www.youtube.com/watch?v=9uTYpS5tNlQ



codigo


#include <LiquidCrystal.h> // Libreria para el display

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);


int i=0; // Se inican los subindices para las matrices
int j=0;
int lecturasv[50]; // inicia dos matrices unidmensuinal con 50 posiciones cada una
int lecturasi[50];
int valor1=0;
int valor2=0; //se inician las variables de entrada valor 1 ,2 ,3
int valor3=0;
int pend1=0; // se inician las variables pend 1 y 2
int pend2=0;
float volt=0; // Se inician la varialbes para tension , corriente y potencia
float corr=0;
float pot=0;


void setup()
{
Serial.begin (9600); //inicia comunicacion serial

lcd.begin(16, 2); // declara lcd de dos lineas
lcd.print("Pot: "; // escribe la palabra Pot

for(int cont=0;cont<50;cont++) //hace un bucle for
{
lecturasv[cont]=analogRead(A0); // Se toman 50 lecturas con un intervalo de 1 milisegudo obteniendose asi el equivalente dos cicos y medio de valores
// en los semiciclos negativos en ADC da valores nulos.-
delay(1);
}

for(int cont=0;cont<50;cont++) //hace un bucle for
{
lecturasi[cont]=analogRead(A5); // Se toman 50 lecturas con un intervalo de 1 milisegudo obteniendose asi el equivalente dos cicos y medio de valores
// en los semiciclos negativos en ADC da valores nulos.-
delay(1);
}

}

void loop(){
tension();
corriente();
}

//---------------------------------------------------------------------------------------------------------------------------------------------

void tension()
{
if(i>47) // dependiendo de donde inicie la toma de lecturas pueden llegar a hacerse mas de 50 iteracioens sin llegar al resultado
// de alli la pregunta de if>47
{
i=0; // si es cierto debe reiniciar !!
setup(); // reinicio
}

valor1=lecturasv;
i++;
valor2=lecturasv; // en loop se toman 3 lecturas consecutivas y se caculan dos pendientes consecutivas
i++;
valor3=lecturasv;

pend1=valor2-valor1; // calcula pendiente 1
pend2=valor3-valor2; // calcula pendiente 2


if (pend1>0 && pend2<0&& i>3&& valor1>10) //cuando las mismas cambian de signo alli estamos en el maximo (ademas forzamos a que haya por lo menos tres iteraciones para mas exactitud)
{
volt=20*(valor2*0.0332+0.7); // alli calculamos el valor eficaz como 5.1/1023*8.95/0.95/1.4142 = 0.0332 (1.1442 es raiz de 2 )



i=0; //se resetea i , se manda a setup nuevamente y se repite el ciclo
corriente(); // manda a hacer rutina corriente
}
i--; // si sale por "no" se debe decrementar i una vez , ya que se incremento dos veces en la toma de los tres valores
}

//---------------------------------------------------------------------------------------------------------------

void corriente()
{
if(j>47) // dependiendo de donde inicie la toma de lecturas pueden hacerse mas de 50 iteracioens sin llegar al resultado
// de alli la pregunta de if>47
{
j=0; // si es cierto debe reiniciar
setup(); // reinicio
}

valor1=lecturasi[j];
j++;
valor2=lecturasi[j]; // en loop se toman 3 lecturas consecutivas y se caculan dos pendientes consecutivas
j++;
valor3=lecturasi[j];

pend1=valor2-valor1; // calcula pendiente 1
pend2=valor3-valor2; // calcula pendiente 2


if (pend1>0 && pend2<0&& j>3&& valor1>510) //cuando las mismas cambian de signo alli estamos en el maximo (ademas forzamos a que haya por lo menos tres iteraciones para mas exactitud)
{

corr=(valor2-512)*0.05341; // // 5.10/1023/1.4142/.066 = 0.05341( 66mv/Asensivilidad del sensor de correinte).Se restan 512 que es Vcc/2 o sea el punto Q del conversor


Serial.println();
Serial.print ("V= ";
Serial.print (volt,2);

Serial.println();
Serial.print ("Ibinario= ";
Serial.print (valor2);

Serial.println();
Serial.print ("I= ";
Serial.print (corr,2);
Serial.println();


lcd.setCursor(0, 1); // Mueve el cursor a la linea de abajo
lcd.print(corr*volt,0); // Muestra el valor de la potencia con cero decimal
lcd.print(" W"; // Escribe la letra W
delay(1000); // Demora un segundo para mostrar la lectura

j=0; //se resetea j , se manda a setup nuevamente y se repite el ciclo
setup();
}
j--; // si sale por "no" ; se debe decrementar j una vez , ya que se incremento dos veces en la toma de los tres valores

}
0
0
0
0No comments yet