Aide code pour énigme (trop de if imbriqués)

Non non mais là ça n'a rien à voir avec l'électro et la programmation =p

Je me permets de poster autre chose ici même, car c'est toujours en lien avec mes énigmes, même si ce n'est plus celle-ci avec les vis.

J'avais mis de côté celle du post initial et j'ai parti sur une autre, la voici, je coince sur une bricole comme d'hab. Le code est très bien avancé, mais j'ai un problème de retour dans une boucle et je ne vois vraiment pas pourquoi !!!

Le principe :

Il y a 5 réservoirs d'eau.

Un tout en haut (contenance 9 unités), un au centre (contenance 5 unités) et 3 en bas, tous de contenance 10 unités max.

Le but est de mettre 4 unités 3 unités et 7 unités dans les 3 réservoirs du bas.

Un bouton pour vider le 9U dans le 5U puis 3 boutons pour vider au choix le 5U dans un des trois réservoirs en bas.

Quand le 9 est complément vide, il se rempli à nouveau au max.

Quand les réservoirs du bas dépasse leur niveau ciblé (donc 4U - 3U - 7U), ils s'autovident complètement.

Le 5U ne peut pas déborder, donc si je vide le 9U dans le 5U, il restera 4U dans le 9U.

Voilà, j'espère que c'est clair =p Maintenant voilà mon code :

int pinBouton1 = 2 ;
int pinBouton2 = 3 ;
int pinBouton3 = 4 ;
int pinBouton4 = 5 ;

int relayPin1 = 22; // 9 vers 5
int relayPin2 = 24; // vers 4
int relayPin3 = 26; // vers 3
int relayPin4 = 28; // vers 7
int relayPin5 = 30; // 4
int relayPin6 = 32; // 3
int relayPin7 = 34; // 7
int relayPin8 = 36; // Main TANK

int ventPin1 = 50 ;
int ventPin2 = 52 ;

int lastButton1State = 0;
int lastButton2State = 0;
int lastButton3State = 0;
int lastButton4State = 0;

int buttonState1 ;
int buttonState2 ;
int buttonState3 ;
int buttonState4 ;

int qtite = 100 ;
int qtiteflush = 1000 ;
int qtitefullmt = 2000 ;

int val4 = 0 ;
int val3 = 0 ;
int val7 = 0 ;
int val5 = 0 ;
int val9 = 900 ;

void setup()
{

Serial.begin(9600);

pinMode(pinBouton1,INPUT);
pinMode(pinBouton2,INPUT);
pinMode(pinBouton3,INPUT);
pinMode(pinBouton4,INPUT);

pinMode(relayPin1,OUTPUT);
pinMode(relayPin2,OUTPUT);
pinMode(relayPin3,OUTPUT);
pinMode(relayPin4,OUTPUT);
pinMode(relayPin5,OUTPUT);
pinMode(relayPin6,OUTPUT);
pinMode(relayPin7,OUTPUT);
pinMode(relayPin8,OUTPUT);

pinMode(ventPin1,OUTPUT);
pinMode(ventPin2,OUTPUT);

digitalWrite(ventPin1,HIGH);
digitalWrite(ventPin2,HIGH);

}

