Alterne Modos com um Botão
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 11 de 18.
Muitos dispositivos têm um botão que percorre os modos: uma luz de bicicleta apaga, acende, pisca, pisca rapidamente e depois apaga de novo. Isso é uma máquina de estados em que é um pressionamento, e não o relógio, que avança para o próximo estado.
Coloque a etapa em sua própria função. Um switch sobre o modo atual define o próximo, e o último modo volta ao primeiro:
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... e assim por diante, até FAST voltar para OFF
}
}O sketch chama nextMode() uma vez a cada pressionamento. O botão é tratado com debounce da maneira que você aprendeu na seção Entradas: quando a leitura muda, aja com base nela e, em seguida, aguarde 20 ms para os contatos se estabilizarem. Um segundo switch sobre mode define o LED.
Desafio
MédioO botão e o LED já estão escritos para você. Escreva nextMode() para que cada pressionamento passe para o próximo modo e imprima seu nome: OFF, ON, BLINK, FAST e, então, OFF novamente.
Pressione Run, pressione o botão algumas vezes e, então, Check.
Experimente você mesmo
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);
}
// Avança para o próximo modo e imprime seu nome.
void nextMode() {
// um case por modo: defina o próximo modo, imprima seu nome, break
}
// Alterna o estado do LED a cada 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. um pressionamento (com debounce) chama nextMode()
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // deixe os contatos se estabilizarem
}
// 2. o modo determina o que o LED faz
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Temporização sem delay
Pratique por conta própria: Playground de Arduino