Erreur dans mon code?

Bonjour à tous

Je ne suis pas un crack dans le codage mais les differents montages réalisés fonctionnent meme si mo code n’est peu etre ^pas parfait.
L’été dernier j’ai installé un petit montage pour surveiller une cuve pour qu’elle ne déborde pas.
Cet hiver j’ai voulu perfectionner mon système en y ajoutant un petit écran LCd et une serie de tests pour savoir si mes 2 sondes sont ok… :confused:
C’est peut etre pas très utile mais l’hiver faut bien s’occuper un peu… :o

Mon système est simple, une sonde ou je connecte le 5v et une autre sonde relié a la masse et a une entréé du UNO. Si pas d’humidité je lis une valeur 0 et si contact entre les 2 sondes la valeur lue passe a 1023. Si par malheur j’ai une broche qui se deconnecte, la valeur lue sera autour de 128 et je peu en déduire une sonde en défaut.
Les valeurs que j’ai mises dans mon code sont pour mon environnement après avoir fait des tests.

Voici mon code:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("POMPE ON");
  lcd.setCursor(5, 1); 
  lcd.write("Demarrage ");
  
  pinMode(A1, INPUT); //capteur bas
  pinMode(A0, INPUT); //capteur haut
  pinMode(10, OUTPUT); //sortie relais pompe
  pinMode(9, OUTPUT); //sortie relais lampe
  pinMode(8, OUTPUT); //sortie relais alarme
  digitalWrite(10, HIGH); //pompe on au démarrage arduino
 
}


void loop()
{
  Serial.print("Humidité : ");
  Serial.println(analogRead(A0));
  Serial.println(analogRead(A1));
  delay(200);

//test capteur1
  if (analogRead(A1) > 120  && analogRead(A1) < 180) {
  lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
  lcd.write("Defaut Capteur 1");
  }

 //test capteur2
  if  (analogRead(A0) > 120 && analogRead(A0) < 180) {
  lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
  lcd.write("Defaut Capteur 2");
  }

  //test si capteur 1 et 2 HS
  if  (analogRead(A1) > 320 && analogRead(A1) < 380) {
  lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
  lcd.write("Capteur1 et 2 HS");
  }
  
  //démarrage
   if   (analogRead(A0) < 500 && analogRead(A1) < 500) {
    delay(8000); //attente x secondes après descente du liquide sous les sondes
    digitalWrite(10,HIGH); //pompe on
    digitalWrite(9, LOW); //lampe off
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(9, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("Test OK");
   
  }  
//Cas 1
   if (analogRead(A0) > 500 && analogRead(A1) < 800) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE OFF"); //Affichage 1ere ligne info
    lcd.setCursor(4, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("CUVE 95%"); 
    delay(5000);
 }
 //Cas2   
    if (analogRead(A0) > 500 && analogRead(A1) > 500) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, HIGH); //alarme on
     lcd.clear();
     lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
     lcd.print("POMPE OFF"); //Affichage 1ere ligne info
     lcd.setCursor(5, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
     lcd.print("ALARME");
     delay(20000);
  }
  }

Tout fonctionne sauf le test du capteur 2, si je débranche la pinA0 (qui est normalement proche de 0), la valeur lu dans le serial passe a 138. L’ecran devrait donc m’afficher “Defaut capteur 2”.
Or il m’affiche test ok…

Sur ce coup je sèche.
J’ai peut etre un problème dans la structure de mon code, si quelqu’un pouvait me mettre sur la voie…

Bonjour jacques68,

Je ne sais pas si c’est ton problème mais je serais toi je commencerai par faire une lecture des 2 sondes en les enregistrant dans une variable style:

int capteur1;
int capteur2;

void setup ...

void loop(){
lectureCapteur ();
traitementValeur ();
}

void lectureCapteur (){
capteur1 = analogRead (A1);
capteur2 = analogRead (A0);
 
}

void traitementValeur (){
if (capteur < ...)

if ...

}

Sinon avec ton delais de 8 secondes les valeurs des capteurs ont le temps de changer entre les if.

Merci de ton aide

Au début j'ai pensé aussi enregistré la valeur de départ des 2 sondes. Mais: leur valeur n'est pas stable, si elles sont connectées la valeur varie entre 1 et 6 et si pas connecté ça varie entre 138 et142. Dans mon code j'ai augmenté la marge. De meme si les 2 sondes sont déconnecté les valeurs des 2 sondes varient entre 333 et 348;

