// Cofre Arduino - Projeto Usinainfo para controle de fechaduras.
// Código teste para liberação de acesso ao Cofre Arduino
 
#include <Password.h>   // Inclui biblioteca Password.h
#include <Keypad.h>       // Inclui biblioteca Keypa.h
#include <CuteBuzzerSounds.h>

/*
 * Author: Everton Ramires
 * More Tutorial: https://www.youtube.com/channel/UC7zG4YQJc8v-9jNGQknOx5Q
 * 
 * 
 
 CURRENT SOUND OPTIONS: 
 (PT-BR)OPÇÕES ATUAIS DE SONS:
 
 S_CONNECTION   S_DISCONNECTION S_BUTTON_PUSHED   
 S_MODE1        S_MODE2         S_MODE3     
 S_SURPRISE     S_OHOOH         S_OHOOH2    
 S_CUDDLY       S_SLEEPING      S_HAPPY     
 S_SUPER_HAPPY  S_HAPPY_SHORT   S_SAD       
 S_CONFUSED     S_FART1         S_FART2     
 S_FART3        S_JUMP 20

 */

#define BUZZER_PIN 11 // Define o pino D11 como buzzer 
#define rele 3              // Define o pino D2 como rele
          
 
Password senha = Password("01DA06");      // Senha para liberação de acesso
 
const byte linha = 4;     // Define número de linhas
const byte coluna = 4;    // Define número de colunas
 
// Relaciona linha e colunas para determinação dos caracteres
char keys[linha][coluna] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
 
byte pinolinha[linha] = {10, 9, 8, 7};       // Declara os pinos de interpretação das linha
byte pinocoluna[coluna] = {6, 5, 4, 2};      // Declara os pinos de interpretação das coluna
 
Keypad keypad = Keypad(makeKeymap(keys), pinolinha, pinocoluna, linha, coluna);
 
void setup() {
  pinMode(rele, OUTPUT);           // Declara o pino como um pino de Saída de sinal
  cute.init(BUZZER_PIN);           // Declara o pino como um pino de Saída de sinal
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent);
  keypad.setDebounceTime(5);         // Tempo de atraso para leitura das teclas.
}
 
void loop() {
  keypad.getKey();
}
 
// Realiza a leitura das teclas pressionadas e aguarda confirmação para verificar
void keypadEvent(KeypadEvent eKey) {
    switch (keypad.getState()) {
      case PRESSED:
        Serial.print("Digitado: ");
        Serial.println(eKey);
        cute.play(S_CONNECTION);
        delay(200);
        switch (eKey) {          
          case '#': senha.reset(); 
          cute.play(S_JUMP);
          delay(200);break;
          case '*': verificasenha();
          cute.play(S_OHOOH2);
          delay(200);break;
          default: senha.append(eKey);
        }
    }
  }
 
// Verifica o senha digitada após pressionar C
void verificasenha() {
  Serial.print("Verificando, aguarde... ");
  if (senha.evaluate()) {
    Serial.println("Acionando rele... ");
    cute.play(S_BUTTON_PUSHED);
    delay(200);
    digitalWrite(rele, HIGH);
    cute.play(S_HAPPY);
    delay(200);
    Serial.println("Cofre aberto... ");
    delay(1500);
    digitalWrite(rele, LOW);
    Serial.println("Cofre fecha... ");
    cute.play(S_SLEEPING);
    delay(500);
    senha.reset();
  }
  else {
    cute.play(S_DISCONNECTION);
    delay(200);
    digitalWrite(rele, LOW);
    Serial.println("Senha Invalida !");    
    cute.play(S_CONFUSED);
    delay(400);
    senha.reset();
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
bz1:1
bz1:2
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO