Botão de travessia
Parte da seção Projetos do Journey de Arduino da Coddy. Lição 3 de 24.
As pessoas a pé precisam de uma forma de pedir passagem. O botão azul no pino 2 é o botão de travessia: pressioná-lo durante o verde encerra o verde imediatamente, então os carros recebem o amarelo e, depois, o vermelho.
Como as luzes funcionam com millis(), loop() passa pelo estado verde milhares de vezes por segundo e pode ler o botão a cada vez, além do relógio. O verde termina quando qualquer uma das duas condições é verdadeira, que é o que || (ou) indica:
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// mudar para amarelo
}
break;O botão conecta o pino 2 ao terra, então configure o pino como INPUT_PULLUP: ele lê HIGH até que o botão o coloque em LOW.
Apenas o estado verde lê o botão. No amarelo e no vermelho, os carros já estão parando, e o amarelo mantém seu segundo completo para que os motoristas tenham tempo de parar.
Desafio
MédioAdicione o botão de travessia no pino 2:
- configure o pino 2 como
INPUT_PULLUP - enquanto a luz estiver verde, um toque encerra o verde imediatamente (a luz fica amarela)
- o amarelo e o vermelho mantêm seus tempos, com ou sem toque
Pressione Run, aguarde a luz verde, pressione o botão azul e, em seguida, Check.
Experimente você mesmo
// As luzes dos carros
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// O LED da própria placa: a luz de status do controlador
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // quando a luz atual acendeu
bool statusOn = false;
unsigned long lastBlink = 0;
// 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);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// A luz de status pisca a cada 500 ms, independentemente do que as luzes dos carros façam.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
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