Bonjour,
Après avoir essayé plusieurs codes, j'ai besoin de votre éclairage sur la temporisation dans le "case" de la machine à états
En effet, dans le code ci dessous, je veux mettre sous tension une électrovanne pendant 10 secondes pour ne pas laisser une tension de 220 V en permanence dans le faisceau électrique.
Cette temporisation fonctionne correctement pour effectuer la fermeture de l'électrovanne, mais c'est un peu plus différent pour l'ouverture car après les 10 secondes, il me reste une tension résiduelle ( plutôt une tension quasi alternative) qui fait vibrer le relais
Votre expertise devrait pouvoir détecter l'anomalie de ma programmation
Cela fait plus d'une semaine que j'ai fait différents essais sans y parvenir avec succès
Merci par avance de votre aide
#define MY_GATEWAY_SERIAL
#include <MySensors.h>
//Definition des NODES: ou NOEUD
#define NODE_ID_FUITE_ZONE1 1
#define NODE_ID_FUITE_TEXTE 4
#define NODE_ID_FUITE_SELECTOR 5
//https://www.mysensors.org/download/serial_api_20
// pour une node fuite d'eau il faut utiliser V_TRIPPED ou V_ARMED
MyMessage msgFuiteZone1(NODE_ID_FUITE_ZONE1, V_TRIPPED);
MyMessage msgFuiteTexte(NODE_ID_FUITE_TEXTE, V_TEXT);
MyMessage msgFuiteSelector(NODE_ID_FUITE_SELECTOR, V_PERCENTAGE);
#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, 20, 4); // Adresse I2C de l'écran LCD 20x4
const int brocheDebit = 2; // Broche de la sonde de débit d'eau
const int brocheElectrovanneOuv = 4; // Broche pour contrôler l'électrovanne ouverte
const int brocheElectrovanneFerm = 15; // Broche pour contrôler l'électrovanne fermée
const int brocheBouton = 16; // Broche du bouton-poussoir pour remise à zéro
unsigned int compteImpulsions = 0;
float debitInstantane = 0.0;
float totalLitres = 0.0; // Changement d'unité de litres à mètres cubes
unsigned long tempsPrecedent = 0;
const long intervalle = 500; // Intervalle d'échantillonnage en millisecondes
const unsigned long dureeControleFuite = 1000; // Durée de controle d'une fuite éventuelle en millisecondes
const unsigned long delaiTempsOuvElectrovanne = 10000; // Délai du tempds d'ouverture de l'électrovanne en millisecondes
const unsigned long delaiTempsFermElectrovanne = 10000; // Délai du temps de fermeture de l'électrovanne en millisecondes
unsigned long tempsOuvert = 0;
enum Etat { REPOS,
ACTIF,
STOP };
// tous les éléments contenus dans la structure seront identifiés par un . précédant le nom de l'élément à rechercher
//par exemple, pour identifier le "seuilDebitCoupe", on inscrit "digitalRead(zone.seuilDebitCoupe)"
struct SZone {
const byte broche; // N° de la broche pour information de la zone d'arrosage
const float seuilDebitCoupe; // Débit maxi autorisé
Etat etat; //
unsigned long tempsDebutDebit;
unsigned long tempsDebutEtat;
unsigned long tempsDebutOuvre;
unsigned long tempsDebutFerme;
bool emis;
};
SZone zones[] = {
{5, 1.1, REPOS, 0, 0, false}, // N° broche , Débit maxi, Etat etat , temps début débit, temps début Etat, message émis
{6, 2.1, REPOS, 0, 0, false},
{7, 3.1, REPOS, 0, 0, false},
{8, 4.1, REPOS, 0, 0, false},
{9, 5.1, REPOS, 0, 0, false},
{10, 6.1, REPOS, 0, 0, false}
};
void setup() {
lcd.begin(20, 4); // Initialisation de l'écran LCD 20x4
lcd.print("Debit: 0.0 m3/h");
lcd.setCursor(0, 1);
lcd.print("Total: 0.0 m3");
pinMode(brocheDebit, INPUT);
pinMode(brocheElectrovanneOuv, OUTPUT);
pinMode(brocheElectrovanneFerm, OUTPUT);
pinMode(brocheBouton, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(brocheDebit), compteurImpulsions, FALLING);
}
void loop() {
unsigned long tempsActuel = millis(); // Obtient le temps actuel en millisecondes
if (tempsActuel - tempsPrecedent >= intervalle) {
// calcul et affichage du débit
noInterrupts();
unsigned int compteurLocal = compteImpulsions; // Conversion du nombre d'impulsions en débit instantané en Litres par minute
compteImpulsions = 0;
interrupts();
tempsPrecedent = tempsActuel;
float volume=compteurLocal/450.0; // volume en litre
debitInstantane=volume/intervalle*1000*60; // débit en l/mn
totalLitres += volume;
lcd.clear();
lcd.print("Debit: ");
lcd.print(debitInstantane, 0);
lcd.print(" L/mn");
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(totalLitres, 0);
lcd.print(" L");
}
for (auto &zone : zones) // effectue le traitement pour toutes les zones
{
if (digitalRead(zone.broche) == HIGH) { //Lecture de l'information de l'arrosage de la Zone
switch (zone.etat) {
case REPOS:
digitalWrite(brocheElectrovanneOuv, HIGH);
if (tempsActuel - zone.tempsDebutOuvre >= delaiTempsOuvElectrovanne){
digitalWrite(brocheElectrovanneOuv, LOW);}
if (debitInstantane > zone.seuilDebitCoupe) {
zone.tempsDebutDebit = tempsActuel;
zone.etat = ACTIF;
}
break;
case ACTIF:
if (debitInstantane > zone.seuilDebitCoupe) {
if (tempsActuel - zone.tempsDebutDebit >= dureeControleFuite) {
digitalWrite(brocheElectrovanneFerm, HIGH);
zone.tempsDebutFerme = tempsActuel;
zone.etat = STOP;
zone.tempsDebutEtat = tempsActuel;
}
}
else {
zone.etat = REPOS;
zone.tempsDebutEtat = tempsActuel;
zone.tempsDebutOuvre = tempsActuel;
}
break;
case STOP:
const int zoneIndex = &zone - zones + 1;
lcd.setCursor(0, 2);
lcd.print("Fuite Zone "); // Affiche un avertissement de fuite
lcd.print(zoneIndex); // affiche numéro de zone
if (tempsActuel - zone.tempsDebutFerme >= delaiTempsFermElectrovanne){
digitalWrite(brocheElectrovanneFerm, LOW);}
// On ne signale l'erreur que si ça n'a pas déjà été fait
if (zone.emis == false) {
char messageFuite[] = "Fuite zone 0";
messageFuite[11] += zoneIndex;
send(msgFuiteTexte.set(messageFuite));
zone.emis = true;
}
if (digitalRead(brocheBouton) == LOW) {
if (tempsActuel - zone.tempsDebutEtat >= 2000) {
zone.etat = REPOS;
zone.emis = false;
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 {
zone.tempsDebutEtat = tempsActuel;
zone.tempsDebutOuvre = tempsActuel;
}
break;
}
}
}
}
void compteurImpulsions() {
compteImpulsions++;
}
//Fonction de presentation a rajouter
void presentation()
{
// Present locally attached sensors
present(NODE_ID_FUITE_ZONE1, S_WATER_LEAK);
present(NODE_ID_FUITE_TEXTE, S_INFO);
present(NODE_ID_FUITE_SELECTOR, S_DIMMER);
}