Arrosage automatique et sonde d'humidité

Bonjour, depuis quelques année j'utilise le programme de Julien Monterrin " Programmateur Horaire Multivoies" que j'ai un peu modifié.
Ce programmateur horaire commande une pompe et des électrovannes pour arroser mon jardin, voie 1 la serre, voies 2-3-4-5 différents arroseurs et une position manuelle qui me permet d'enclencher la pompe en dehors des plages horaires si besoin.
Le problème est que si il pleut assez bien le système se met en marche, donc trop d'eau sur le jardin
J'aimerais modifier le programme et lui adjoindre un programme de détection d'humidité pour un fonctionnement plus optimal, c-à-d, que lorsqu'il pleut, la voie 1 (Serre) soit active mais pas les autres voies.
J'ai essayé en vain d'y intercaller un sketch de détection d'humidité mais ça ne fonctionne pas , soit c'est pas un bon sketch, soit je m'y prends mal.
Quel programme intercaller et surtour comment ?
Merci de m'avoir lu

Voici le code

[code]
// ARDUINO MEGA 6 Voies


#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 RTC;

byte i;
// Init Shield LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Variables mise à jour Horloge
byte TabMaH[6] = {17, 1, 1, 0, 0, 0};
byte MaH; int BpH; byte DrapH; byte SelH; byte ColH; byte MaxH; byte MinH; byte CurH; byte CurligH;

