#include <Arduino.h>
// Definição dos pinos do teclado matricial
#define ROWS 4
#define COLS 4
// Atualização dos pinos de acordo com as novas conexões
const uint8_t row_pins[ROWS] = {8, 7, 6, 5}; // Pinos conectados às linhas R1, R2, R3, R4
const uint8_t col_pins[COLS] = {4, 3, 2, 1}; // Pinos conectados às colunas C1, C2, C3, C4
// Mapa de tecla do teclado matricial
const char key_map[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Função para inicializar os pinos do teclado
void keypad_init() {
for (int i = 0; i < ROWS; i++) {
pinMode(row_pins[i], OUTPUT);
digitalWrite(row_pins[i], LOW); // Configura as linhas como saída em nível baixo
}
for (int i = 0; i < COLS; i++) {
pinMode(col_pins[i], INPUT_PULLDOWN); // Configura as colunas como entradas com pull-down
}
}
// Função para ler o teclado matricial
char read_keypad() {
for (int row = 0; row < ROWS; row++) {
digitalWrite(row_pins[row], HIGH); // Ativa a linha atual
for (int col = 0; col < COLS; col++) {
if (digitalRead(col_pins[col])) { // Verifica se a coluna atual está em nível alto
digitalWrite(row_pins[row], LOW); // Desativa a linha atual
return key_map[row][col]; // Retorna a tecla pressionada
}
}
digitalWrite(row_pins[row], LOW); // Desativa a linha atual
}
return '\0'; // Retorna nulo se nenhuma tecla foi pressionada
}
void wait_for_key_release() {
// Aguarda até que todas as teclas sejam liberadas
bool key_still_pressed = true;
while (key_still_pressed) {
key_still_pressed = false;
for (int row = 0; row < ROWS; row++) {
digitalWrite(row_pins[row], HIGH);
for (int col = 0; col < COLS; col++) {
if (digitalRead(col_pins[col])) {
key_still_pressed = true; // Continua esperando se alguma tecla ainda estiver pressionada
}
}
digitalWrite(row_pins[row], LOW);
}
}
}
void setup() {
Serial.begin(115200); // Inicializa a comunicação serial
keypad_init(); // Inicializa o teclado matricial
Serial.println("Teclado matricial inicializado!");
}
void loop() {
char key = read_keypad(); // Lê o teclado
if (key != '\0') { // Verifica se uma tecla foi pressionada
Serial.printf("Tecla pressionada: %c\n", key); // Imprime a tecla pressionada
wait_for_key_release(); // Aguarda até que todas as teclas sejam liberadas
delay(200); // Pequeno atraso para evitar múltiplas leituras consecutivas
}
}