// BIBLIOTECAS
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pwm.h"
// Constantes para linhas e colunas do keypad
#define linhas 4 // Número de linhas do keypad
#define colunas 4 // Número de colunas do keypad
// Saída dos LEDs
#define green 11
#define blue 12
#define red 13
// Configuração do buzzer
#define buzzer 21 // Saída do buzzer
#define buzF 100 // Frequência do buzzer em Hz
// Inicializar o PWM do buzzer
void pwm_init_buzzer(uint pin) {
gpio_set_function(pin, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(pin);
// Configuração do PWM
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (buzF * 4096)); // Divisor de clock ajustado
pwm_init(slice_num, &config, true);
pwm_set_gpio_level(pin, 0); // Começa em nível lógico baixo
}
// Função para emitir sinal sonoro (beep)
void beep(uint pin, uint duracao) {
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_set_gpio_level(pin, 2048); // Ciclo de trabalho de 50%
sleep_ms(duracao); // Temporização
pwm_set_gpio_level(pin, 0); // Desativa o PWM
sleep_ms(100); // Pausa entre beeps
}
// Configuração dos pinos do keypad
unsigned int gpio_linhas[linhas] = {1, 2, 3, 4};
unsigned int gpio_colunas[colunas] = {22, 26, 27, 28};
// Mapeamento das teclas do keypad em forma de matriz
const char keymap[linhas][colunas] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Função para inicializar os GPIOs do keypad
void keypad_init() {
gpio_init(buzzer);
gpio_set_dir(buzzer, GPIO_OUT);
// Inicializar o PWM no pino do buzzer
pwm_init_buzzer(buzzer);
// Inicializar os LEDs
gpio_init(blue);
gpio_set_dir(blue, GPIO_OUT);
gpio_init(green);
gpio_set_dir(green, GPIO_OUT);
gpio_init(red);
gpio_set_dir(red, GPIO_OUT);
// Configurar pinos das linhas como saída
for (int i = 0; i < linhas; i++) {
gpio_init(gpio_linhas[i]);
gpio_set_dir(gpio_linhas[i], GPIO_OUT);
gpio_put(gpio_linhas[i], 1);
}
// Configurar pinos das colunas como entrada com resistor pull-up
for (int j = 0; j < colunas; j++) {
gpio_init(gpio_colunas[j]);
gpio_set_dir(gpio_colunas[j], GPIO_IN);
gpio_pull_up(gpio_colunas[j]);
}
}
// Função para verificar qual tecla foi pressionada no keypad
char keypad_get_key() {
for (int i = 0; i < linhas; i++) {
gpio_put(gpio_linhas[i], 0); // Ativa a linha atual (nível lógico baixo)
for (int j = 0; j < colunas; j++) {
if (gpio_get(gpio_colunas[j]) == 0) { // Se a coluna está em nível lógico baixo
while (gpio_get(gpio_colunas[j]) == 0); // Aguarda a tecla ser liberada
gpio_put(gpio_linhas[i], 1); // Restaura o nível lógico alto na linha
return keymap[i][j]; // Retorna a tecla pressionada
}
}
gpio_put(gpio_linhas[i], 1); // Restaura o nível lógico alto na linha
}
return '\0'; // Retorna '\0' se nenhuma tecla foi pressionada
}
// Função principal do programa
int main() {
stdio_init_all(); // Inicializa a saída serial para depuração
keypad_init(); // Inicializa os GPIOs do keypad
printf("Keypad iniciado.\n");
printf("Pressione A para acionar o LED verde.\n");
printf("Pressione B para acionar o LED azul.\n");
printf("Pressione C para acionar o LED vermelho.\n");
printf("Pressione D para acionar todos os LEDs.\n");
printf("Pressione # para acionar o buzzer.\n");
// Loop infinito para leitura das teclas
while (1) {
char key = keypad_get_key(); // Verifica se alguma tecla foi pressionada
if (key != '\0') { // Se uma tecla foi pressionada
printf("Tecla pressionada: %c\n", &key);
// Ações baseadas na tecla pressionada
if (key == 'A') {
gpio_put(green, 1);
gpio_put(blue, 0);
gpio_put(red, 0);
} else if (key == 'B') {
gpio_put(blue, 1);
gpio_put(green, 0);
gpio_put(red, 0);
} else if (key == 'C') {
gpio_put(blue, 0);
gpio_put(green, 0);
gpio_put(red, 1);
} else if (key == 'D') {
gpio_put(blue, 1);
gpio_put(green, 1);
gpio_put(red, 1);
} else if (key == '#') {
printf("Ativando buzzer...\n");
beep(buzzer, 500); // Bipe de 500ms
}
}
sleep_ms(100); // Pausa de 100ms para debounce
}
return 0;
}