1
Discussion Générale d'Électronique / Re : Programmation condition Arduino
« le: Février 13, 2023, 09:09:02 pm »
Si, comme papyblue, je connectais mes boutons à la masse et utilisais les PullUp internes, mon code deviendrait :
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...)
Code: [Sélectionner]
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...)