#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
//Definindo os pinos GPIO
#define Sinal_Vermelho 10
#define Sinal_Amarelo 11
#define Sinal_Verde 12
#define Sinal_Pedestre 13
#define Botao 14
#define Som_Sinal 15
#define Som_Sinal_Frequencia 7000
// Configurando uma função para controlar os sinais do semaforo
void semaforo(int verde, int amarelo, int vermelho) {
gpio_put(Sinal_Verde, verde);
gpio_put(Sinal_Amarelo, amarelo);
gpio_put(Sinal_Vermelho, vermelho);
}
// configurando uma função do buzzer para usar PWM
void Iniciar_Som_PWM() {
gpio_set_function(Som_Sinal, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(Som_Sinal);
pwm_config cfg = pwm_get_default_config();
pwm_config_set_clkdiv(&cfg, clock_get_hz(clk_sys) / (Som_Sinal_Frequencia * 4096));
pwm_init(slice_num, &cfg, true);
pwm_set_gpio_level(Som_Sinal, 0);
}
// Configurando uma função para controlar o sinal e o som para o pedestre
void pedestre(int sinal, int som) {
gpio_put(Sinal_Pedestre, sinal);
pwm_set_gpio_level(Som_Sinal, som ? 4096 : 0 );
}
int main() {
gpio_init(Sinal_Verde);
gpio_init(Sinal_Amarelo);
gpio_init(Sinal_Vermelho);
gpio_init(Sinal_Pedestre);
gpio_init(Som_Sinal);
gpio_init(Botao);
gpio_set_dir(Sinal_Verde, GPIO_OUT);
gpio_set_dir(Sinal_Amarelo, GPIO_OUT);
gpio_set_dir(Sinal_Vermelho, GPIO_OUT);
gpio_set_dir(Sinal_Pedestre, GPIO_OUT);
gpio_set_dir(Som_Sinal, GPIO_OUT);
gpio_set_dir(Botao, GPIO_IN);
gpio_pull_up(Botao); // ativa o pull-up no botão
Iniciar_Som_PWM(); // inicia o buzzer com PWM
//inicia o loop
while (true) {
pedestre (0, 0);
semaforo (1, 0, 0);
//criando uma variável para reiniciar o loop caso o pedestre aperte
bool pedestre_apertou = false;
//configura um contador para verificar se o botão for pressionado durante o tempo ativo.
for (int temporizador_botao = 0; temporizador_botao < 80; temporizador_botao++) {
// inicia se o botão for pressionado
if (gpio_get(Botao) == 0) {
semaforo (0, 1, 0);
sleep_ms (5000);
semaforo (0, 0, 1);
//contador para criar um som intermitente, ativando e desativando o buzzer
for (int temporizador_pedestre = 0; temporizador_pedestre < 15; temporizador_pedestre++) {
pedestre(1, 1);
sleep_ms(500);
pedestre(1, 0);
sleep_ms(500);
}
pedestre_apertou = true;
break;
}
sleep_ms(100);
}
//se o pedestre apertou, então reiniciará o loop
if (pedestre_apertou) {
continue;
}
//se o pedestre não apertou, então dará continuidade normalmente.
else {
semaforo (0, 1, 0);
sleep_ms (2000);
semaforo (0, 0, 1);
pedestre (1, 0);
sleep_ms(10000);
}
}
return 0;
}