/*
                           Surveillance tension batterie 12 volts
Surveille la tension d'une batterie plomb 12 volts.
On utilise un pont diviseur par 4 pour lire cette tension.
De façon a ce que la tension ne dépasse pas 5 volts sur l'entrée analogique.
La valeur lue est lissée pour en faire une moyenne glissante 
Si la tension de la batterie passe en dessous de 12 volts, on allume une led .
*/
 
 
// Définition du nombre d'échantillons
// pour le calcul de la moyenne glissante
const int nEchantillons = 20;
 
float echantillon[nEchantillons];    // un tableau pour stocker les échantillons lus
int indice = 0;                    // l'indice de l'échantillon courant
float total = 0;                   // la somme des échantillons mémorisés
float moyenne = 0;                 // la moyenne des échantillons mémorisés

float seuil = 3.00;           // Seuil tension bas à ajuster selon votre batterie 

int inputPin = A0;           // pin de raccordement de la lecture de tension (pont diviseur) 
const int ledPin = 1;       // pin de raccordement de la LED
const int buzzer = 2;       // pin de raccordement de la LED 

void setup() {
  // Initialisation du port série
  Serial.begin(9600);
   // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // On remplit le tableau d'échantillons avec des 0
  for (int i = 0; i < nEchantillons; i++) {
    echantillon[i] = 0;
  }
}
 
void loop() {
  // Soustraction de l'echantillon précédent
  total = total - echantillon[indice];
  
  // Lecture du capteur
  echantillon[indice] = analogRead(inputPin);

   // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  echantillon[indice] = echantillon[indice] * (5.0 / 1023.0);

  
  // Ajout du dernier echantillon
  total = total + echantillon[indice];
  
  // Incrémentation de l'indice
  indice++;
  // si on est à la fin du tableau ...
  if (indice >= nEchantillons) {
    // ...retour au début
    indice = 0;
  }
 
  // calcul de la moyenne
  moyenne = total / nEchantillons;
 
 
  
  Serial.println(moyenne);
  delay(100);
  
   // Si la moyenne de la lecture analogique de tension passe en dessous du seuil prédéfini on allume la LED:
  if (moyenne < seuil) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(buzzer, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
    digitalWrite(buzzer, LOW);
  } 
}