Bonjour Jeje95150,
actuellement, j'ai plusieurs programmateurs d'arrosage qui sont répartis à différents lieux dans mon terrain. Tous fonctionnent très bien, sauf que quand un tuyau se démanche ou éclate, je n'ai aucun moyen d'arrêter immédiatement l'arrivée de l'eau avant l'électrovanne pilotée par le programmateur. Et ce de façon définitive avant de réarmer manuellement l'ouverture de la vanne principale .
A noter que la fermeture de la vanne principale ne doit concerné que la zone d'arrosage qui a un tuyau défectueux. C'est pour cela que le pilotage de ce détecteur de fuite est assujetti à la commande d'un des programmateurs d'arrosage
Est-ce cela te paraît plus clair
A noter que tu peux suivre mon autre post qui a bien avancé par l'aide de Kamill pour mon problème de "structure"
Je te joins aussi le code d'un programmateur 6 zones qui a l'avantage d'inverser la polarité des sondes d'humidité toutes les 14 minutes
#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
#define MAGIC 10
RTC_DS3231 RTC ;
//Carte UNO =>SDA (A4) & SCL(A5)...Carte Mega 2560 =>SDA (20) & SCL(21)
//DateTime now = RTC.now();
// Init Shield LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Variables mise à jour Horloge
byte TabMaH[6] = {27, 2, 23, 21, 00, 0};
byte MaH;
int BpH;
byte DrapH, SelH, ColH, MaxH, MinH, CurH, CurligH, Val;
// Variables mise à jour de la plage horaire
int Bp, MaJ, Flag, Vo, Lig, Sel, Col, Max, Cur, CurLig;
// Table Evénerments chaque ligne correspond à une voie. Sur la ligne, on trouve H départ, M Départ, H Arrêt, M Arrêt..
byte TabEvt [6][4] =
{
{20, 8, 21, 11},
{21, 6, 22, 42},
{22, 12, 22, 43},
{21, 23, 21, 44},
{21, 12, 22, 40},
{22, 50, 23, 05},
};
byte PinSorties[6] = {57, 56, 11, 12, 2, 3}; // dans l'ordre de fonctionnement
// Carte UNO => byte PinSorties[6] = {17, 16, 11, 12, 2, 3}; // dans l'ordre de fonctionnement
// initialisation des PinSorties pour les relais d'inversion des sondes
byte PinRelais[6] = {26, 28, 24, 30, 22, 32}; // dans l'ordre de fonctionnement
// Les fonctions
void lecturePlages () {
Serial.println("lecture plages EEPROM");
// D'abord lecture du nombre magique
int address = 0;
byte magic;
EEPROM.get(address, magic);
Serial.print("Nombre magique : "); Serial.println(magic);
if (magic != MAGIC) { // J'ai choisi 10
Serial.println("Pas bon, on sauve...");
// Le nombre n'y est pas : on sauvegarde les données du TabEvt
sauvePlages();
} else {
Serial.println("Bon, on lit EEPROM");
// Le nombre y est : on lit les données EEPROM et on les met dans TabEvt
++address;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 4; j++) {
byte nombre;
EEPROM.get(address, nombre);
Serial.print ("Lu nombre "); Serial.print(nombre);
Serial.print(" @ adresse "); Serial.println(address);
TabEvt[i][j] = nombre;
Serial.print (" et sauvé dans TabEvt indices "); Serial.print(i);
Serial.print (" "); Serial.println(j);
++address;
}
}
}
}
void sauvePlages() {
Serial.println("sauvegarde plages EEPROM");
// D'abord écriture du nombre magique
int address = 0;
Serial.println("Sauvegarde nombre magique");
EEPROM.update(address, MAGIC);
// Ensuite écriture du tableau
++address;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 4; j++) {
byte nombre = TabEvt[i][j];
EEPROM.update(address, nombre);
// if(EEPROM.read(address) != nombre) EEPROM.write(address, nombre);
Serial.print(i); Serial.print(" "); Serial.print(j); Serial.print(" : sauve nombre ");
Serial.print(nombre); Serial.print(" @ adresse "); Serial.println(address);
++address;
}
}
}
void setup() {
Wire.begin();
RTC.begin();
// if (RTC.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
// Lorsque le temps doit être réglé sur un nouvel appareil, ou après une perte de puissance,
//la ligne suivante définit le CCF à la date et à l’heure à laquelle ce croquis a été compilé.
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
// }
lcd.begin(16, 2);
// RTC.adjust(DateTime(2021,01,18,21,01,01));
// Initialisation A2,A3,2,3,11,12 en sorties
byte i; for ( i = 0; i < 6; i++ ) {
pinMode(PinSorties[i], OUTPUT);
digitalWrite (PinSorties[i], HIGH);
pinMode(PinRelais[i], OUTPUT);
digitalWrite (PinRelais[i], HIGH);
}
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);
Serial.println(BpH);
//Sortie mise à jour
if (BpH < 50) {
Serial.println("Mise à jour heure date");
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 mise à 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 {
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 {
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 {
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 {
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 {
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 {
lcd.setCursor(13, 1);
if (TabMaH[5] < 10) lcd.print (0);
lcd.print (TabMaH[5]);
}
}//Fin choix valeur
//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;
lecturePlages(); // lecture dans Eeprom
// 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émentaion
// Décré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écré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 {
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 {
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 {
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
// Affichage 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
sauvePlages(); //sauvegarde des plages dans Eeprom
}// Fin Setup
void loop() {
lcd.clear();
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());
// Afficher Voies actives sur la deuxième ligne du LCD
lcd.setCursor(0, 1);
lcd.print("Voies:");
// début de modif
int heure = now.hour() * 100 + now.minute();
for (int i = 0; i < 6; i++) {
if (TabEvt[i][0] == 25) continue; // On en fait rien dans ce cas
int heureDebut = TabEvt[i][0] * 100 + TabEvt[i][1];
int heureFin = TabEvt[i][2] * 100 + TabEvt[i][3];
if (heureDebut <= heure && heure < heureFin) {
lcd.print(i + 1);
digitalWrite (PinSorties[i], HIGH);
digitalWrite (PinRelais[i], HIGH);
delay(500000);
digitalWrite (PinRelais[i], LOW);
delay(500000);
} else {
lcd.print("-");
digitalWrite (PinSorties[i], LOW);
digitalWrite (PinRelais[i], HIGH);
}
}
delay(1000);
lcd.clear();
}