Menu
CoddyTech

Alternar a cada pressionamento

Parte da seção Entradas do Journey de Arduino da Coddy. Lição 4 de 22.

Até agora, o LED copiava o botão: aceso enquanto pressionado, apagado ao soltar. Um interruptor de luz funciona de outra forma: pressione uma vez para acender, pressione novamente para apagar. Isso é um toggle.

Para alternar, o sketch precisa perceber o momento em que o botão é pressionado: está pressionado agora, mas não estava na última vez que loop() foi executado. Esse momento é chamado de flanco. Mantenha a última leitura em uma variável acima de setup(), como um contador:

int lastReading = HIGH;

void loop() {
  int reading = digitalRead(2);
  if (reading == LOW && lastReading == HIGH) {
    // o botão foi pressionado
  }
  lastReading = reading;
}

Manter o botão pressionado mantém a leitura em LOW, então o flanco acontece uma vez a cada pressionamento, por mais tempo que você o mantenha pressionado.

Para inverter um bool, use !, que significa "não": ledOn = !ledOn; transforma true em false e vice-versa.

challenge icon

Desafio

Médio

O botão está no pino 2 (INPUT_PULLUP) e o LED no pino 13. Faça com que cada pressionamento alterne o LED:

  • quando o botão for pressionado (LOW agora, HIGH na última leitura), alterne ledOn
  • salve a leitura em lastReading no final de loop()
  • ligue ou desligue o LED para corresponder a ledOn

Pressione Run, pressione o botão algumas vezes e, em seguida, Check.

Experimente você mesmo

const int buttonPin = 2;
const int ledPin = 13;

bool ledOn = false;
int lastReading = HIGH;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int reading = digitalRead(buttonPin);
  // inverta ledOn quando o botão for pressionado
  // guarde esta leitura para a próxima vez
  // ligue ou desligue o LED para corresponder a ledOn
}
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 Entradas

Pratique por conta própria: Playground de Arduino