n'étant pas assez expérimenté, je comprends vos commentaires, mais je n'arrive pas à les mettre en forme pour comprendre et valider un choix dans mon code
Le principe de structure pourrait être intéressant dans une version évolutive, mais quoi inscrire ou comment programmer dans le Setup et dans le loop
Pour ce qui est du For, ci dessous le code qui ne fonctionne pas dans le Void Loop......mais où est l'erreur ?
Merci de votre retour
//detection de fuite avec bouton de réactivation pour plusieurs Zones avec plusieurs seuils de débit maxi
#include <Wire.h> // Bibliothèque pour la communication I2C
#include <LiquidCrystal_I2C.h> // Bibliothèque pour le contrôle de l'écran LCD en mode I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C de l'écran LCD 16x2
const int brocheDebit = 2; // Broche de la sonde de débit d'eau
const int brocheElectrovanne = 3; // Broche pour contrôler l'électrovanne
const int brocheBouton = 4; // Broche du bouton-poussoir pour remise à zéro
const int brocheZone[] {0,5,6,7,8,9,10}; // la broche 0 correspond à la zone 0, la N° 5 à la Zone 2, etc...
//const int brocheZone1 = 5; // Broche d'information de l'arrosage de la Zone 1
//const int brocheZone2 = 6; // Broche d'information de l'arrosage de la Zone 2
//const int brocheZone3 = 7; // Broche d'information de l'arrosage de la Zone 3
//const int brocheZone4 = 8; // Broche d'information de l'arrosage de la Zone 4
//const int brocheZone5 = 9; // Broche d'information de l'arrosage de la Zone 5
//const int brocheZone6 = 10; // Broche d'information de l'arrosage de la Zone 6
unsigned int compteImpulsions = 0;
float debitInstantane = 0.0;
float totalMetresCubes = 0.0; // Changement d'unité de litres à mètres cubes
unsigned long tempsPrecedent = 0;
unsigned long tempsDebutDebit = 0;
unsigned long tempsDebutEtat = 0;
const long intervalle = 500; // Intervalle d'échantillonnage en millisecondes
const float seuilDebitCoupeZone1 = 1.1; //Débit maxi pour la zone 1
const float seuilDebitCoupeZone2 = 2.1; //Débit maxi pour la zone 2
const float seuilDebitCoupeZone3 = 5.1; //Débit maxi pour la zone 3
const float seuilDebitCoupeZone4 = 4.1; //Débit maxi pour la zone 4
const float seuilDebitCoupeZone5 = 3.1; //Débit maxi pour la zone 5
const float seuilDebitCoupeZone6 = 6.1; //Débit maxi pour la zone 6
const unsigned long delaiFermetureElectrovanne = 1000; // Délai de fermeture de l'électrovanne en millisecondes
enum Etat { REPOS, ACTIF, STOP };
Etat etat = REPOS;
void setup() {
lcd.begin(16, 2); // Initialisation de l'écran LCD 16x2
lcd.print("Debit: 0.0 m3/h");
lcd.setCursor(0, 1);
lcd.print("Total: 0.0 m3");
pinMode(brocheDebit, INPUT);
pinMode(brocheElectrovanne, OUTPUT);
pinMode(brocheBouton, INPUT_PULLUP);
for (int i = 1; i<7; i++){
pinMode(brocheZone[i], INPUT);
}
//pinMode(brocheZone1, INPUT);
//pinMode(brocheZone2, INPUT);
//pinMode(brocheZone3, INPUT);
//pinMode(brocheZone4, INPUT);
//pinMode(brocheZone5, INPUT);
//pinMode(brocheZone6, INPUT);
}
void loop() {
unsigned long tempsActuel = millis(); // Obtient le temps actuel en millisecondes
if(digitalRead(brocheZone[i] == HIGH)){ //Lecture de l'information de l'arrosage de la Zone 1
switch (etat) {
case REPOS:
digitalWrite(brocheElectrovanne, HIGH);
if (debitInstantane > seuilDebitCoupeZone1) {
tempsDebutDebit = tempsActuel;
etat = ACTIF;
}
break;
case ACTIF:
if (debitInstantane > seuilDebitCoupeZone1) {
if (tempsActuel - tempsDebutDebit >= delaiFermetureElectrovanne) {
digitalWrite(brocheElectrovanne, LOW);
etat = STOP;
tempsDebutEtat = tempsActuel;
}
} else {
etat = REPOS;
}
break;
case STOP:
//lcd.clear(); // Effacer l'écran après le message de démarrage
lcd.setCursor(0, 0);
lcd.print("Fuite Zone1 "); // Affiche un avertissement de fuite
// Nouvelle condition pour la réinitialisation avec maintien de 2 secondes
if (digitalRead(brocheBouton) == LOW) {
if (tempsActuel - tempsDebutEtat >= 2000) {
digitalWrite(brocheElectrovanne, HIGH);
etat = REPOS;
lcd.setCursor(0, 0);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
lcd.setCursor(0, 1);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
}
} else {
tempsDebutEtat = tempsActuel;
}
break;
}
}
/* if(digitalRead(brocheZone2) == HIGH){ //Lecture de l'information de l'arrosage de la Zone 2
switch (etat) {
case REPOS:
digitalWrite(brocheElectrovanne, HIGH);
if (debitInstantane > seuilDebitCoupeZone2) {
tempsDebutDebit = tempsActuel;
etat = ACTIF;
}
break;
case ACTIF:
if (debitInstantane > seuilDebitCoupeZone2) {
if (tempsActuel - tempsDebutDebit >= delaiFermetureElectrovanne) {
digitalWrite(brocheElectrovanne, LOW);
etat = STOP;
tempsDebutEtat = tempsActuel;
}
} else {
etat = REPOS;
}
break;
case STOP:
//lcd.clear(); // Effacer l'écran après le message de démarrage
lcd.setCursor(0, 0);
lcd.print("Fuite Zone2 "); // Affiche un avertissement de fuite
// Nouvelle condition pour la réinitialisation avec maintien de 2 secondes
if (digitalRead(brocheBouton) == LOW) {
if (tempsActuel - tempsDebutEtat >= 2000) {
digitalWrite(brocheElectrovanne, HIGH);
etat = REPOS;
lcd.setCursor(0, 0);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
lcd.setCursor(0, 1);
lcd.print(" "); // Efface le texte "Fuite" lors du retour à l'état REPOS
}
} else {
tempsDebutEtat = tempsActuel;
}
break;
}
}
*/
if (tempsActuel - tempsPrecedent >= intervalle) {
detachInterrupt(digitalPinToInterrupt(brocheDebit));
debitInstantane = compteImpulsions / 7.5; // Conversion du nombre d'impulsions en débit instantané en mètres cubes par heure
totalMetresCubes += (debitInstantane / 3600.0); // Ajout du débit instantané au total en mètres cubes
lcd.clear();
lcd.print("Debit: ");
lcd.print(debitInstantane, 1);
lcd.print(" m3/h");
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(totalMetresCubes, 1);
lcd.print(" m3");
compteImpulsions = 0;
tempsPrecedent = tempsActuel;
attachInterrupt(digitalPinToInterrupt(brocheDebit), compteurImpulsions, FALLING);
}
}
void compteurImpulsions() {
compteImpulsions++;
}