Menu
CoddyTech

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.

challenge icon

Desafio

Médio

O 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;
  }
}
quiz iconTeste seus conhecimentos

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