Dois LEDs, duas velocidades
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 4 de 18.
Com delay(), fazer dois LEDs piscarem em velocidades diferentes é um quebra-cabeça: cada espera atrasa o outro LED. Com millis(), é fácil, porque nada precisa esperar.
Dê a cada tarefa suas próprias variáveis: seu próprio horário anterior e seu próprio estado. Depois, dê a cada tarefa seu próprio if em loop(). A cada loop, cada tarefa verifica seu próprio relógio e age somente quando chega a hora:
unsigned long redPrevious = 0;
unsigned long greenPrevious = 0;
void loop() {
unsigned long now = millis();
if (now - redPrevious >= 500) {
redPrevious = now;
// alterna o estado do LED vermelho
}
if (now - greenPrevious >= 200) {
greenPrevious = now;
// alterna o estado do LED verde
}
}As duas tarefas nunca atrapalham uma à outra. Você pode adicionar uma terceira e uma quarta da mesma forma: um conjunto de variáveis e um if para cada uma.
Nunca compartilhe uma única variável de horário anterior entre duas tarefas. A tarefa mais rápida a redefine com tanta frequência que a mais lenta nunca alcança seu intervalo.
Desafio
FácilO LED vermelho no pino 13 já alterna a cada 500 ms. Faça o LED verde no pino 12 alternar a cada 200 ms ao mesmo tempo:
- adicione as variáveis
greenPreviousegreenState - adicione um segundo
ifemloop()para o LED verde
Pressione Run e observe os dois piscarem; depois, Check.
Experimente você mesmo
const int redLed = 13;
const int greenLed = 12;
unsigned long redPrevious = 0;
int redState = LOW;
// adicione aqui as duas variáveis do LED verde
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop() {
unsigned long now = millis();
// o LED vermelho muda de estado a cada 500 ms
if (now - redPrevious >= 500) {
redPrevious = now;
if (redState == LOW) {
redState = HIGH;
} else {
redState = LOW;
}
digitalWrite(redLed, redState);
}
// faça o LED verde mudar de estado a cada 200 ms aqui
}
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
1millis()
O relógio millis()Tempos em unsigned longPiscar sem atrasoDois LEDs, duas velocidadesPiscar enquanto um botão alternaUma luz com temporizadorPratique por conta própria: Playground de Arduino