// Variables mise à jour de la plage horaire
int Bp; int MaJ; int Flag; int Vo; int Lig; int Sel; ; int Col; int Val; int Max; int Cur; int CurLig;
// Table Evenements chaque ligne correspond a une voie. Sur la ligne, on trouve H depart, M Depart, H Arret, M Arret..
int TabEvt [6][4] =
{
  {20, 0, 20, 10},
  {20, 11, 20, 16},
  {20, 17, 20, 22},
  {20, 23, 20, 28},
  {20, 29, 20, 34},
  {20, 35, 20, 40}
};
byte PinSorties[6] = {23, 25, 27, 29, 31, 33}; // byte PinSorties[6] = {17,16,11,12,2,3}; pour 6 voies
void setup() {
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  pinMode(2, INPUT); //defini D2 comme entrée switch, entre D2 et GND + R entre D2 et +5v
  pinMode(3, OUTPUT); //defini D3 comme sortie EV Manuel

  // RTC.adjust(DateTime(__DATE__, __TIME__));
  // Initialisation D23,D25,D27,D29,D31,D33 en sorties ----- Initialisation A2,A3,2,3,11,12 en sorties pour 6 voies
  for ( i = 0; i < 6; i++ ) {
    pinMode(PinSorties[i], OUTPUT);
    digitalWrite (PinSorties[i], LOW);
  } // pour 6 voiesfor ( i = 0; i <6; i++ ) {pinMode(PinSorties[i], OUTPUT); digitalWrite (PinSorties[i], LOW);}
  Serial.begin(9600);
  // Saisie MaJ Date,Heure ?
  lcd.setCursor(0, 0); lcd.print("Maj Date,Heure ?");
  lcd.setCursor(0, 1); lcd.print("Sel: O Right: N");
  MaH = 1;
  // Mise à jour Date Heure
  while (MaH == 1) {
    BpH = analogRead (0); delay(100); lcd.setCursor(0, 0);

    //Sortie  mise à  jour
    if (BpH < 50) {
      if (DrapH == 2) {
        RTC.adjust(DateTime(TabMaH[0], TabMaH[1], TabMaH[2], TabMaH[3], TabMaH[4], TabMaH[5]));
      }
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
      MaH = 0;
    }// Fin muise à  jour

    // Incrémentation
    else if (BpH < 200) {
      if (DrapH == 2 && TabMaH[ColH] < MaxH) {
        TabMaH[ColH] ++;
        lcd.setCursor (CurH, CurligH); if (TabMaH[ColH] < 10) {
          lcd.print (0);
        } lcd.print(TabMaH[ColH]);
      }
      delay(200);
    }// Fin incrémentation

    // Décrémentation
    else if (BpH < 380) {
      if (DrapH == 2 && TabMaH[ColH] > MinH) {
        TabMaH[ColH] --;
        lcd.setCursor (CurH, CurligH); if (TabMaH[ColH] < 10) {
          lcd.print (0);
        } lcd.print(TabMaH[ColH]);
      }
      delay(200);
    }// Fin décrémentation

    //Choix valeur à  mettre à  jour
    else if (BpH < 600) {
      if (DrapH > 0) {
        DrapH = 2;
      }
      if (SelH < 6) {
        SelH++ ;
        delay(200);
        ColH = SelH - 1;
      }
      if (SelH == 6) {
        SelH =  0;
      }

      if (ColH == 0) {
        lcd.setCursor(7, 0);
        lcd.print ("**");
        MaxH = 50;
        MinH = 10;
        CurH = 7;
        CurligH = 0;
      }
      else if (ColH != 0) {
        lcd.setCursor(7, 0);
        if (TabMaH[0] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[0]);
      }

      if (ColH == 1) {
        lcd.setCursor(10, 0);
        lcd.print ("**");
        MaxH = 12;
        MinH = 1;
        CurH = 10;
        CurligH = 0;
      }
      else if (ColH != 1) {
        lcd.setCursor(10, 0);
        if (TabMaH[1] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[1]);
      }

      if (ColH == 2) {
        lcd.setCursor(13, 0);
        lcd.print ("**");
        MaxH = 31;
        MinH = 1;
        CurH = 13;
        CurligH = 0;
      }
      else if (ColH != 2) {
        lcd.setCursor(13, 0);
        if (TabMaH[2] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[2]);
      }

      if (ColH == 3) {
        lcd.setCursor(7, 1);
        lcd.print ("**");
        MaxH = 23;
        MinH = 0;
        CurH = 7;
        CurligH = 1;
      }
      else if (ColH != 3) {
        lcd.setCursor(7, 1);
        if (TabMaH[3] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[3]);
      }

      if (ColH == 4) {
        lcd.setCursor(10, 1);
        lcd.print ("**");
        MaxH = 59;
        MinH = 0;
        CurH = 10;
        CurligH = 1;
      }
      else if (ColH != 4) {
        lcd.setCursor(10, 1);
        if (TabMaH[4] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[4]);
      }

      if (ColH == 5) {
        lcd.setCursor(13, 1);
        lcd.print ("**");
        MaxH = 59;
        MinH = 0;
        CurH = 13;
        CurligH = 1;
      }
      else if (ColH != 5) {
        lcd.setCursor(13, 1);
        if (TabMaH[5] < 10) {
          lcd.print (0);
        } lcd.print (TabMaH[5]);
      }
    }//Fin choix valeuyr

    //Affichage ecran saisie
    else if (BpH < 800) {
      lcd.clear(); lcd.setCursor(0, 0); lcd.print (" Date:   /  /  "); lcd.setCursor(0, 1); lcd.print ("Heure:   :  :  ");

      lcd.setCursor (7, 0); if (TabMaH[0] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[0]);
      lcd.setCursor (10, 0); if (TabMaH[1] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[1]);
      lcd.setCursor (13, 0); if (TabMaH[2] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[2]);
      lcd.setCursor (7, 1); if (TabMaH[3] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[3]);
      lcd.setCursor (10, 1); if (TabMaH[4] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[4]);
      lcd.setCursor (13, 1); if (TabMaH[6] < 10) {
        lcd.print (0);
      } lcd.print(TabMaH[5]);
      DrapH = 1;
    }// Fin Affichage
  }//Fin While Maj Heure

  // Saisie Plages Horaires
  lcd.setCursor(0, 0); lcd.print("Maj Horaires ?"); lcd.setCursor(0, 1); lcd.print("Sel: O Right: N");
  MaJ = 1;
  // Mise à jour plages horaires
  while (MaJ == 1) {
    Bp = analogRead (0);
    delay(100);
    lcd.setCursor(0, 0);
    //Sortie  mise à jour
    if (Bp < 50) {
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear(); MaJ = 0;
      Serial.println(Bp);
    } // Fin Sortie

    // Incrémentation
    else if (Bp < 200) {
      Serial.println(Bp);
      if (Flag == 2) {
        if (Val < Max) {
          Val++; TabEvt[Lig][Col] = Val; delay(200); lcd.setCursor(Cur, CurLig);
          if (Val < 10) {
            lcd.setCursor(Cur, CurLig);
            lcd.print ("0");
          }
          lcd.print (Val);
        }
      }
    }// Fin Incrémentaio
    // Dérémentation
    else if (Bp < 380) {
      Serial.println(Bp);
      if (Flag == 2) {
        if (Val > 0) {
          Val--; TabEvt[Lig][Col] = Val; delay(200); lcd.setCursor(Cur, CurLig);
          if (Val < 10) {
            lcd.setCursor(Cur, CurLig);
            lcd.print ("0");
          }
          lcd.print (Val);
        }
      }
    }// Fin Décvrémentation

    // Affichage Plage horaire, sélection Colonne
    else if (Bp < 600) {
      Serial.println(Bp);
      if ( Flag > 0 ) {
        Flag = 2;
        if (Sel < 6) {
          Sel++;
          delay(200);
          Col = Sel - 1;
        }

        if (Col == 0) {
          lcd.setCursor(9, 0);
          lcd.print ("**");
          Val = TabEvt[Lig][Col];
          Max = 23;
          Cur = 9;
          CurLig = 0;
        }
        else if (Col != 0) {
          lcd.setCursor(9, 0);
          if (TabEvt[Lig][0] < 10) {
            lcd.print (0);
          } lcd.print (TabEvt[Lig][0]);
        }

        if (Col == 1) {
          lcd.setCursor(12, 0);
          lcd.print ("**");
          Val = TabEvt[Lig][Col];
          Max = 59;
          Cur = 12;
          CurLig = 0;
        }
        else if (Col != 1) {
          lcd.setCursor(12, 0);
          if ( TabEvt[Lig][1] < 10) {
            lcd.print (0);
          } lcd.print (TabEvt[Lig][1]);
        }

        if (Col == 2) {
          lcd.setCursor(9, 1);
          lcd.print ("**");
          Val = TabEvt[Lig][Col];
          Max = 23;
          Cur = 9;
          CurLig = 1;
        }
        else if (Col != 2) {
          lcd.setCursor(9, 1);
          if ( TabEvt[Lig][2] < 10) {
            lcd.print (0);
          } lcd.print (TabEvt[Lig][2]);
        }

        if (Col == 3) {
          lcd.setCursor(12, 1);
          lcd.print ("**");
          Val = TabEvt[Lig][Col];
          Max = 59;
          Cur = 12;
          CurLig = 1;
        }
        else if (Col != 3) {
          lcd.setCursor(12, 1);
          if ( TabEvt[Lig][3] < 10) {
            lcd.print (0);
          } lcd.print (TabEvt[Lig][3]);
        }

        if (Sel == 6) {
          Sel =  0;
        }
      }
    }// Fin Plages Horaires

    // Afficage Voies,sélection ligne
    else if (Bp < 800) {
      Serial.println(Bp);
      lcd.clear();
      //Max = 23; Cur = 9; CurLig = 0;
      Flag = 1;
      if (Vo < 6) {
        Vo++;
        delay(300);
        Lig = Vo - 1;
      }

      lcd.setCursor(0, 0); lcd.print ("V:   On:   :  "); lcd.setCursor(0, 1); lcd.print ("    Off:   :  ");

      lcd.setCursor(2, 0); lcd.print (Vo);

      lcd.setCursor(9, 0); if ( TabEvt[Lig][0] < 10) {
        lcd.print (0);
      } lcd.print (TabEvt[Lig][0]);

      lcd.setCursor(12, 0); if ( TabEvt[Lig][1] < 10) {
        lcd.print (0);
      } lcd.print (TabEvt[Lig][1]);

      lcd.setCursor(9, 1); if ( TabEvt[Lig][2] < 10) {
        lcd.print (0);
      } lcd.print (TabEvt[Lig][2]);

      lcd.setCursor(12, 1); if ( TabEvt[Lig][3] < 10) {
        lcd.print (0);
      } lcd.print (TabEvt[Lig][3]);

      if (Vo == 6) {
        Vo = 0;
      }
      Sel = 0;
    }// Fin Affichage
  }// Fin While  Maj Plages Horaires
}// Fin Setup


