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.
Desafio
MédioO 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);
}
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