Je peux toujours essayer d'adapter mon code avec ce que tu me propose et voir ce que cela donne. N'étant pas un grand expert ca va me prendre un peu de temps!!!

edit: Je viens de relire mon cour Arduino et je crois avoir capté ce que tu voulais me suggérer. Je vais réécrire mon code et tester. Mais suis lent!!

jacques68:
Merci de ton aide

Au début j’ai pensé aussi enregistré la valeur de départ des 2 sondes.
Mais: leur valeur n’est pas stable, si elles sont connectées la valeur varie entre 1 et 6 et si pas connecté ça varie entre 138 et142. Dans mon code j’ai augmenté la marge.
De meme si les 2 sondes sont déconnecté les valeurs des 2 sondes varient entre 333 et 348;

Je peux toujours essayer d’adapter mon code avec ce que tu me propose et voir ce que cela donne.
N’étant pas un grand expert ca va me prendre un peu de temps!!!

votre arduino est super rapide, c’est pas grave si ce n’est pas stable, mais ne faites pas des comparaisons en faisant 2 fois la lecture avec des valeurs qui seront peut-être différentes entre le premier et second test. ci dessous rien ne vous garantit que le premier Read ne vous donne pas 120 et le second 181 par exemple…

  if ([color=red]analogRead(A1) [/color]> 120  && [color=blue]analogRead(A1)[/color] < 180) {

Sinon votre problème quand vous débranchez la pinA0 c’est que la pin flotte, il n’y a rien qui l’emmène par magie à 0 ou 5V… donc la lecture que vous allez avoir dessus va dépendre des perturbations électromagnétiques environnantes… vous n’êtes pas garanti de la valeur entre 120 et 180 du tout.

et comme vous imprimez sur Serial autre chose que la valeur réellement utilisée dans le test ce que vous voyez à l’écran ne veut pas dire que c’est ce qui est utilisé dans le code.

autre problème, lire de manière trop rapprochée 2 pins analogique ne donne pas forcément une valeur correcte. Souvent donc on lit deux fois de suite pour laisser le temps au petit condensateur qui se charge dans le CAN de se stabiliser à la bonne valeur.

→ testez un truc du genre (qui ne résout pas le problème de flottement d’une pin… faudra trouver une autre méthode)

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("POMPE ON");
  lcd.setCursor(5, 1);
  lcd.write("Demarrage ");

  pinMode(A1, INPUT); //capteur bas
  pinMode(A0, INPUT); //capteur haut
  pinMode(10, OUTPUT); //sortie relais pompe
  pinMode(9, OUTPUT); //sortie relais lampe
  pinMode(8, OUTPUT); //sortie relais alarme
  digitalWrite(10, HIGH); //pompe on au démarrage arduino

}


void loop()
{
  int v0, v1;
  // on le fait deux fois car la première lecture peut être faussée par la proximité temporelle de l'autre analogRead
  v0 = analogRead(A0); // on laisse ainsi le temps au condensateur de se stabiliser
  v0 = analogRead(A0);

  // on le fait deux fois car la première lecture peut être faussée par la proximité temporelle de l'autre analogRead
  v1 = analogRead(A1); // on laisse ainsi le temps au condensateur de se stabiliser
  v1 = analogRead(A1);


  Serial.print("Humidité : ");
  Serial.println(v0);
  Serial.println(v1);
  delay(200);

  //test capteur1
  if (v1 > 120  && v1 < 180) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Defaut Capteur 1");
  }

  //test capteur2
  if  (v0 > 120 && v0 < 180) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Defaut Capteur 2");
  }

  //test si capteur 1 et 2 HS
  if  (v1 > 320 && v1 < 380) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Capteur1 et 2 HS");
  }

  //démarrage
  if   (v0 < 500 && v1 < 500) {
    delay(8000); //attente x secondes après descente du liquide sous les sondes
    digitalWrite(10, HIGH); //pompe on
    digitalWrite(9, LOW); //lampe off
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(9, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("Test OK");

  }
  //Cas 1
  if (v0 > 500 && v1 < 800) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE OFF"); //Affichage 1ere ligne info
    lcd.setCursor(4, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("CUVE 95%");
    delay(5000ul);
  }
  //Cas2
  if (v0 > 500 && v1 > 500) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, HIGH); //alarme on
    lcd.clear();
    lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE OFF"); //Affichage 1ere ligne info
    lcd.setCursor(5, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("ALARME");
    delay(20000ul);
  }
}

bonjour,

