#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#define VERDE 2
#define AMARELO 3
#define VERMELHO 4
#define SINAL 5
#define BOTAO 7
#define BUZZER_PIN 6
#define BUZZER_FREQUENCY 100
void pwm_init_buzzer(uint pin) {
gpio_set_function(pin, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (100 * 4096));
pwm_init(slice_num, &config, true);
pwm_set_gpio_level(pin, 0);
}
void beep(uint pin, uint duration_ms) {
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_set_gpio_level(pin, 2048);
sleep_ms(duration_ms);
pwm_set_gpio_level(pin, 0);
sleep_ms(100);
}
void alternar_leds(int verde, int amarelo, int vermelho, int sinal) {
gpio_put(VERDE, verde);
gpio_put(AMARELO, amarelo);
gpio_put(VERMELHO, vermelho);
gpio_put(SINAL, sinal);
}
bool botao_pressionado() {
bool estado_botao = gpio_get(BOTAO) == 1; // Só funciona alterando o valor por algum motivo
return estado_botao;
}
int main() {
gpio_init(BOTAO);
gpio_set_dir(BOTAO, GPIO_IN);
gpio_pull_up(BOTAO);
gpio_init(VERDE);
gpio_set_dir(VERDE, GPIO_OUT);
gpio_init(AMARELO);
gpio_set_dir(AMARELO, GPIO_OUT);
gpio_init(VERMELHO);
gpio_set_dir(VERMELHO, GPIO_OUT);
gpio_init(SINAL);
gpio_set_dir(SINAL, GPIO_OUT);
gpio_init(BUZZER_PIN);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
pwm_init_buzzer(BUZZER_PIN);
while (true) {
if (botao_pressionado()) {
alternar_leds(0, 1, 0, 0);
sleep_ms(5000);
for (int i = 0; i < (15000 / 500); i++) {
alternar_leds(0, 0, 1, 1);
beep(BUZZER_PIN, 500);
sleep_ms(500);
}
alternar_leds(0, 0, 0, 0);
}
alternar_leds(1, 0, 0, 0);
sleep_ms(8000);
alternar_leds(0, 1, 0, 0);
sleep_ms(2000);
alternar_leds(0, 0, 1, 0);
sleep_ms(10000);
}
return 0;
}