Semáforo com millis()
Parte da seção Projetos do Journey de Arduino da Coddy. Lição 2 de 24.
Durante cada delay(3000), a placa não faz mais nada, então não poderia perceber o botão de travessia que a próxima etapa adiciona. A temporização passa a usar millis().
A luz é uma máquina de estados: está sempre em um estado (verde, amarelo ou vermelho) e passa para o próximo quando permanece nesse estado por tempo suficiente. Um enum nomeia os estados, uma variável guarda o estado atual e outra guarda quando ele começou:
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;O primeiro estado é verde, então acenda a luz verde em setup(). A cada passagem de loop(), um switch verifica se o estado atual durou tempo suficiente e só então avança e muda as luzes:
case GREEN:
if (millis() - lightStart >= 3000) {
light = YELLOW;
lightStart = millis();
showLight(yellowPin);
}
break;Nada fica esperando, então loop() fica livre para outras tarefas. Comprove isso com uma luz de status: faça o próprio LED da placa, pino 13, piscar a cada 500 ms.
Desafio
MédioReescreva a temporização sem delay():
- mantenha o verde por 3000 ms, o amarelo por 1000 ms e o vermelho por 3000 ms
- use um
enumpara os três estados, umswitchemillis() - acenda o verde em
setup()e chameshowLight()somente quando o estado mudar - pisque o pino 13 a cada 500 ms (500 ms ligado, 500 ms desligado), o tempo todo
Pressione Run e depois Check.
Experimente você mesmo
// As luzes dos carros
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Acenda uma luz e apague as outras duas.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
showLight(greenPin);
delay(3000);
showLight(yellowPin);
delay(1000);
showLight(redPin);
delay(3000);
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Projetos
Pratique por conta própria: Playground de Arduino