void loop() 
{

buttonState1 = digitalRead(pinBouton1);
buttonState2 = digitalRead(pinBouton2);
buttonState3 = digitalRead(pinBouton3);
buttonState4 = digitalRead(pinBouton4);

// -----------------------------------------Etage 1 vers 2 + Stop si plus que 5 (500) + Autofill Main TANK quand vide

if (buttonState1 != lastButton1State) {
 
    if ((buttonState1 == HIGH) && (val5 < 500))
    {

       if (val9 > 500)
       {
       qtite = 500;
       Serial.println(qtite);
       }
       else
       {
       qtite = val9;
       Serial.println(qtite);
       }
    
    digitalWrite(relayPin1,HIGH);
    Serial.println("Relai 1 ON");
    delay(qtite);
    digitalWrite(relayPin1,LOW);
    
    val5 = val5 + qtite ;
    val9 = val9 - qtite ;
    
    lastButton1State = buttonState1;
    Serial.println(val5);
    if (val9 <= 0)
    {
    Serial.println("Full tank");
    digitalWrite(relayPin1,HIGH);
    delay(qtitefullmt);
    digitalWrite(relayPin1,LOW); 
    val9 = 900 ;
    
    }
    }
    
    delay(100); //Petite attente avant vérif autoflush
   
}

// -----------------------------------------Etage 2 vers 3 + Autoflush si Faux

if (buttonState2 != lastButton2State) {
    if (buttonState2 == HIGH)
    {
     Serial.println(val5);
    digitalWrite(relayPin2,HIGH);
     Serial.println("Relai 2 ON");
    delay(val5);
    digitalWrite(relayPin2,LOW);
    val4 = val4 + val5 ;
    val5 = 0 ;
    lastButton2State = buttonState2;
    }
    delay(100); //Petite attente avant vérif autoflush
    if (val4 > 400)
    {
    Serial.println("Autoflush 4");
    digitalWrite(relayPin5,HIGH);
    delay(qtiteflush);
    digitalWrite(relayPin5,LOW); 
    val4 = 0 ;
    }
}
    
if (buttonState3 != lastButton3State) {
    if (buttonState3 == HIGH)
    {
    Serial.println(val5);
     Serial.println("Relai 3 ON");
    digitalWrite(relayPin3,HIGH);
    delay(val5);
    digitalWrite(relayPin3,LOW);
    val3 = val3 + val5 ;
    val5 = 0 ;
    lastButton3State = buttonState3;
    }
    delay(100); //Petite attente avant vérif autoflush
    if (val3 > 300)
    {
     Serial.println("Autoflush 3");
    digitalWrite(relayPin6,HIGH);
    delay(qtiteflush);
    digitalWrite(relayPin6,LOW); 
    val3 = 0 ;
    }
}

if (buttonState4 != lastButton4State) {
    if (buttonState4 == HIGH)
    {
    Serial.println(val5);
     Serial.println("Relai 4 ON");
    digitalWrite(relayPin4,HIGH);
    delay(val5);
    digitalWrite(relayPin4,LOW);
    val7 = val7 + val5 ;
    val5 = 0 ;
    lastButton4State = buttonState4;
    }
    delay(100); //Petite attente avant vérif autoflush
    if (val7 > 700)
    {
     Serial.println("Autoflush 7");
    digitalWrite(relayPin7,HIGH);
    delay(qtiteflush);
    digitalWrite(relayPin7,LOW); 
    val7 = 0 ;
    }
}

//-------------------------------------------------GAGNE

if((val4 == 400) && (val3 == 300) && (val7 == 700))
{
digitalWrite(ventPin1,LOW);
digitalWrite(ventPin2,LOW);
}

}

Tous les boutons fonctionnent correctement et font ce qu'ils sont sensé faire (vérifié avec Serial.println).

Voilà mon problème, quand j'appuie sur le premier bouton (qui envoie de 9U vers 5U), ça fonctionne :

500

Relai 1 ON

Quand j'appuie ensuite sur le 2 (qui envoie de 5U vers 4U), ça fonctionne, je transfère bien mais 5U puis j'autovide car je suis supérieur à 4U :

500

Relai 2 ON

Autoflush 4

Mon U5 est donc vide et val5 = 0
Mais quand j'appuie à nouveau sur le bouton1, je ne retourne pas dans la boucle boucle alors que je devrai !

if ((buttonState1 == HIGH) && (val5 < 500))

J'ai relu un paquet de fois mon code, mis des Serial.print partout, mais je comprends pas !!!

PS : je débute, il doit y avoir des énormités dans mon code, mais bon, ce qui compte pour moi c'est que ça fonctionne, il me reste 2 mois pour finir mon projet =p

hello

au 1er passage ton prg fait:

//memoBP1=0
//lecture BP1
//si BP1==high et memoBP1=0
//si BP1 == high et val5<500
//qtite=500
//val5=qtite=500
//memoBP1=high

puis saute au traitement de BP2
...
...

crois tu qu'au 2 ème passage, si tu appuyes sur BP1, tu remplisses les conditions des" if"

Salut et merci !

Si je ré appuie directement sur BP1 non, car val5 = 500, ça c'est normal.

Mais entre deux, j'appuie sur BP2 et du coup val5=0.

Donc si j'appuie ensuite sur BP1, j'ai bien ma condition de if validée non ?

Ou j'ai zappé un truc !!!

et celle ci est ok ?

si BP1==high et memoBP1=0

Roh non !

Mon

if (buttonState1 != lastButton1State) { n'est pas rempli car mon lastButton1State est 1

Si je push je ne rempli pas le premier, si je ne push pas, je ne rempli pas le second ...

Et il faut que je sorte mon

lastButton1State = buttonState1;

de mon if pour que ça fonctionne !

Merci beaucoup, désolé pour la faute d'inattention, mais quand on est dans son code, c'est dur de voir ce genre d'erreur je trouve =p