#include <stdio.h>

// Definição dos pinos GPIO que serão usados no semáforo
#define SINAL_VERMELHO 2     // Pino para o LED vermelho
#define SINAL_AMARELO 3      // Pino para o LED amarelo
#define SINAL_VERDE 4        // Pino para o LED verde
#define SINAL_PEDESTRE 5     // Pino para o LED do pedestre
#define BOTAO 7              // Pino para o botão de pedestres
#define SOM_SINAL 6          // Pino para o buzzer

// Função para controlar os sinais do semáforo (LEDs)
void semaforo(int verde, int amarelo, int vermelho) {
    digitalWrite(SINAL_VERDE, verde);
    digitalWrite(SINAL_AMARELO, amarelo);
    digitalWrite(SINAL_VERMELHO, vermelho);
}

// Função para controlar o LED do pedestre e o som do buzzer
void pedestre(int sinal, int som) {
    digitalWrite(SINAL_PEDESTRE, sinal);
    analogWrite(SOM_SINAL, som ? 128 : 0);
}

// Configuração inicial do sistema
void setup() {
    pinMode(SINAL_VERDE, OUTPUT);
    pinMode(SINAL_AMARELO, OUTPUT);
    pinMode(SINAL_VERMELHO, OUTPUT);
    pinMode(SINAL_PEDESTRE, OUTPUT);
    pinMode(SOM_SINAL, OUTPUT);
    pinMode(BOTAO, INPUT_PULLUP); // Resistor pull-up interno
}

// Função para executar a sequência do pedestre
void sequenciaPedestre() {
    // Muda o semáforo para amarelo
    semaforo(0, 1, 0); // Liga o amarelo
    delay(5000);       // Aguarda 5 segundos

    // Muda o semáforo para vermelho e ativa o buzzer e LED do pedestre
    semaforo(0, 0, 1); // Liga o vermelho
    for (int i = 0; i < 15; i++) { // 15 ciclos de 1 segundo
        pedestre(1, 1);  // Ativa o LED do pedestre e o buzzer
        delay(500);
        pedestre(1, 0);  // Mantém o LED do pedestre ligado, desativa o buzzer
        delay(500);
    }

    // Desativa o LED do pedestre e o buzzer
    pedestre(0, 0);
    semaforo(1, 0, 0); // Liga o verde
}

// Função para adicionar mais 15 segundos ao LED vermelho com o buzzer e o LED do pedestre
void adicionarTempoVermelho() {
    for (int i = 0; i < 15; i++) { // 15 ciclos de 1 segundo
        pedestre(1, 1);  // Ativa o LED do pedestre e o buzzer
        delay(500);
        pedestre(1, 0);  // Mantém o LED do pedestre ligado, desativa o buzzer
        delay(500);
    }
    pedestre(0, 0); // Desativa o LED do pedestre e o buzzer
}

// Loop principal do programa
void loop() {
    // Estado inicial do semáforo
    semaforo(1, 0, 0); // Liga o verde
    for (int i = 0; i < 8000; i += 100) { // Aguarda 8 segundos (em incrementos de 100 ms)
        if (digitalRead(BOTAO) == LOW) {  // Verifica se o botão foi pressionado
            sequenciaPedestre();         // Interrompe e inicia o ciclo do pedestre
            return;                      // Sai do loop para reiniciar o ciclo
        }
        delay(100); // Pequeno atraso para verificar o botão constantemente
    }

    // Liga o amarelo
    semaforo(0, 1, 0); // Liga o amarelo
    for (int i = 0; i < 2000; i += 100) { // Aguarda 2 segundos
        if (digitalRead(BOTAO) == LOW) {
            sequenciaPedestre();         // Interrompe e inicia o ciclo do pedestre
            return;
        }
        delay(100);
    }

    // Liga o vermelho
    semaforo(0, 0, 1); // Liga o vermelho
    for (int i = 0; i < 10000; i += 100) { // Aguarda 10 segundos
        if (digitalRead(BOTAO) == LOW) {  // Verifica se o botão foi pressionado
            adicionarTempoVermelho();    // Adiciona mais 15 segundos ao LED vermelho e buzzer com o LED do pedestre
            return;                      // Volta ao ciclo normal
        }
        delay(100);
    }
}
$abcdeabcde151015202530fghijfghij
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT