#include "pico/stdlib.h"
#include <stdio.h>
#define LED_VERDE_CARROS 9
#define LED_AMARELO 5
#define LED_VERMELHO 1
#define LED_VERDE_PEDESTRES 28
#define BUZZER 17
#define BOTAO 21
void inicializar_gpio() {
gpio_init(LED_VERDE_CARROS);
gpio_init(LED_AMARELO);
gpio_init(LED_VERMELHO);
gpio_init(LED_VERDE_PEDESTRES);
gpio_init(BUZZER);
gpio_init(BOTAO);
gpio_set_dir(LED_VERDE_CARROS, GPIO_OUT);
gpio_set_dir(LED_AMARELO, GPIO_OUT);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);
gpio_set_dir(LED_VERDE_PEDESTRES, GPIO_OUT);
gpio_set_dir(BUZZER, GPIO_OUT);
gpio_set_dir(BOTAO, GPIO_IN);
gpio_pull_up(BOTAO); // Ativar pull-up interno no botão
}
void acender_led(uint led_pin) {
gpio_put(led_pin, 1);
}
void apagar_led(uint led_pin) {
gpio_put(led_pin, 0);
}
void buzzer_intermitente(uint tempo_ms) {
for (uint i = 0; i < tempo_ms / 200; i++) {
gpio_put(BUZZER, 1);
sleep_ms(100);
gpio_put(BUZZER, 0);
sleep_ms(100);
}
}
// Função para aguardar com verificação do botão
void esperar_com_verificacao(uint tempo_total_ms) {
for (uint t = 0; t < tempo_total_ms; t += 100) {
if (!gpio_get(BOTAO)) { // Se o botão for pressionado
return;
}
sleep_ms(100);
}
}
void ciclo_semaforo_carros() {
acender_led(LED_VERDE_CARROS);
apagar_led(LED_AMARELO);
apagar_led(LED_VERMELHO);
esperar_com_verificacao(8000);
apagar_led(LED_VERDE_CARROS);
acender_led(LED_AMARELO);
esperar_com_verificacao(2000);
apagar_led(LED_AMARELO);
acender_led(LED_VERMELHO);
esperar_com_verificacao(10000);
}
void travessia_pedestres() {
// Fase 1: Aciona o LED amarelo por 5 segundos
acender_led(LED_AMARELO);
apagar_led(LED_VERDE_CARROS);
apagar_led(LED_VERMELHO);
sleep_ms(5000);
// Fase 2: Aciona o LED vermelho para os carros e o LED verde para pedestres por 15 segundos
apagar_led(LED_AMARELO);
acender_led(LED_VERMELHO);
acender_led(LED_VERDE_PEDESTRES);
buzzer_intermitente(15000); // Ativa o buzzer intermitente durante esse período
// Fase 3: Volta ao ciclo normal, apagando o verde de pedestres
apagar_led(LED_VERDE_PEDESTRES);
apagar_led(LED_VERMELHO);
}
int main() {
inicializar_gpio();
while (true) {
if (!gpio_get(BOTAO)) { // Verifica se o botão foi pressionado
printf("Botão pressionado\n");
travessia_pedestres();
} else {
ciclo_semaforo_carros();
}
}
return 0;
}