Changer de mode avec un bouton
Fait partie de la section Gestion du temps sans delay du Journey Arduino de Coddy. Leçon 11 sur 18.
De nombreux gadgets ont un seul bouton qui fait défiler les modes : une lampe de vélo s’éteint, s’allume, clignote, clignote rapidement, puis s’éteint à nouveau. C’est une machine à états dans laquelle c’est une pression, et non l’horloge, qui fait passer à l’état suivant.
Mets l’étape dans sa propre fonction. Un switch sur le mode actuel définit le suivant, et le dernier mode revient au premier :
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... et ainsi de suite, jusqu'à ce que FAST revienne à OFF
}
}Le sketch appelle nextMode() une fois par pression. Le bouton est traité par anti-rebond comme tu l’as appris dans la section Entrées : lorsque la lecture change, agis en conséquence, puis attends 20 ms que les contacts se stabilisent. Un deuxième switch sur mode définit la LED.
Défi
MoyenLe bouton et la LED sont déjà écrits pour toi. Écris nextMode() afin que chaque pression passe au mode suivant et affiche son nom : OFF, ON, BLINK, FAST, puis de nouveau OFF.
Clique sur Run, appuie quelques fois sur le bouton, puis clique sur Check.
Essayez vous-même
const int ledPin = 13;
const int buttonPin = 2;
enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;
bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// Passe au mode suivant et affiche son nom.
void nextMode() {
// un cas par mode : définir le mode suivant, afficher son nom, break
}
// Fait basculer la LED toutes les interval ms.
void blinkEvery(unsigned long interval) {
unsigned long now = millis();
if (now - blinkPrevious >= interval) {
blinkPrevious = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
void loop() {
// 1. un appui (avec anti-rebond) appelle nextMode()
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // laisser les contacts se stabiliser
}
// 2. le mode détermine ce que fait la LED
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Gestion du temps sans delay
2Machines à états
Mémoriser le modeChoisir avec switchÉtats nommés avec enumMachine à états de feu de circulationChanger de mode avec un boutonEntraînez-vous par vous-même : Playground Arduino