v#include <TM1637Display.h>
/* Display TM1637 */
#define CLK A4
#define DIO A5
TM1637Display display(CLK, DIO);
/* LEDs Pedestres */
#define Verde_Pedestre 9
#define Vermelho_Pedestre 10
/* LEDs Carros */
#define Verde_Carro 11
#define Amarelo_Carro 12
#define Vermelho_Carro 13
/* Botão */
#define BOTAO 2
/* Buzzer */
#define BUZZER 8
int contador;
void setup() {
/* Display */
display.setBrightness(7);
/* Teste dos segmentos */
display.showNumberDec(8888);
delay(2000);
/* Estado inicial */
display.showNumberDec(0, true);
/* Configuração dos pinos */
pinMode(Verde_Pedestre, OUTPUT);
pinMode(Vermelho_Pedestre, OUTPUT);
pinMode(Verde_Carro, OUTPUT);
pinMode(Amarelo_Carro, OUTPUT);
pinMode(Vermelho_Carro, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
estadoNormal();
}
void loop() {
if (digitalRead(BOTAO) == LOW) {
delay(50); // debounce
if (digitalRead(BOTAO) == LOW) {
executarTravessia();
while (digitalRead(BOTAO) == LOW) {
delay(10);
}
}
}
}
void estadoNormal() {
/* Carros liberados */
digitalWrite(Verde_Carro, HIGH);
digitalWrite(Amarelo_Carro, LOW);
digitalWrite(Vermelho_Carro, LOW);
/* Pedestres aguardam */
digitalWrite(Verde_Pedestre, LOW);
digitalWrite(Vermelho_Pedestre, HIGH);
/* Display sempre ligado */
display.showNumberDec(0, true);
noTone(BUZZER);
}
void executarTravessia() {
/* Tempo de espera após apertar botão */
delay(1000);
/* Sinal amarelo para carros */
digitalWrite(Verde_Carro, LOW);
digitalWrite(Amarelo_Carro, HIGH);
delay(3000);
/* Fecha trânsito */
digitalWrite(Amarelo_Carro, LOW);
digitalWrite(Vermelho_Carro, HIGH);
/* Libera pedestres */
digitalWrite(Vermelho_Pedestre, LOW);
digitalWrite(Verde_Pedestre, HIGH);
/* Contagem regressiva */
for (contador = 15; contador >= 0; contador--) {
display.showNumberDec(contador, true);
if (contador <= 5) {
/* Pisca LED verde do pedestre */
digitalWrite(Verde_Pedestre, !digitalRead(Verde_Pedestre));
/* Bip do buzzer */
tone(BUZZER, 1000, 300);
} else {
digitalWrite(Verde_Pedestre, HIGH);
noTone(BUZZER);
}
delay(1000);
}