Bonjour à tous,
Je souhaite avoir l'affichage d'une valeur sur le lcd et que le positionnement de cette valeur soit différent en fonction de cette valeur
En concret, le programme détecte une fuite d'eau par zone d'arrosage : Par exemple,
si la fuite est sur la zone 1, l'affichage du " 1 " doit se positionner sur le 10ème curseur de la ligne N° 3,
si la fuite est sur la zone 2, l'affichage du " 1 " doit se positionner sur le 11ème curseur de la ligne N° 3,
si la fuite est sur la zone 3, l'affichage du " 1 " doit se positionner sur le 12ème curseur de la ligne N° 3,
ainsi de suite..
Ci dessous la partie du code qui me pose problème
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 en déplaçant le curseur en fonction du N° de la zone
if (tempsActuel - zone.tempsDebutFerme >= delaiTempsFermElectrovanne){
digitalWrite(brocheElectrovanneFerm, HIGH);}
Ci dessous l'intégralité du code
#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 = 14; // 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,
OUVERT,
ACTIF,
STOP,
FERMER
};
// 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[] = {
{3, 1.1, REPOS, 0, 0, 0, 0, false}, // N° broche , Débit maxi, Etat etat , temps début débit, temps début Etat,
{4, 2.1, REPOS, 0, 0, 0, 0, false}, // temps debut Ouvre, temps début Ferme, message émis
{5, 3.1, REPOS, 0, 0, 0, 0, false},
{6, 4.1, REPOS, 0, 0, 0, 0, false},
{7, 5.1, REPOS, 0, 0, 0, 0, false},
{8, 6.1, REPOS, 0, 0, 0, 0, false}
};
void fermerVanne()
{
digitalWrite(brocheElectrovanneOuv, HIGH);
digitalWrite(brocheElectrovanneFerm, HIGH);
Etat etat = REPOS;
}
void setup() {
lcd.init();
lcd.backlight();
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");
fermerVanne();
Serial.begin(115200);
// Serial.print("Debit: 0.0 m3/h");
Serial.print(debitInstantane, 0);
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
{
switch (zone.etat) {
case REPOS:
if (digitalRead(zone.broche) == HIGH) {
digitalWrite(brocheElectrovanneOuv, LOW);
digitalWrite(brocheElectrovanneFerm, HIGH);
zone.tempsDebutOuvre = tempsActuel;
const int zoneArrosage = &zone - zones + 1;
lcd.setCursor(0, 3);
lcd.print("Arrosage Zone "); // Affiche la zone d'arrosage
lcd.print(zoneArrosage); // affiche numéro de zone
//lcd.scrollDisplayRight(zoneArrosage);
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
const int zoneBroche = zone.broche;
Serial.print("Repos Ouvert "); // affiche l'état de la zone.etat sur moniteur serie
Serial.print(zoneSerie); // affiche le N° de la zone sur moniteur serie
Serial.println(zoneBroche); // affiche le N° de la zone sur moniteur serie
zone.etat = OUVERT;
}
break;
case OUVERT:
if (digitalRead(zone.broche) == HIGH) {
const int zoneArrosage = &zone - zones + 1;
lcd.setCursor(0, 3);
lcd.print("Arrosage Zone "); // Affiche la zone d'arrosage
lcd.print(zoneArrosage); // affiche numéro de zone
if (tempsActuel - zone.tempsDebutOuvre >= delaiTempsOuvElectrovanne){
digitalWrite(brocheElectrovanneOuv, HIGH);
}
if (debitInstantane > zone.seuilDebitCoupe) {
zone.tempsDebutDebit = tempsActuel;
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Ouvert Actif "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie
zone.etat = ACTIF;
}
}
else {
digitalWrite(brocheElectrovanneOuv, HIGH);
digitalWrite(brocheElectrovanneFerm, LOW);
zone.tempsDebutFerme = tempsActuel;
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Ouvert Fermer "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie Serial.println("Ouvert Fermer");
zone.etat = FERMER;
zone.tempsDebutEtat = tempsActuel;
}
break;
case FERMER:
if (tempsActuel - zone.tempsDebutFerme >= delaiTempsFermElectrovanne)
{
digitalWrite(brocheElectrovanneFerm, HIGH);
// if (digitalRead(zone.broche) == HIGH) {
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Fermer Repos "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie Serial.println("Fermer Repos");
zone.etat = REPOS;
// }
}
break;
case ACTIF:
if (debitInstantane > zone.seuilDebitCoupe) {
if (tempsActuel - zone.tempsDebutDebit >= dureeControleFuite) {
digitalWrite(brocheElectrovanneOuv, HIGH);
digitalWrite(brocheElectrovanneFerm, LOW);
zone.tempsDebutFerme = tempsActuel;
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Actif Stop "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie Serial.println("Actif Stop");
zone.etat = STOP;
zone.tempsDebutEtat = tempsActuel;
}
}
else {
const int zoneArrosage = &zone - zones + 1;
lcd.setCursor(0, 3);
lcd.print("Arrosage Zone "); // Affiche la zone d'arrosage
lcd.print(zoneArrosage); // affiche numéro de zone
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Actif Repos "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie Serial.println("Actif Repos");
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 en déplaçant le curseur en fonction du N° de la zone
if (tempsActuel - zone.tempsDebutFerme >= delaiTempsFermElectrovanne){
digitalWrite(brocheElectrovanneFerm, HIGH);}
// 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) & (digitalRead(zone.broche) == HIGH)) {
if (tempsActuel - zone.tempsDebutEtat >= 2000) {
const int zoneSerie = &zone - zones + 1; // ligne essai monteur serie
Serial.print("Stop Repos "); // affiche l'état de la zone.etat sur moniteur serie
Serial.println(zoneSerie); // affiche le N° de la zone sur moniteur serie Serial.println("Stop Repos");
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;
}
// } // if commande = high
} // for
}
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);
}
