Arroseur Automatique

/* Programme "Arrosage_Micro_DoubleScroll V3_While_loop"
Manuel d'utilisation : 
1/ Un potentiomètre permet de régler le temps OFF entre 0h à 48 Heures entre 2 pompages
2/ Une second potentiomètre règle la durée d'arrosage entre 0 à  15 secondes
3/ Le pompage est continu dans le Potentiomètre Delai On est totalement tounée dans le sens horaire
4/ Le pompage est arrêté qd le  Potentiomètre Delai On est totalement tounée dans le sens anti-horaire
5/ Un capteur qui détecte le niveau bas (5V à l'état haut d'eau et courant coupé à état bas d'eau) afin de protéger la pompe
6/ "THE BEER-WARE LICENSE":
    As long as you retain this notice you can do whatever you want with this stuff. 
    If we meet some day, and you think this stuff is worth it, you can buy me a beer in return
    Adrien Blot-Saby 18/03/2020 */

// Pin out commande du relai
int PinP1=6; 
// Pin lecture potentimètre OFF
int ScrollPinOFF=A2; 
// Pin lecture potentimètre ON
int ScrollPinON=A3;  
// Detecteur niveau
int PinNiv=A1; 
// Variable ou est stocké l'état du niveau
bool EtatNiveau = true; 

// constante lecture potentionmètre Off
int ScrollOFF=0; 
// constante lecture potentionmètre ON
int ScrollON=0;  

// LED indication statut, éteint : ON en continu, clignote : en foncitonnement normal Allumé : pompage OFF
int PinLED=2;
//Constante d'heure calculé à partir de conversion et de la valeur lue du potentionmètre
double heure=0; 

// Constante où est sotckée le temps millis()
long Time1=0;
// Temps en MS durant lequel la pompe1 reste Allumée 
long DelaiON1=1000;
// Temps en MS durant lequel la pompe est OFF en fonction du potentimètre
long DelaiOFF1=1000; 

// Constantes de temps Max et Min pour le calcul de la fréquence
double TimeOffMax=48;
int TimeOffMin=1;

// Constante de temps Max et Min pour le calcul du volume
double TimeOnMax=15;
int TimeOnMin=1;

// Constante de sensibilité des chgement potentiomètre
int s = 10;

void setup() {
 Serial.begin(9600);
// Configuration des Pins de commande de pompage
  pinMode(PinP1, OUTPUT);
  pinMode(PinLED, OUTPUT);
// Configuration boutons de réglage
 pinMode(ScrollPinOFF,INPUT);
 pinMode(ScrollPinON,INPUT);
            }
            
// Boucle principale 
void loop() {
  
Affichage();

// Coprs du programme de changement de statut du relai qui contrôle la pompe à base de fonctions if
while (EtatNiveau==true)
{
// Fonctionnement Normal si le potentionmètre n'est pas en butée, la LED clignote
    
  // Boucle de temps en fonctionnement ON
    while (Time1<DelaiON1 && ScrollON50 && EtatNiveau==true)
    {
      digitalWrite(PinP1,LOW);Serial.println("Etat ON");
      digitalWrite(PinLED,HIGH); delay(1000); // LED alumée et delai de  1000 ms
      Time1=Time1+1000; // ajout de 1000 ms
      Affichage();
     // si le poteniomètre de volume ou fréquence est changé (-/+ 7), alors on sort de la conditions While pour une reconfiguration de la boucle
     if( analogRead(ScrollPinON)>ScrollON+s || analogRead(ScrollPinON)<ScrollON-s) 
        {break;} 
    }

    Time1=0;

     // Lecture du potentiomètre BOuton ScrollOFF
     ScrollOFF=analogRead(ScrollPinOFF);
     // Lecture du potentiomètre du bouton Glissière (ou Scroll) ON
     ScrollON=analogRead(ScrollPinON);
    
  // Boucle de temps en fonctionnement OFF
    while (Time1<DelaiOFF1 && ScrollON50 && EtatNiveau==true)
    {
     digitalWrite(PinP1,HIGH); Serial.println("POMPAGE OFF");
     
     Affichage();
      
     digitalWrite(PinLED,LOW); delay(500); digitalWrite(PinLED,HIGH); delay(500); // LED clignote et delai de 1000 ms
     Time1=Time1+1000; // ajout de 1000 ms
      // si le poteniomètre de volume ou fréquence est changé (-/+ 10), alors on sort de la conditions While pour une reconfiguration de la boucle
     if( analogRead(ScrollPinON)>ScrollON+s || analogRead(ScrollPinON)1000 && EtatNiveau==true ) // si le bouton ON est tournée à fond ou celui OFF au minimum alors le pompage est continu
    {   
      digitalWrite(PinP1,LOW); Serial.println("POMPAGE CONTINU");
      
      Affichage();
      
      digitalWrite(PinLED,HIGH);
      delay(1000);
      }

      
     // CAS POMPAGE ARRETE // Bouton DELAI_ON TOURNE A FOND A DROITE
     if (ScrollON<50 && EtatNiveau==true) // si le bouton ON est tournée est minimum ou celui OFF au max alors le pompage est Arreté
     {
      digitalWrite(PinP1,HIGH);Serial.println("POMPAGE ARRETE, assez eau");
      
      Affichage();
      
      digitalWrite(PinLED,LOW); 
      delay(1000);
      }
}

// Seconde boucle principale en cas de détection de niveau bas de l'eau
while (EtatNiveau==false)
{ 
  Serial.println("Pas assez d'eau!");Serial.print("t");
  digitalWrite(PinP1,HIGH);Serial.println("POMPAGE ARRETE, éteindre le régulateur, remplir et rallumer");
  Affichage();
  delay(2000); // attente de 10 s
}

} // Fin du programme


// fonction qui permet de calculer et afficher dans le moniteur série les valeurs de temps OFF et ON
void Affichage() 
{

      // Lecture du potentiomètre BOuton ScrollOFF
      ScrollOFF=analogRead(ScrollPinOFF);
      // Lecture du potentiomètre du bouton Glissière (ou Scroll) ON
      ScrollON=analogRead(ScrollPinON);
      // Lecture niveau d'eau. 
      if (analogRead(PinNiv)<1020) {EtatNiveau=false;}
      
      // Conversion de la valeur numérique (ScrollOFF) en valeur de temps (heure) OFF comprise en un temps Miniumu et Maximum
      heure=(-(TimeOffMax-TimeOffMin)/1023*ScrollOFF+TimeOffMax);
      // Conversion du temps d'heure en MS METTRE 3600 (à 1 si test en seconde)
      DelaiOFF1=heure*1000*3600;
      Serial.println("DelaiOFF1(h):");Serial.print(DelaiOFF1/3600000.0);      // Lecture du potentiomètre du bouton Glissière (ou Scroll) ON
      ScrollON=analogRead(ScrollPinON);
      DelaiON1=(TimeOnMax/1023*ScrollON-TimeOnMin)*1000.0; // en MS
      Serial.println("DelaiON(s):");Serial.print(DelaiON1/1000);
      Serial.println("Time1 (s):");Serial.print(Time1/1000);
      Serial.println("Etat niveau: ");Serial.print(EtatNiveau);

}