#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;
}
$abcdeabcde151015202530fghijfghij