#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;
}
$abcdeabcde151015202530fghijfghij
Loading
pi-pico-w