/*
IFRN- INSTITUTO FEDERAL DO RIO GRANDE DO NORTE - CAMPUS ZONA LESTE- EAD
CURSO DE FORMAÇÃO INICIAL E CONTINUADA EM SISTEMAS EMBARCADOS
EMBARCATECH
Projeto de semáforo para pessoas com deficiência visual com sinal sonoro. Código com funcionalidade de semáforo convencional, com acréscimo que garante
a função de interrupção na placa Raspberry Pi Pico W. A função de interrupção que foi implementada, garantindo o acionamento automático do sinal, priorizando
o pedestre. Código, com os trechos comentados.
Maria do Socorro de Oliveira
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
// Definição dos pinos de saída dos LEDs
#define LED_VERDE 11
#define LED_AMARELO 12
#define LED_VERMELHO 14
#define PEDESTRE 15
// Configuração dos pinos do botão e o buzzer
//#define BOTAO_PIN 10
#define BUZZER_PIN 13
// Definição da frequência do buzzer
#define BUZZER_FREQUENCY 1500
#define BUZZER_TONE 1024 // Nível de som do buzzer
// Função para funcionamento do buzzer
void pwm_init_buzzer(uint pin) {
// Configurar o pino como saída de PWM
gpio_set_function(pin, GPIO_FUNC_PWM);
// Obter o slice do PWM associado ao pino
uint slice_num = pwm_gpio_to_slice_num(pin);
// Configurar o PWM com frequência desejada
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, (float)clock_get_hz(clk_sys) / (BUZZER_FREQUENCY * 4096)); // Divisor de clock
pwm_init(slice_num, &config, true);
// Iniciar o PWM no nível baixo
pwm_set_gpio_level(pin, 0);
}
// Função para emitir o sinal sonoro
void sinal_sonoro(uint pin, uint duration_ms) {
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_set_gpio_level(pin, BUZZER_TONE); // Aciona o buzzer
sleep_ms(duration_ms); // Sinal sonoro de 500ms
pwm_set_gpio_level(pin, 0); // Desliga o buzzer
// Pausa de 500ms
}
void trafego_carros(const uint BOTAO_PIN) {
gpio_init(LED_VERMELHO);
gpio_init(LED_AMARELO);
gpio_init(LED_VERDE);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);// Configuração dos pinos como saída(GPIO_OUT)
gpio_set_dir(LED_AMARELO, GPIO_OUT);
gpio_set_dir(LED_VERDE, GPIO_OUT);
gpio_put(LED_VERDE, 1);
for (uint i = 0; i < 8; i++) {
sleep_ms(1000);
if (gpio_get(BOTAO_PIN) == 0) return;
}
gpio_put(LED_VERDE, 0);
gpio_put(LED_AMARELO, 1);
for (uint j = 0; j < 2; j++) {
sleep_ms(1000);
if (gpio_get(BOTAO_PIN) == 0) return;
}
gpio_put(LED_AMARELO, 0);
gpio_put(LED_VERMELHO, 1);
for (uint k = 0; k < 10; k++) {
sleep_ms(1000);
if (gpio_get(BOTAO_PIN) == 0) return;
}
gpio_put(LED_VERMELHO, 0);
}
void trafego_pedestre(const uint BOTAO_PIN) {
gpio_put(LED_VERDE, 0);
gpio_put(LED_AMARELO, 0);
gpio_put(PEDESTRE, 0);
gpio_put(LED_VERMELHO, 0);
gpio_put(LED_AMARELO, 1);
sleep_ms(5000);
gpio_put(LED_VERMELHO, 1);
gpio_put(PEDESTRE, 1);
sinal_sonoro(BUZZER_PIN, 500); // Emitir sinal sonoro
sleep_ms(1000);
}
int main() {
// Inicializa a comunicação serial (substitui o stdio_init_all())
//stdio_init_all();
const uint BOTAO_PIN = 10;
// Inicializa os pinos dos LEDs do semáforo, dos pedestres e do botão
gpio_init(LED_VERDE);
gpio_init(LED_AMARELO);
gpio_init(LED_VERMELHO);
gpio_init(BOTAO_PIN);
gpio_init(BUZZER_PIN);
gpio_init(PEDESTRE);
// Configura todos LEDs como saída
gpio_set_dir(LED_VERDE, GPIO_OUT);
gpio_set_dir(LED_AMARELO, GPIO_OUT);
gpio_set_dir(LED_VERMELHO, GPIO_OUT);
gpio_set_dir(PEDESTRE, GPIO_OUT);
gpio_set_dir(BUZZER_PIN, GPIO_OUT);
// Configura o botão como entrada e ativa o pull-up
gpio_set_dir(BOTAO_PIN, GPIO_IN);
gpio_pull_up(BOTAO_PIN);
BOTAO_PIN == 0;
// Configura o PWM para o buzzer
pwm_init_buzzer(BUZZER_PIN);
while (true) {
if (gpio_get(BOTAO_PIN) == 0) {
trafego_pedestre(BOTAO_PIN);
} else {
trafego_carros(BOTAO_PIN);
}
}
return 0;
}