// Bibliotecas:
#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <stdint.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdbool.h>
#include <stdlib.h>
#include <util/delay.h>
#include "usart.h"
// Definição dos pinos
#define s1 PB2
#define s2 PB0
#define spir PB1
#define led PB7
#define buzzer PB4
// Máscaras para as linhas e colunas do Keypad (4x3)
#define ROW1_PIN 22
#define ROW2_PIN 23
#define ROW3_PIN 24
#define ROW4_PIN 25
#define COL1_PIN 26
#define COL2_PIN 27
#define COL3_PIN 28
// Variáveis globais
char senha[5] = "1234"; // Senha inicial
char senha_digitada[5];
uint8_t pos_senha = 0;
bool alarme_armado = false;
bool alarme_disparado = false;
// Protótipos das funções
void pisca_led(int vezes);
void buzina_alerta(int duracao_ms);
void armar_alarme();
void disparar_alarme(uint8_t sensor);
void desarmar_alarme();
bool verifica_senha();
void redefinir_senha();
void leitura_sensores();
char ler_keypad();
char mapear_tecla(int linha, int coluna);
void processa_tecla(char tecla);
// Implementação das funções
void pisca_led(int vezes) {
for (int i = 0; i < vezes; i++) {
PORTB ^= (1 << led);
_delay_ms(200);
PORTB ^= (1 << led);
_delay_ms(200);
}
}
void buzina_alerta(int duracao_ms) {
PORTB |= (1 << buzzer);
_delay_ms(duracao_ms);
PORTB &= ~(1 << buzzer);
}
void armar_alarme() {
alarme_armado = true;
pisca_led(3);
USART0_transmite_string_FLASH(PSTR("ALARME ARMADO\n"));
}
void disparar_alarme(uint8_t sensor) {
alarme_disparado = true;
USART0_transmite_string_FLASH(PSTR("ALARME DISPARADO: MOVIMENTO DETECTADO NO SENSOR "));
USART0_transmite(sensor + '0');
USART0_transmite_string_FLASH(PSTR("\n"));
while (alarme_disparado) {
PORTB ^= (1 << led);
buzina_alerta(200);
_delay_ms(200);
}
}
void desarmar_alarme() {
alarme_armado = false;
alarme_disparado = false;
pisca_led(3);
USART0_transmite_string_FLASH(PSTR("ALARME DESARMADO\n"));
}
bool verifica_senha() {
return strcmp(senha, senha_digitada) == 0;
}
void redefinir_senha() {
strcpy(senha, senha_digitada);
USART0_transmite_string_FLASH(PSTR("SENHA REDIFINIDA\n"));
}
void leitura_sensores() {
uint8_t es1 = PINB & (1 << s1);
uint8_t es2 = PINB & (1 << s2);
uint8_t espir = PINB & (1 << spir);
if (es1 || es2 || espir) {
if (es1) disparar_alarme(1);
if (es2) disparar_alarme(2);
if (espir) disparar_alarme(3);
}
}
char mapear_tecla(int linha, int coluna) {
char matriz[4][3] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
return matriz[linha][coluna];
}
char ler_keypad() {
static char ultimaTecla = '\0';
static bool teclaPressionada = false;
for (int linha = 0; linha < 4; linha++) {
PORTA = ~(1 << linha);
_delay_us(100);
uint8_t colunas = PINA & 0xF0;
if (colunas != 0xF0) {
_delay_ms(40);
colunas = PINA & 0xF0;
if (colunas != 0xF0) {
for (int coluna = 0; coluna < 3; coluna++) {
if ((colunas & (1 << (coluna + 4))) == 0) {
char teclaAtual = mapear_tecla(linha, coluna);
if (!teclaPressionada && teclaAtual != ultimaTecla) {
_delay_ms(50);
if ((PINA & (1 << (coluna + 4))) == 0) {
ultimaTecla = teclaAtual;
teclaPressionada = true;
return teclaAtual;
}
}
}
}
}
} else {
teclaPressionada = false;
}
}
ultimaTecla = '\0';
return '\0';
}
void processa_tecla(char tecla) {
if (tecla == '*') {
pos_senha = 0;
USART0_transmite_string_FLASH(PSTR("DIGITE NOVA SENHA: "));
} else if (tecla == '#') {
senha_digitada[pos_senha] = '\0';
if (alarme_disparado) {
if (verifica_senha()) desarmar_alarme();
else USART0_transmite_string_FLASH(PSTR("SENHA INCORRETA\n"));
} else if (alarme_armado) {
if (verifica_senha()) desarmar_alarme();
else USART0_transmite_string_FLASH(PSTR("SENHA INCORRETA\n"));
} else {
if (verifica_senha()) armar_alarme();
else redefinir_senha();
}
pos_senha = 0;
} else {
senha_digitada[pos_senha++] = tecla;
}
}
int main(void) {
DDRB |= (1 << led) | (1 << buzzer);
DDRB &= ~((1 << s1) | (1 << s2) | (1 << spir));
PORTB |= (1 << s1) | (1 << s2) | (1 << spir);
DDRA |= 0x0F;
DDRA &= ~0xF0;
PORTA |= 0xF0;
USART0_configura();
USART0_transmite_string_FLASH(PSTR("DIGITE A SENHA PARA ARMAR O ALARME:\n"));
while (1) {
if (alarme_armado && !alarme_disparado) {
leitura_sensores();
}
char tecla = ler_keypad();
if (tecla) {
processa_tecla(tecla);
}
}
}