#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#define BUZZER_FREQUENCY 100
#define BUZZER_PIN 21
#define LED_VERDE_PIN 1
#define LED_AMARELO_PIN 2
#define LED_VERMELHO_PIN 3
#define LED_VERDE_PEDESTRE_PIN 4
#define BOTAO_PIN 5
void init_pwm(uint pin) {
gpio_set_function(pin, GPIO_FUNC_PWM); // Configura o pino para PWM
uint slice_num = pwm_gpio_to_slice_num(pin); // Obtém o número do slice de PWM
pwm_config config = pwm_get_default_config(); // Configurações padrão de PWM
pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (BUZZER_FREQUENCY * 4096)); // Divisor de clock para ajustar a frequência
pwm_init(slice_num, &config, true); // Inicializa o PWM com as configurações
}
void acionar_buzzer_intermitente(uint tempo_buzzer_tocando) {
uint tempo_total = tempo_buzzer_tocando; // Tempo total que o buzzer deve tocar
while (tempo_total > 0) {
pwm_set_gpio_level(BUZZER_PIN, 32768); // Liga o buzzer (~50% duty cycle)
sleep_ms(500); // Buzzer ligado por 500ms
pwm_set_gpio_level(BUZZER_PIN, 0); // Desliga o buzzer
sleep_ms(500); // Buzzer desligado por 500ms
tempo_total -= 1000; // Diminui 1000ms (500ms ligado + 500ms desligado)
}
}
void acionar_semaforo_pedestre() {
// Ação do semáforo de pedestre
gpio_put(LED_VERDE_PIN, 0); // Desliga o semáforo de veículos
gpio_put(LED_VERMELHO_PIN, 0);
gpio_put(LED_AMARELO_PIN, 1); // Liga o LED amarelo para sinalizar a mudança
sleep_ms(5000); // Fica 5 segundos no amarelo
gpio_put(LED_AMARELO_PIN, 0); // Desliga o LED amarelo
gpio_put(LED_VERMELHO_PIN, 1); // Acende o LED vermelho para os veículos
gpio_put(LED_VERDE_PEDESTRE_PIN, 1); // Acende o semáforo verde para pedestre
acionar_buzzer_intermitente(15000); // Toca o buzzer intermitente durante 15 segundos
gpio_put(LED_VERDE_PEDESTRE_PIN, 0); // Desliga o semáforo verde do pedestre
// Após o tempo de travessia, desliga todos os LEDs de pedestre
gpio_put(LED_AMARELO_PIN, 0);
gpio_put(LED_VERDE_PIN, 0);
gpio_put(LED_VERMELHO_PIN, 0);
}
int main() {
// Inicialização dos pinos
gpio_init(BOTAO_PIN);
gpio_set_dir(BOTAO_PIN, GPIO_IN);
gpio_pull_up(BOTAO_PIN); // Usa pull-up para o botão
gpio_init(BUZZER_PIN);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
init_pwm(BUZZER_PIN);
gpio_init(LED_VERDE_PIN);
gpio_set_dir(LED_VERDE_PIN, GPIO_OUT);
gpio_init(LED_AMARELO_PIN);
gpio_set_dir(LED_AMARELO_PIN, GPIO_OUT);
gpio_init(LED_VERMELHO_PIN);
gpio_set_dir(LED_VERMELHO_PIN, GPIO_OUT);
gpio_init(LED_VERDE_PEDESTRE_PIN);
gpio_set_dir(LED_VERDE_PEDESTRE_PIN, GPIO_OUT);
gpio_put(LED_VERMELHO_PIN, 0); // Desliga o LED vermelho
gpio_put(LED_VERDE_PIN, 1); // Liga o LED verde para veículos
for (int i = 0; i < 50; i++) { // Espera 5 segundos (simula o tempo do semáforo verde para veículos)
if (gpio_get(BOTAO_PIN) == 0) { // Verifica se o botão foi pressionado
acionar_semaforo_pedestre(); // Aciona o semáforo de pedestre
break; // Retorna ao ciclo de semáforo após o pedestre
}
sleep_ms(100);
}
gpio_put(LED_VERDE_PIN, 0); // Desliga o LED verde
gpio_put(LED_AMARELO_PIN, 1); // Liga o LED amarelo para veículos
for (int i = 0; i < 50; i++) { // Espera 5 segundos (simula o tempo do semáforo amarelo)
if (gpio_get(BOTAO_PIN) == 0) { // Verifica se o botão foi pressionado
acionar_semaforo_pedestre(); // Aciona o semáforo de pedestre
break; // Retorna ao ciclo de semáforo após o pedestre
}
sleep_ms(100);
}
gpio_put(LED_AMARELO_PIN, 0); // Desliga o LED amarelo
gpio_put(LED_VERMELHO_PIN, 1); // Liga o LED vermelho para veículos
for (int i = 0; i < 50; i++) { // Espera 5 segundos (simula o tempo do semáforo vermelho)
if (gpio_get(BOTAO_PIN) == 0) { // Verifica se o botão foi pressionado
acionar_semaforo_pedestre(); // Aciona o semáforo de pedestre
break; // Retorna ao ciclo de semáforo após o pedestre
}
sleep_ms(100);
}
return 0;
}
Loading
pi-pico-w
pi-pico-w