Un test ne va pas ralentir votre code de manière perceptible à l’échelle d’un click bouton... allez y tranquille et virez le goto...
—> c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)
Un enum
est toujours sympa pour définir des petits noms
enum : uint8_t {MODE_NORMAL, ATTENTE_VALIDE_PARAM, MODE_PARAM, ATTENTE_VALIDE_NORMAL} etat;
Dans le setup() vous rajoutez alors unetat=MODE_NORMAL;
Si vous utilisez un booleen,respectez le type et mettez une valeur de vérité dedans et donnez leur un nom parlant
boolean appuiBouton1 = (digitalRead(pinBouton1) == LOW); // vrai si appui
boolean appuiBouton2 = (digitalRead(pinBouton2) == LOW); // vrai si appui
Les boutons rebondissent donc si vous voulez attendre que les deux soient stabilisés sans avoir à traiter les rebonds, un petit délai sera utile (15ms généralement suffisantes)
Dans la loop() vous pouvez alors tester dans quel mode vous êtes et faire ce qu’il faut en appelant une fonction pour chaque mode: unTourDeModeNormal()
et unTourDeModeParam()
en non bloquant.
Vous aurez sans doute besoin de la même technique de mémorisation d’un l’état au sein de ces fonctions pour gérer l’appui et relâchement d’un bouton sans être bloquant donc un petit enum de plus pour l’état des boutons individuellement serait pas mal
enum : uint8_t {REPOS, APPUI} etatPrecedentBouton1, etatPrecedentBouton2 ;
ça donnerait un truc du genre:
enum : uint8_t {MODE_NORMAL, ATTENTE_VALIDE_PARAM, MODE_PARAM, ATTENTE_VALIDE_NORMAL} etat;
enum : uint8_t {REPOS, APPUI} etatPrecedentBouton1, etatPrecedentBouton2 ;
const uint8_t pinBouton1 = 8;
const uint8_t pinBouton2 = 9;
boolean appuiBouton1;
boolean appuiBouton2;
long compteur;
void setup()
{
//définition des modes
pinMode(pinBouton1, INPUT_PULLUP);
pinMode(pinBouton2, INPUT_PULLUP);
Serial.begin(115200);
compteur = 0;
etat=MODE_NORMAL;
}
void unTourDeModeNormal()
{
// on sait que cette fonction n’est appelée que si les 2 boutons ne sont pas enfoncés en même temps
if (appuiBouton1) {
...
} else
if (appuiBouton2) {
...
}
else {
...
}
}
void unTourDeModeParam()
{
// on sait que cette fonction n’est appelée que si les 2 boutons ne sont pas enfoncés en même temps
if (appuiBouton1) {
...
} else
if (appuiBouton2) {
...
}
else {
...
}
}
void loop()
{
appuiBouton1 = (digitalRead(pinBouton1) == LOW); // vrai si appui
appuiBouton2 = (digitalRead(pinBouton2) == LOW); // vrai si appui
switch(etat) {
case MODE_NORMAL:
if (appuiBouton1 && appuiBouton2) { // est-ce qu’on passe en mode param
etat = ATTENTE_VALIDE_PARAM;
delay(15); // anti rebond
} else {
// sinon traiter le mode normal
unTourDeModeNormal(); // à écrire en non bloquant
}
break;
case ATTENTE_VALIDE_PARAM: // on attend juste la relâche des 2 boutons pour confirmer le passage en mode param
if (!appuiBouton1 && !appuiBouton2) { // on passe en mode param
etat = MODE_PARAM;
delay(15); // anti rebond
etatPrecedentBouton1 = REPOS;
etatPrecedentBouton2 = REPOS;
}
break;
case MODE_PARAM:
if (appuiBouton1 && appuiBouton2) { // est-ce qu’on sort de ce mode ?
etat = ATTENTE_VALIDE_NORMAL;
delay(15); // anti rebond
} else {
// on traite un tour de mode param
unTourDeModeParam(); // à écrire en non bloquant
}
break;
case ATTENTE_VALIDE_NORMAL: // on attend la relâche des 2 boutons
if (!appuiBouton1 && !appuiBouton2) { // on passe en mode normal
etat = MODE_NORMAL;
delay(15); // anti rebond
etatPrecedentBouton1 = REPOS;
etatPrecedentBouton2 = REPOS;
}
break;
}
}
—> vous voyez que c’est un peu laborieux cependant car il vous faudra sans doute imbriquer une machine à état au sein d’une autre (et mettre à jour etatPrecedentBouton1 et etatPrecedentBouton2) et bien traiter tous les cas mais en séparant les modes ça aide à penser plus clairement
(Nb: tout tapé ici donc il se peut qu’il y ait des fautes)