Seu código me ajudou e eu terminei a lógica -
#include[/color]
// Definição do teclado
const byte ROWS = 4; // Número de linhas
const byte COLS = 3; // Número de colunas
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; // Definição de pinos das linhas
byte colPins[COLS] = {13, 3, 2}; // Definição de pinos das colunas
// Criação do teclado
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Declaração das variáveis referentes aos pinos digitais.
int pinBuzzer = 9;
int pinSensorPIR = 10;
int pinLed = 11;
int valorSensorPIR = 0;
bool alarmeAtivo = false; // Inicia o alarme desativado
bool aguardandoDesativacao = false; // Flag para indicar se o sistema está aguardando a desativação do alarme
String senhaCorreta = "2233";
String senhaInserida = ""; // String para armazenar a senha inserida
void setup() {
Serial.begin(9600); // Inicializando o serial monitor
// Definindo pinos como de entrada ou de saída
pinMode(pinBuzzer, OUTPUT);
pinMode(pinSensorPIR, INPUT);
pinMode(pinLed, OUTPUT);
solicitarSenha();
}
void loop() {
// Lendo o valor do sensor PIR. Este sensor pode assumir 2 valores
// 1 quando detecta algum movimento e 0 quando não detecta.
valorSensorPIR = digitalRead(pinSensorPIR);
Serial.print("Valor do Sensor PIR: ");
Serial.println(valorSensorPIR);
// Se o alarme estiver ativado, realizar as leituras e ações
if (alarmeAtivo) {
// Verificando se ocorreu detecção de movimentos
if (valorSensorPIR == 1) {
ligarAlarme();
} else {
desligarAlarme();
}
}
// Leitura do teclado
char key = keypad.getKey();
if (key) {
processarTecla(key);
}
}
void solicitarSenha() {
Serial.println("Digite a senha:");
while (true) {
char key = keypad.getKey();
if (key) {
processarTecla(key);
delay(100); // Adiciona um pequeno atraso para evitar pressionar teclas rapidamente
}
// Ativar o alarme quando a senha correta for inserida
if (alarmeAtivo) {
// Lendo o valor do sensor PIR. Este sensor pode assumir 2 valores
// 1 quando detecta algum movimento e 0 quando não detecta.
valorSensorPIR = digitalRead(pinSensorPIR);
Serial.print("Valor do Sensor PIR: ");
Serial.println(valorSensorPIR);
// Verificando se ocorreu detecção de movimentos
if (valorSensorPIR == 1) {
ligarAlarme();
} else {
desligarAlarme();
}
}
}
}
void ligarAlarme() {
// Se o alarme estiver ligado e aguardando a desativação
if (alarmeAtivo && aguardandoDesativacao) {
// Verifica se a senha correta foi inserida
char key = keypad.getKey();
if (key != NO_KEY) {
senhaInserida += key;
Serial.print("Senha digitada: ");
Serial.println(senhaInserida);
if (senhaInserida == senhaCorreta) {
Serial.println("Senha correta. Alarme desativado.");
// Reseta as variáveis e desativa o alarme
alarmeAtivo = false;
aguardandoDesativacao = false;
senhaInserida = "";
// Desligando o led
digitalWrite(pinLed, LOW);
// Desligando o buzzer
noTone(pinBuzzer);
}
}
} else {
// Se o alarme estiver ligado, mas não estiver aguardando a desativação
Serial.println("Alarme ativado. Aguarde a senha para desativar.");
// Reseta as variáveis e marca que está aguardando a desativação
aguardandoDesativacao = true;
senhaInserida = "";
// Ligando o led
piscar();
// Ligando o buzzer com uma frequência de 1500 Hz.
tone(pinBuzzer, 1500);
// Aguarda até que a senha correta seja inserida ou o botão '#' seja pressionado
while (aguardandoDesativacao) {
char key = keypad.getKey();
if (key != NO_KEY) {
senhaInserida += key;
Serial.print("Senha digitada: ");
Serial.println(senhaInserida);
if (senhaInserida == senhaCorreta) {
Serial.println("Senha correta. Alarme desativado.");
// Reseta as variáveis e desativa o alarme
alarmeAtivo = false;
aguardandoDesativacao = false;
senhaInserida = "";
// Desligando o led
digitalWrite(pinLed, LOW);
// Desligando o buzzer
noTone(pinBuzzer);
}
}
// Verifica se o botão '#' foi pressionado para desativar o alarme
if (key == '#') {
Serial.println("Desativação do alarme cancelada.");
aguardandoDesativacao = false;
// Desligando o led
digitalWrite(pinLed, LOW);
// Desligando o buzzer
noTone(pinBuzzer);
break;
}
}
}
}
void desligarAlarme() {
// Desligando o led
digitalWrite(pinLed, LOW);
// Desligando o buzzer
noTone(pinBuzzer);
}
void processarTecla(char tecla) {
// Adicionar a tecla à senha se não for '#'
if (tecla != '#') {
senhaInserida += tecla;
Serial.print("Senha digitada: ");
Serial.println(senhaInserida);
}
// Verificar se a senhaInserida coincide com a senhaCorreta
if (senhaInserida == senhaCorreta) {
delay(5000);
alarmeAtivo = true;
Serial.println("Senha correta. Alarme ativado.");
// Limpar a senha inserida
senhaInserida = "";
} else if (senhaInserida.length() > senhaCorreta.length()) {
Serial.println("Senha incorreta. Tente novamente.");
// Limpar a senha inserida
senhaInserida = "";
}
}
void piscar(){
while(alarmeAtivo){
ligarAlarme();
if(alarmeAtivo){
digitalWrite(pinLed, HIGH);
delay(100);
digitalWrite(pinLed, LOW);
delay(100);
}else{
break;
}
}
}