// Variáveis do semáforo para veículos
int cverde = 8; // verde
int camare = 9; // amarelo
int cverme = 10; // vermelho
// Variáveis do semáforo para pedestres
int pverde = 6; // verde pedestre
int pverme = 7; // vermelho pedestre
// Variáveis de tempo dos semáforos
int tlongo = 90000; // tempo longo para verde e vermelho dos carros (90 segundos)
int tcurto = 6000; // tempo curto para amarelo dos carros (6 segundos)
int tpedverde = 20000; // tempo verde para pedestres (20 segundos)
int tpedvermelho = 35000; // tempo vermelho para pedestres (35 segundos)
int espera = 5; // número de piscadas para aviso ao pedestre
int x; // variável para contador
// Aviso sonoro
int apito = 5; // pino do buzzer
// Botão de pedestres
int btnPedestres = 2; // pino do botão de pedestres
bool botaoPressionado = false;
void setup() {
// pinos de saída do semáforo de veículos
pinMode(cverde, OUTPUT);
pinMode(camare, OUTPUT);
pinMode(cverme, OUTPUT);
// pinos de saída do semáforo de pedestres
pinMode(pverde, OUTPUT);
pinMode(pverme, OUTPUT);
// pinos de saída do apito
pinMode(apito, OUTPUT);
// pino do botão de pedestres como entrada
pinMode(btnPedestres, INPUT);
}
void loop() {
// Verifica se o botão de pedestres foi pressionado
if (digitalRead(btnPedestres) == HIGH && !botaoPressionado) {
botaoPressionado = true;
delay(20); // debounce
// Ativa a solicitação de passagem dos pedestres
// Tempo restante para o semáforo dos carros mudar para amarelo
int tempoRestante = tlongo - millis() % tlongo;
if (tempoRestante > 20000) { // Se faltar mais de 20 segundos
delay(tempoRestante - 20000); // Aguarda até faltar 20 segundos para o próximo ciclo
// Muda para o estado de solicitação de passagem dos pedestres
digitalWrite(cverde, LOW);
digitalWrite(camare, HIGH);
digitalWrite(pverde, HIGH);
digitalWrite(pverme, LOW);
delay(tcurto); // Tempo do amarelo dos carros
digitalWrite(camare, LOW);
digitalWrite(cverme, HIGH);
delay(tcurto); // Tempo entre o amarelo e o vermelho dos carros
// Ativa o sinal sonoro para pedestres
for (int i = 0; i < 4; i++) {
tone(apito, 329);
delay(1000);
noTone(apito);
delay(1500);
}
}
} else if (digitalRead(btnPedestres) == LOW) {
botaoPressionado = false;
}
// Semáforo de veículos operando normalmente
digitalWrite(pverme, LOW);
digitalWrite(pverde, HIGH);
digitalWrite(cverme, HIGH);
delay(tlongo);
// Semáforo de carros mudando para amarelo e vermelho
digitalWrite(cverme, LOW);
digitalWrite(pverme, HIGH);
digitalWrite(cverde, HIGH);
delay(tlongo);
digitalWrite(cverde, LOW);
digitalWrite(camare, HIGH);
delay(tcurto);
digitalWrite(camare, LOW);
}