#include <stdio.h>
#include "pico/stdlib.h"
//Biblioteca usada para permitir a divisão de tarefas por núcleos.
#include "pico/multicore.h"
//Configuração dos pinos dos LED's para o semáforo.
const uint GREEN_LED_PIN_FOR_CARS = 28; // LED verde no GPIO 28
const uint YELLOW_LED_PIN = 27; // LED Amarelo no GPIO 27
const uint RED_LED_PIN = 26; // LED Vermelho no GPIO 26
//Configuração do pino do LED para pedestres.
const uint GREEN_LED_PIN_FOR_PEDESTRIANS = 22; // LED no GPIO 22
// Configuração do pino para o buzzer
const uint BUZZER_PIN = 21; // Buzzer no GPIO 21
// Configuração do pino para o botão
const uint BUTTON_PIN = 20; // Button no GPIO 20
// Lógica do semáforo (dividida para um núcleos).
void led_task_for_cars(){
gpio_init(GREEN_LED_PIN_FOR_CARS); // Inicializando o pino verde
gpio_init(YELLOW_LED_PIN); // Inicializando o pino amarelo
gpio_init(RED_LED_PIN); // Inicializando o pino vermelho
gpio_set_dir(GREEN_LED_PIN_FOR_CARS, GPIO_OUT); // Definindo direção para "saida"
gpio_set_dir(YELLOW_LED_PIN, GPIO_OUT); // Definindo direção para "saida"
gpio_set_dir(RED_LED_PIN, GPIO_OUT); // Definindo direção para "saida"
// Loop relacionado a forma como o semaforo vai agir sem o pressionar do botão
while (true) {
gpio_put(RED_LED_PIN, 0);
gpio_put(GREEN_LED_PIN_FOR_CARS, 1);
sleep_ms(8000);
gpio_put(GREEN_LED_PIN_FOR_CARS, 0);
gpio_put(YELLOW_LED_PIN, 1);
sleep_ms(2000);
gpio_put(YELLOW_LED_PIN, 0);
gpio_put(RED_LED_PIN, 1);
sleep_ms(10000);
}
}
// Lógica para quando o botão é precionado (dividida para um núcleos).
void button_task_for_pedestrians() {
gpio_init(GREEN_LED_PIN_FOR_PEDESTRIANS); // Inicializando o pino
gpio_set_dir(GREEN_LED_PIN_FOR_PEDESTRIANS, GPIO_OUT); // Definindo direção para "saida"
gpio_init(BUZZER_PIN);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN); // Configura o botão como entrada
gpio_pull_up(BUTTON_PIN); // Mantem o pino em nível lógico alto enquanto não pressionado
// Variáveis para controlar o estado do botão
bool button_pressed = false;
bool previous_button_state = true;
while (true) {
// Muda o estado da variavel para o estado atual do botão (0 ou 1)
bool current_button_state = gpio_get(BUTTON_PIN);
if (current_button_state != previous_button_state) {
if (current_button_state == 0) {
button_pressed = true;
gpio_put(BUZZER_PIN, 1);
sleep_ms(15000);
gpio_put(BUZZER_PIN, 0);
button_pressed = false;
}
}
previous_button_state = current_button_state;
if(button_pressed) {
gpio_put(GREEN_LED_PIN_FOR_PEDESTRIANS, 1);
sleep_ms(15000);
gpio_put(GREEN_LED_PIN_FOR_PEDESTRIANS, 0);
button_pressed = false;
}
sleep_ms(500);
}
}
//Essa é a função principal do projeto. É por ela que o código inicia.
int main() {
stdio_init_all();
// Inicializa um dos núcleos, responsável pelo semáforo.
multicore_launch_core1(led_task_for_cars);
// Inicializa o núcleo principal.
button_task_for_pedestrians();
return 0;
}