float R1 = 10000;
float R2 = 3300;
float Req = R2/(R1+R2);
int Num1 = 10; //cantidad de mediciones
float tension1();
char alerta;
int a = 0;
float Prom2 [5];
int j = 0;
float aux_valalerta = 0,valalerta = 0;
char bat;
void setup()
{
Serial.begin(9600);
}
void loop()
{
float tensionf = tension1(); //busco el valor promediado de tension
Prom2[j] = tensionf; //Se crea un promedio de 4 valores promediados de tension
//Para tomar un valor de alerta (esta forma quedo del metodo
//que utilizaba antes por no poder estabilizar valores)
j = j + 1;
if (j == 4)
{
for (int h; h<=4; h++)
{
aux_valalerta = aux_valalerta + Prom2[h];
}
aux_valalerta = aux_valalerta / 4;
valalerta = aux_valalerta;
aux_valalerta = 0;
j = 0;
}
// Tensiones de bateria:
//
// 12,65 V 100% BIEN
// 12,45 V 75% BIEN
// 12,24 V 50% REGULAR
// 12,06 V 25% MAL
// 11,89 V 0% MAL
// se le asigna una letra a cada seccion de tension y proceso en la aplicacion los mismos
if (valalerta < 12.65)
{
bat = 'V';
}
if (valalerta < 12.45)
{
bat = 'W';
}
if (valalerta < 12.24)
{
bat = 'X';
}
if (valalerta < 12.06)
{
bat = 'Y';
}
if (valalerta < 11.86)
{
bat = 'Z';
}
//esta seccion es un anti rebote para el valor de alarma
//sino al caer por debajo de un valor fijado, en cada ciclo
//una alarma haciendo miles de notificaciones
if (bat == 'Z' || bat == 'Y' || bat == 'X') //Bateria baja
{
a = a + 1; //antirebote
}
else
{
a = 0;
}
if (a==1) //Si bateria esta baja
{
alerta = 'A'; //Aviso con notificacion
valalerta = 0;
}
else
{
alerta = 'B'; //No se notifica nada
}
Serial.print(tensionf); //envio valor de tension
Serial.print('L'); //separador
Serial.print(alerta); //valor de alerta bateria baja
Serial.print('L'); //separador
Serial.println(bat); //letra para mostrar porcentaje de bateria aprox. dependiendo la tension
}
float tension1()
{
int i, Cont = 0;
float TenProm = 0,TenInst = 0,Tension = 0;
if (TenProm != 0) // Para cuando recien se inicia, el promedio es cero
{
for (i=0; i<=Num1; i++)
{
TenInst = (((analogRead(4) * 4.98)/ 1024)/ Req);
if ((TenProm*0,9<TenInst)&(TenProm*1,1>TenInst)) // Descarto los valores que se apartan un 10% por arriba y por abajo del valor promedio
{
Tension = Tension + TenInst;
Cont++;
}
else
Cont--; // Si descarto un valor, tengo que bajar en uno la variable contador para que el promedio de bien
delay (10);
}
}
else
{
for (i=0; i<=Num1; i++)
{
Tension = Tension + (((analogRead(4) * 4.98)/ 1024)/ Req); // Para obtener el primer promedio de tension
delay (10);
}
Cont = Num1;
}
TenProm = Tension / Cont;
return TenProm;
}