#include <stdio.h>
// Definição dos pinos GPIO que serão usados no semáforo
#define SINAL_VERMELHO 2 // Pino para o LED vermelho
#define SINAL_AMARELO 3 // Pino para o LED amarelo
#define SINAL_VERDE 4 // Pino para o LED verde
#define SINAL_PEDESTRE 5 // Pino para o LED do pedestre
#define BOTAO 7 // Pino para o botão de pedestres
#define SOM_SINAL 6 // Pino para o buzzer
// Função para controlar os sinais do semáforo (LEDs)
void semaforo(int verde, int amarelo, int vermelho) {
digitalWrite(SINAL_VERDE, verde);
digitalWrite(SINAL_AMARELO, amarelo);
digitalWrite(SINAL_VERMELHO, vermelho);
}
// Função para controlar o LED do pedestre e o som do buzzer
void pedestre(int sinal, int som) {
digitalWrite(SINAL_PEDESTRE, sinal);
analogWrite(SOM_SINAL, som ? 128 : 0);
}
// Configuração inicial do sistema
void setup() {
pinMode(SINAL_VERDE, OUTPUT);
pinMode(SINAL_AMARELO, OUTPUT);
pinMode(SINAL_VERMELHO, OUTPUT);
pinMode(SINAL_PEDESTRE, OUTPUT);
pinMode(SOM_SINAL, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP); // Resistor pull-up interno
}
// Função para executar a sequência do pedestre
void sequenciaPedestre() {
// Muda o semáforo para amarelo
semaforo(0, 1, 0); // Liga o amarelo
delay(5000); // Aguarda 5 segundos
// Muda o semáforo para vermelho e ativa o buzzer e LED do pedestre
semaforo(0, 0, 1); // Liga o vermelho
for (int i = 0; i < 15; i++) { // 15 ciclos de 1 segundo
pedestre(1, 1); // Ativa o LED do pedestre e o buzzer
delay(500);
pedestre(1, 0); // Mantém o LED do pedestre ligado, desativa o buzzer
delay(500);
}
// Desativa o LED do pedestre e o buzzer
pedestre(0, 0);
semaforo(1, 0, 0); // Liga o verde
}
// Função para adicionar mais 15 segundos ao LED vermelho com o buzzer e o LED do pedestre
void adicionarTempoVermelho() {
for (int i = 0; i < 15; i++) { // 15 ciclos de 1 segundo
pedestre(1, 1); // Ativa o LED do pedestre e o buzzer
delay(500);
pedestre(1, 0); // Mantém o LED do pedestre ligado, desativa o buzzer
delay(500);
}
pedestre(0, 0); // Desativa o LED do pedestre e o buzzer
}
// Loop principal do programa
void loop() {
// Estado inicial do semáforo
semaforo(1, 0, 0); // Liga o verde
for (int i = 0; i < 8000; i += 100) { // Aguarda 8 segundos (em incrementos de 100 ms)
if (digitalRead(BOTAO) == LOW) { // Verifica se o botão foi pressionado
sequenciaPedestre(); // Interrompe e inicia o ciclo do pedestre
return; // Sai do loop para reiniciar o ciclo
}
delay(100); // Pequeno atraso para verificar o botão constantemente
}
// Liga o amarelo
semaforo(0, 1, 0); // Liga o amarelo
for (int i = 0; i < 2000; i += 100) { // Aguarda 2 segundos
if (digitalRead(BOTAO) == LOW) {
sequenciaPedestre(); // Interrompe e inicia o ciclo do pedestre
return;
}
delay(100);
}
// Liga o vermelho
semaforo(0, 0, 1); // Liga o vermelho
for (int i = 0; i < 10000; i += 100) { // Aguarda 10 segundos
if (digitalRead(BOTAO) == LOW) { // Verifica se o botão foi pressionado
adicionarTempoVermelho(); // Adiciona mais 15 segundos ao LED vermelho e buzzer com o LED do pedestre
return; // Volta ao ciclo normal
}
delay(100);
}
}