void loop() {

  int lecture = digitalRead(2); //lit la valeur du swtich en D1
  if (lecture == HIGH )
  {
    lcd.setCursor(12, 1);
    lcd.print("MANUEL");

    digitalWrite(3, HIGH); // allume EV manuel
  }
  else
  {
    lcd.setCursor(12, 1);
    lcd.print("AUTO");

    digitalWrite(3, LOW); //éteint EV manuel
  }
  DateTime now = RTC.now();

  // Afficher l'heure sur la premiêre ligne du LCD

  lcd.setCursor(0, 0);
  lcd.print("Heure: ");
  if (now.hour() < 10) {
    lcd.print("0");
  }
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
  }
  lcd.print(now.minute());
  //lcd.print(":");
  //if (now.second() < 10) {
  //lcd.print("0");
  //}
  //lcd.print(now.second());

  // Afficher Voies actives sur la deuxième ligne du LCD

  lcd.setCursor(0, 1);
  lcd.print("Voie:");

  // Rechercher si heure actuelle est dans dans la ou les plages horaires

  for ( i = 0; i < 6; i++ ) {
    if (now.hour() == TabEvt [i][0] && now.minute() == TabEvt [i][1])
    {

      digitalWrite (PinSorties[i], HIGH);

    }
    if (now.hour() == TabEvt [i][2] && now.minute() == TabEvt [i][3])

    {
      digitalWrite (PinSorties[i], LOW);

    }

    lcd.setCursor(5 + i, 1);
    if (digitalRead(PinSorties[i]) == HIGH)
    {
      lcd.print(i + 1);
    }
    else {
      lcd.print("-");
    }
  }
  delay(1000);
  lcd.clear();
}// Fin Loop)
[/code]

voilà le code qui active ou désactive les pins des relais

c'est assez "basique" mais ça fait le job.

il vous suffit de rajouter dans le if d'activation un test sur le niveau d'humidité pour les voies autres que la serre

    if (now.hour() == TabEvt [i][0] && now.minute() == TabEvt [i][1])
    {
      if (i == 0 || terrainSec())   digitalWrite (PinSorties[i], HIGH); // l'indice 0 (la voie 1  = la Serre) est toujours arrosé
    }

il faut définir une fonction

bool terrainSec() {
  ...;        // lire le capteur d'humidité
  return XXX; // retourner true s'il n'a pas plu
}

ne mettez pas le capteur d'humidité là où vous arrosez :slight_smile:

on conserve la désactivation lors de la détection de la fin d'arrosage, ça ne mange pas de pain... la pin sera déjà LOW

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.