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;
}