#include <stdio.h>
#include "pico/stdlib.h"
#define led_verm 15
#define led_amar 14
#define led_verd 13
#define btn 12
void f_interrupt();
bool timer_0_callback(repeating_timer_t *rt);
volatile bool pedestre = false; // <-- sinal da interrupção
int main() {
stdio_init_all();
gpio_init(led_verm);
gpio_set_dir(led_verm, GPIO_OUT);
gpio_init(led_amar);
gpio_set_dir(led_amar, GPIO_OUT);
gpio_init(led_verd);
gpio_set_dir(led_verd, GPIO_OUT);
gpio_init(btn);
gpio_set_dir(btn, GPIO_IN);
gpio_pull_up(btn);
gpio_set_irq_enabled_with_callback(btn, GPIO_IRQ_EDGE_FALL, true, f_interrupt);
repeating_timer_t timer;
add_repeating_timer_ms(1000, timer_0_callback, NULL, &timer);
while (true) { tight_loop_contents(); }
}
bool timer_0_callback(repeating_timer_t *rt) {
static int t = 0;
if (pedestre) { // ------ PRIORIDADE AO PEDESTRE ------
gpio_put(led_verd, 0);
gpio_put(led_amar, 1); // força amarelo por 5s
gpio_put(led_verm, 0);
static int tp = 0;
tp++;
if (tp >= 5) { // 10 segundos de travessia
gpio_put(led_verd, 0);
gpio_put(led_amar, 0);
gpio_put(led_verm, 1);
}
if (tp > 15) {
pedestre = false;
tp = 0;
t = 0;
}
return true; // não continua o código normal
}
t++; // ------ CICLO NORMAL DO SEMÁFORO ------
if (t <= 10) {
gpio_put(led_verd, 1); // Verde 10s
gpio_put(led_amar, 0);
gpio_put(led_verm, 0);
return true;
}
if (t > 10 && t <= 15) {
gpio_put(led_verd, 0);
gpio_put(led_amar, 1); // Amarelo 5s
gpio_put(led_verm, 0);
return true;
}
if (t > 15 && t <= 25) {
gpio_put(led_verd, 0);
gpio_put(led_amar, 0);
gpio_put(led_verm, 1); // Vermelho 10s
return true;
}
if (t > 25)
t = 0;
return true;
}
void f_interrupt() {
pedestre = true; // sinaliza pedido de travessia
}