Logo Hardware.com.br
kleber-carvalho
kleber-carva... Zerinho Registrado
1 Mensagem 1 Curtida

Ativando e desativando alarme Arduino com teclado 4x4

#1 Por kleber-carva... 12/12/2023 - 17:46
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;
    }
  }
 
 
}
Responder
apimente.br
apimente.br Cyber Highlander Moderador
51.1K Mensagens 3.8K Curtidas
#2 Por apimente.br
12/12/2023 - 17:46
Desmembrado de: https://www.hardware.com.br/comunidade/v-t/1495059 e movido para um novo tópico. Por gentileza, não levante tópicos antigos nem atravesse tópicos alheios com suas dúvidas pessoais. Isso atrapalha a organização do fórum.

Quando necessário, crie um tópico na sala correspondente ao seu problema.
O Linux não é o Windows
Como fazer perguntas inteligentes? Clique aqui!
Ao pedir ajuda, informe sua configuração completa e forneça detalhes suficientes para alguém te ajudar.

© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal