#include <stdio.h>
#include "pico/stdlib.h"
// LEDs dos CARROS
#define CARRO_VERDE 2
#define CARRO_AMARELO 3
#define CARRO_VERMELHO 6
// LEDs do PEDESTRE
#define PED_VERDE 5
#define PED_VERMELHO 4
// Botão do pedestre
#define BOTAO 28
void piscar_led(uint pin, int vezes, int tempo_ms) {
for (int i = 0; i < vezes; i++) {
gpio_put(pin, 1);
sleep_ms(tempo_ms);
gpio_put(pin, 0);
sleep_ms(tempo_ms);
}
}
int main() {
stdio_init_all();
// Inicialização dos LEDs
gpio_init(CARRO_VERDE); gpio_set_dir(CARRO_VERDE, GPIO_OUT);
gpio_init(CARRO_AMARELO); gpio_set_dir(CARRO_AMARELO, GPIO_OUT);
gpio_init(CARRO_VERMELHO); gpio_set_dir(CARRO_VERMELHO, GPIO_OUT);
gpio_init(PED_VERDE); gpio_set_dir(PED_VERDE, GPIO_OUT);
gpio_init(PED_VERMELHO); gpio_set_dir(PED_VERMELHO, GPIO_OUT);
// Inicialização do botão
gpio_init(BOTAO);
gpio_set_dir(BOTAO, GPIO_IN);
gpio_pull_up(BOTAO); // pressionado = 0
// Estado inicial
gpio_put(PED_VERMELHO, 1);
gpio_put(PED_VERDE, 0);
while (1) {
// --------- CARROS VERDE ---------
gpio_put(CARRO_VERDE, 1);
gpio_put(CARRO_AMARELO, 0);
gpio_put(CARRO_VERMELHO, 0);
// Se botão for pressionado → interrompe ciclo e vai para travessia
for (int i = 0; i < 30; i++) {
if (!gpio_get(BOTAO)) goto travessia;
sleep_ms(100);
}
// --------- CARROS AMARELO ---------
gpio_put(CARRO_VERDE, 0);
gpio_put(CARRO_AMARELO, 1);
for (int i = 0; i < 10; i++) {
if (!gpio_get(BOTAO)) goto travessia;
sleep_ms(100);
}
// --------- CARROS VERMELHO ---------
gpio_put(CARRO_AMARELO, 0);
gpio_put(CARRO_VERMELHO, 1);
sleep_ms(1000);
continue;
// --------- TRAVESSIA DO PEDESTRE ---------
travessia:
gpio_put(CARRO_VERDE, 0);
gpio_put(CARRO_AMARELO, 0);
gpio_put(CARRO_VERMELHO, 1);
gpio_put(PED_VERMELHO, 0);
gpio_put(PED_VERDE, 1);
sleep_ms(4000);
piscar_led(PED_VERDE, 3, 300);
gpio_put(PED_VERDE, 0);
gpio_put(PED_VERMELHO, 1);
sleep_ms(1000); // antes de voltar ao ciclo
}
}