Si, comme papyblue, je connectais mes boutons à la masse et utilisais les PullUp internes, mon code deviendrait :
const byte PRESSED = LOW; // Définir un nom parlant pour l'état pressé
const byte RELEASED = HIGH; // et pour l'état relâché
const byte buttonA = 2; // déclarer la broche du bouton A
const byte buttonB = 3; // déclarer la broche du bouton B
const byte led = 13; // déclarer la broche de la LED
byte buttonAState; // variable pour stocker l'état actuel du bouton A
byte buttonBState; // variable pour stocker l'état actuel du bouton B
byte lastButtonBState = 0; // variable pour stocker l'état précédent du bouton B
bool LedState = false; // mémoriser l'état de la LED
void setup()
{
pinMode(buttonA, INPUT_PULLUP); // configurer la broche du bouton A comme entrée
pinMode(buttonB, INPUT_PULLUP); // configurer la broche du bouton B comme entrée
pinMode(led, OUTPUT); // configurer la broche de la LED comme sortie
}
void loop()
{
buttonAState = digitalRead(buttonA); // lire l'état actuel du bouton A
buttonBState = digitalRead(buttonB); // lire l'état actuel du bouton B
// vérifier si le bouton B est pressé (passe de RELEASED à PRESSED) ET si le bouton A est déjà pressé
if (lastButtonBState == RELEASED && buttonBState == PRESSED && buttonAState == PRESSED)
{
// C'est ICI que tu mets ton code utile
// Moi, j'ai mis "allume ou éteins la LED"
LedState = !LedState; // inverser l'état (virtuel) de la LED
digitalWrite(led, LedState); // commuter la LED
// Fin du code utile
delay(100); // Délai de 100ms pour laisser passer les rebonds de contact
}
lastButtonBState = buttonBState; // mettre à jour l'état précédent du bouton B
}
J'ai donc défini deux nouvelles constantes,
PRESSED et
RELEASED, qui valent respectivement
LOW et
HIGH pour que mon code reste facile à lire malgré l'inversion des états logiques sur les boutons. J'ai aussi ajouté
_PULLUP sur les
pinMode() des boutons A et B. Pour le reste, rien n'a changé... à tort d'ailleurs car la déclaration-initialisation de
lastButtonBState (byte lastButtonBState = 0;) aurait dû devenir
byte lastButtonBState = RELEASED; mais ça coûte 24 octets (une fortune dans le monde du 8 bit) et je suis un radin ! Donc ma justification sera : ça permet de ne pas lancer la routine si les boutons sont appuyés à la mise sous tension
Et si j'assumais complètement, j’aurais dû écrire
byte lastButtonBState = PRESSED; Par contre, mon éditeur de texte Arduino (V1.8.19) colore (syntaxique) les mots PRESSED et RELEASE en bleu-vert comme comme s'il s'agissait de mots réservés...
Pour ceux qui ne sont pas déjà tombé dessus, voici une page qui semble intéressante :
Arduino Push Button – Complete Tutorial (mais je n'ai pas encore tout lu...)