Tout fonctionne sauf le test du capteur 2, si je débranche la pinA0 (qui est normalement proche de 0), la valeur lu dans le serial passe a 138. L’ecran devrait donc m’afficher “Defaut capteur 2”.
Or il m’affiche test ok…

c’est le coup du fil en l’air qui fait interférence.

par contre je ne comprends pas ceci et le texte associé
sans doute une erreur de frappe

//test si capteur 1 et 2 HS
  if  (analogRead(A1) > 320 && analogRead(A1) < 380) {
  lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
  lcd.write("Capteur1 et 2 HS");
  }

pour savoir ou ca bug, fais des serial print des valeurs

Merci pour votre aide!!! :slight_smile:

Pour BossOfScandalz, j’ai testé ta méthode mais le résultat est pire…le test 1 et 2 ne fonctionne pas :confused:

J-M-L: dans cette ligne: if (analogRead(A1) > 120 && analogRead(A1) < 180) { j’ai donné une plage assé large , la valeur que je lis dans le sérial oscille autour de 158, pour cela qu’en mettant une plage entre 120 et 180 j’inclus la valeur réelle. Maitenant comme dit ce que je vois dans le serial n’est pas forcement la vraie valeur.

J’ai voulu mettre ces lignes de tests car fin septembre le fil d’une sonde c’est détachée, donc la pin c’est réellement retrouvée flottante.

J’ai donc testé ton code et il est parfaitement fonctionnel!!! :slight_smile: :slight_smile:

infobarquee: erreur de frappe effectivement mais ça fonctionnait quand meme :slight_smile: .

Bon je vais voir si je peux encore ajouter une led ou 2…

J’ai une petite question auquel malgré de nombreuses recherches je n’ai trouvé de réponses: peut on déporter l’écran LCd de 40 mètres?? Je sais ça fait loin… :grin:

Approchez un doigt de la ligne A0,Et vous verrez votre valeur qui ne restera pas dans votre intervalle sans doute... mais bon en première approche ça peut le faire si votre environnement est hyper stable

Pour Déporter votre LCD de 40m.... perso je prendrais dans ce cas 2 arduino et un système radio / sans fil si votre environnement s'y prête ... sinon creuser de l'interfacage I2C avec du NXP P82B96 mais c'est bcp de pb...

Bon des nouvelles.

J’ai testé le dernier code depuis une semaine et tout fonctionne!!
Maintenant je tente d’aller plus loin et de rajouter un bouton marche arret sur le relais pompe. Et la grosse galère ca ne fonctionne pas!! Grrrrr
Cela fait quelques nuits blanches que je passe dessus en modifiant le code du bouton avec toutes les astuces que je trouve ca et là.
A chaque fois cela me règle un soucis…mais en créant un autre.

Je voudrai que quand la pompe tourne dans un cycle normal je puisse à l’aide d’un bouton poussoir la couper et pouvoir la remettre en route.
Actuellement le code que j’ai reussi à faire met en arret la pompe après quelque secondes. L’appui sur le bouton relance la pompe mais elle se coupe aussitot après quelques secondes.
J’ai tenté un code qui incrémente un compteur à chaque appui sur le bouton mais sans plus de résultat.

Dans mon code actuel je comprends pas trop pourquoi le relais pompe se coupe tout seul!!!

Voici le code:

#include <LiquidCrystal.h>
#include <Bounce2.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

const int BP=12; //declaration constante de broche 
const int RELAIS=10; //declaration constante de broche 
boolean ETAT_RELAIS=LOW;
boolean ETAT_BP=HIGH;
Bounce bouton;

void setup()
{
pinMode(RELAIS, OUTPUT); //met la broche en sortie 
pinMode(BP, INPUT); //met la broche en entree 
digitalWrite(BP,LOW);

  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("POMPE ON");
  lcd.setCursor(5, 1);
  lcd.write("Demarrage ");

  pinMode(A1, INPUT); //capteur bas
  pinMode(A0, INPUT); //capteur haut
  pinMode(10, OUTPUT); //sortie relais pompe
  pinMode(9, OUTPUT); //sortie relais lampe
  pinMode(8, OUTPUT); //sortie relais alarme

}


void loop()
{
  
  int v0, v1;
  // on le fait deux fois car la première lecture peut être faussée par la proximité temporelle de l'autre analogRead
  v0 = analogRead(A0); // on laisse ainsi le temps au condensateur de se stabiliser
  v0 = analogRead(A0);

  // on le fait deux fois car la première lecture peut être faussée par la proximité temporelle de l'autre analogRead
  v1 = analogRead(A1); // on laisse ainsi le temps au condensateur de se stabiliser
  v1 = analogRead(A1);


  Serial.print("Humidité : ");
  Serial.println(v0);
  Serial.println(v1);
  delay(200);

  //test capteur1
  if (v1 > 120  && v1 < 180) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Defaut Capteur 1");
  }

  //test capteur2
  Serial.print("test capteur2");
  if  (v0 > 120 && v0 < 180) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Defaut Capteur 2");
  }

  //test si capteur 1 et 2 HS
