Menu
CoddyTech

Piscar sem atraso

Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 3 de 18.

delay() para todo o sketch. Enquanto uma piscada aguarda 500 ms, nada mais em loop() é executado: um botão pressionado nesse intervalo não é detectado até que a espera termine.

A solução é nunca esperar. Deixe loop() ser executado repetidamente, muito rápido, e compare o relógio com o momento em que o LED mudou pela última vez. Até que tenham passado 500 ms, não faça nada. Então, mude o LED e armazene o novo momento:

const unsigned long interval = 500;
unsigned long previousMillis = 0;   // quando o LED mudou pela última vez

void loop() {
  unsigned long now = millis();
  if (now - previousMillis >= interval) {
    previousMillis = now;           // guarde este momento
    // altere o estado do LED aqui
  }
  // qualquer outra coisa aqui é executada milhares de vezes por segundo
}

now - previousMillis é o tempo desde a última mudança. Para mudar o LED, mantenha seu estado em uma variável, int redState = LOW;, alterne-o com if/else e escreva o estado com digitalWrite(redLed, redState);.

Se você esquecer de atualizar previousMillis, a condição continuará verdadeira após os primeiros 500 ms, então o LED mudará a cada execução do loop e parecerá meio aceso.

challenge icon

Desafio

Médio

O LED amarelo deve acompanhar o botão, mas reage com atraso porque as chamadas de delay() do LED vermelho interrompem o loop. Reescreva o piscar do LED vermelho usando millis():

  • mantenha a parte do botão como está
  • a cada 500 ms, ligue e desligue o LED vermelho no pino 13
  • não use delay() em lugar algum

Pressione Run, mantenha o botão pressionado e observe os dois LEDs; em seguida, pressione Check.

Experimente você mesmo

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

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

void loop() {
  // O LED amarelo acompanha o botão. Mantenha esta parte.
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(yellowLed, HIGH);
  } else {
    digitalWrite(yellowLed, LOW);
  }

  // O LED vermelho pisca, mas cada delay() interrompe a execução das linhas acima
  // por meio segundo. Reescreva esta parte com millis().
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
}
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