Serial.print("test capteur 1et 2 HS");
  if  (v1 > 320 && v1 < 380) {
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(0, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.write("Capteur1 et 2 HS");
  }

  //démarrage
Serial.print("demarrage");
  if   (v0 < 500 && v1 < 500) {
    //delay(8000ul); //attente x secondes après descente du liquide sous les sondes
     // commande du relais en conséquence :
  }

if (ETAT_BP==HIGH){
    if (digitalRead(BP)==0)
    {
      delay(2);
      ETAT_RELAIS=!ETAT_RELAIS;
      ETAT_BP=LOW;

    Serial.print("bouton ON");
    digitalWrite(10, HIGH );
    digitalWrite(9, LOW); //lampe off
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(0, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE ON"); //Affichage 1ere ligne info
    lcd.setCursor(10, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("CUVE 1"); //Affichage 1ere ligne info
    lcd.setCursor(9, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("Test OK");
    delay(8000ul);

  }}
  else if(digitalRead(BP)==1){
    ETAT_BP=HIGH;
    digitalWrite(RELAIS,ETAT_RELAIS);
  Serial.print("bouton OFF");
    digitalWrite(10, LOW );
   lcd.clear();
   lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
   lcd.print("POMPE OFF"); //Affichage 1ere ligne info
  
  }
  //Cas 1
   Serial.print("cas1");
  if (v0 > 500 && v1 < 800) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, LOW); //alarme off
    lcd.clear();
    lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE OFF"); //Affichage 1ere ligne info
    lcd.setCursor(4, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("CUVE 95%");
    delay(5000ul);
  }
  
  //Cas2
   Serial.print("cas2");
  if (v0 > 500 && v1 > 500) {
    digitalWrite(10, LOW); //pompe off
    digitalWrite(9, HIGH); //lampe on
    digitalWrite(8, HIGH); //alarme on
    lcd.clear();
    lcd.setCursor(1, 0); //positinnement curseur 1ere colonne ligne 0 soit 1ere ligne
    lcd.print("POMPE OFF"); //Affichage 1ere ligne info
    lcd.setCursor(5, 1); //positionnement curseur 5ème colonne ligne 1 soit 2eme ligne
    lcd.print("ALARME");
   delay(40000ul);
  }
}

Le code pour le bouton est mi dans la partie // demarrage

Votre code devient un plat de spaghetti... il est temps de vous pencher sur une machine à état...

Vous définissez quels sont les états possibles de votre système (états stables) Vous définissez les conditions qui font passer d'un état à l'autre (une transition) Vous définissez les actions à réaliser lors d'une transition

Votre code ensuite est simplement

si état = ETAT1 si condition1 ---> transition1, état = ETATX si condition2 ---> transition2, état = ETATY ...

si état = ETAT2 si condition1 --> transition1, état = ETATX si condition3 --> transition1, état = ETATZ ...

etc

vos boutons, vos capteurs, un timeout tout cela peut faire partie des événements testés dans les conditions.

Il faut vraiment faire l'effort de documenter tous les états, événements/conditions, actions "en français" avant même de commencer à écrire une ligne de code.

ça vous intéresse d'essayer de nous proposer cela en français ?

Désolé pour le "spaghetthi".... Je vais donc me pencher sur la machine à état

jacques68:
Désolé pour le “spaghetthi”…

:slight_smile:

pas de soucis - c’est plus pour vous…

voila j'ai écrit quelques lignes de ce que je voudrai obtenir

Mon programme sert à remplir une cuve d'eau de pluie situé....dans mon grenier via une pompe récupérant les eaux de pluie d'un bassin. Cela me permet d'alimenter le reseau de la maison par gravité.
Cette cuve est équipé d'un trop plein qui redescend dans la cuve initial au cas ou.....
Donc j'ai mi en protection un voyant me disant niveau atteind cuve pleine ce ci est ma première sonde et doit me couper la pompe. Maintenant au cas ou la pompe ne se couperait pas j'ai une deuxième sonde qui me déclenche une alarme sonore.
 Mon programme donc contiendrait ceci:

   Démarrage: Etat Pompe: off On affiche pompe OFF
              Etat Lampe off
              Etat Alarme off
                   Test capteur1:si HS on affiche défaut capteur 1 
                   Test capteur2:si HS on affiche défaut capteur 2             
                   Test si les 2 capteurs sont HS en meme temps: si HS on affcihe défaut capteur1 et 2
                                 Si les 3 tests sont ok on affiche test ok

    Pompe On/Off (via bouton)

   ETAT1     Si pompe On on affiche Pompe ON
                  Test capteur1:si HS -on affiche défaut capteur 1 
                  Test capteur2:si HS -on affiche défaut capteur 2             
                  Test si les 2 capteurs sont HS en meme temps: si HS -on affcihe défaut capteur1 et 2
                                 Si les 3 tests sont ok on affiche test ok Pompe On
                 
   ETAT2          On regarde si le capteur 1 est atteind par le liquide
                          Oui -la pompe se coupe Off
                              -on active la lampe et on affiche Pompe Off Niveau 95% atteind
                          Non le programme retourne à l'ETAT1
   
   ETAT3          On regarde si le capteur 2 est atteind par le liquide
                          Oui -la pompe est Off
                              -lampe  sur On
                              -on active l'alarme pendant 15secondes et on affiche Pompe Off Alarme

   ETAT4 Passage de l'Etat 3 a l'Etat2: Alarme Off
                                        l'Etat2 se deroule     

   ETAT5 Passage de l'Etat 2 à l'Etat 1: lampe Off
                                         Attente d'un delai de 30mn avant d'activer la pompe. Affichage Pompe Off Test Ok 
                                         Après 30mn Pompe On Affichage Pompe On Test Ok         

   Reamrque: A tous moment je voudrais pouvoir agir sur la pompe, soit la couper soit la mettre en marche forcée

ce ne sont pas vraiment des états.

par exemple ETAT4 tel que vous l’expliquez est une transition entre Etat3 et Etat2.

ETAT4 Passage de l’Etat 3 a l’Etat2

les états doivent correspondre à des modes de fonctionnement de la pompe

OFF, MARCHE FORCEE, MARCHE AUTOMATIQUE, EN PANNE par exemple

ensuite décrivez comment on passe de l’ETAT OFF à MARCHE FORCEE. quelles sont les conditions qui font que l’on passe du premier état au second et actions associées, comme allumer une LED, afficher quelque chose sur l’écran LCD, envoyer un ordre un relai)

idem pour les autres

par exemple si S1 c’est sensor 1 activé, S2 pour le sensor 2, B pour le bouton, c’est sans doute un truc du genre qu’il faut prévoir

en ensuite voir pour les tests de défaut des capteurs, qui sont aussi des transitions à gérer depuis tous les états

J’ai un peu fouillé sur le net pour trouver comment faire une machine d’etat… C’est pas trop evident .
Aurais tu un lien avec un exemple ?

comment peut on faire le dessin comme vous avez fait? Logiciel spécial?

Je pense vor a peu près ce que je dois faire mais c’est comment le transcrire sous forme de schema qui me pose soucis
Merci

j'ai utilisé un soft de dessin (OmniGraffle - ça vaut $100 donc pas donné) mais un crayon et un papier ça marche bien :)

si vous regardez cette file j'ai mis un bout de code au post #1 avec une machine à 3 états - le premier code n'a pas besoin de LEDs ou quoi que ce soit, il est testable sur un arduino tout nu avec 1 fil et connecté en USB au PC/Mac

c'est une petite machine à état toute simple qui dit d'attendre un peu quand une condition apparait au lieu de faire On/Off ça peut vous montrer comment gérer le temps par exemple aussi

Bonsoir

J’ai pu enfin m’y remettre et réfléchir à tous cela. J’ai étudié la machine d’état…pas evident à faire et on trouve pas vraiment de tutos ou d’exemples.
J’ai fait sous forme d’organigramme plus compréhensible que le “charabia” que j’avais écris…

il y a des exemples fournis avec les différente librairies qui permettent d'en créer facilement.

sinon c'est assez simple aussi avec un switch case, mais il faut alors tout faire à la main, les temporisations, etc. une librairie fournit en général ces "outils"

exemple