#include "Minimal_KeyPad.h"
#include <cmath>
#define DEBUG
#define CONFIRM 'C'
#define DELETE 'D'
#define PASS_LEN 4
#define DELAY 10000UL
#define DT(T1, T0) (T1 - T0)
int led_pin = 19;
int buzzer_pin = 29;
int relay_pin = 23;
int open_closed = 0;
MiniKeyPad mini_kp(2, 4, 5, 12, 13, 14, 15, 25);
volatile char keyPressed = 0;
//MOCH
struct Moch {
int pin;
volatile int state;
} my_moch{27, 0};
void log_moch_state() {
Serial.printf("Valor sensor: %d\n", my_moch.state);
if (my_moch.state)
Serial.println("Canal obstruído");
else {
Serial.println("Canal livre");
}
}
//kEYPAD
char keys[16] = {
'1', '2', '3', 'A',
'4', '5', '6', 'B',
'7', '8', '9', 'C',
'*', '0', '#', 'D'
};
//PASS
uint32_t c_pass = ('1' - '0') | (('2' - '0') << 4) | (('3' - '0') << 8) | (('4' - '0') << 12);
uint32_t pass = 0;
int pass_i = 0;
void confirm_pass() {
//Serial.printf("Senha inserida: %x\n", pass & 0xffff);
if (pass == c_pass) {
unsigned long time_before = millis();
#ifdef DEBUG
Serial.println("Portão aberto");
#endif
while (DT(millis(), time_before) < DELAY && !open_closed) {
open_closed = digitalRead(my_moch.pin) && !my_moch.state;
my_moch.state = digitalRead(my_moch.pin);
delay(50);
digitalWrite(led_pin, HIGH);
digitalWrite(buzzer_pin, HIGH);
digitalWrite(relay_pin, LOW);
}
#ifdef DEBUG
Serial.println("Portão fechado");
#endif
digitalWrite(led_pin, LOW);
digitalWrite(buzzer_pin, LOW);
digitalWrite(relay_pin, HIGH);
} else {
#ifdef DEBUG
Serial.println("Senha errada");
Serial.println(pass);
#endif
digitalWrite(led_pin, LOW);
digitalWrite(buzzer_pin, LOW);
digitalWrite(relay_pin, HIGH);
}
}
void read_pass (int key_pressed) {
if (!key_pressed) return;
Serial.println("a");
//Apaga o ultimo caractere adicionado a senha
if ((keys[key_pressed - 1] == DELETE) && (pass_i > 0)) {
#ifdef DEBUG
Serial.printf("pass: %x\n pass_i: %d\n", pass & 0xffff, pass_i);
#endif
pass = pass & (~(0xf << (4 * (pass_i - 1))));
pass_i--;
#ifdef DEBUG
Serial.printf("pass: %x\n pass_i: %d\n", pass & 0xffff, pass_i);
#endif
return;
}
if ((keys[key_pressed] >= '0' && keys[key_pressed] <= '9') && pass_i < 4) {
pass = pass | ((keys[key_pressed - 1] - '0') << (4 * pass_i));
pass_i++;
}
#ifdef DEBUG
Serial.println(pass_i);
#endif
if (pass_i == 4 && keys[key_pressed - 1] == CONFIRM) {
pass_i = 0;
confirm_pass();
pass = 0;
open_closed = 0;
}
}
void setup() {
Serial.begin(115200);
pinMode(my_moch.pin, INPUT);
pinMode(led_pin, OUTPUT);
pinMode(buzzer_pin, OUTPUT);
pinMode(relay_pin, OUTPUT);
digitalWrite(relay_pin, HIGH);
mini_kp.init();
my_moch.state = digitalRead(my_moch.pin);
#ifdef DEBUG
Serial.printf("Senha correta: %x\n", c_pass & 0xffff);
#endif
}
void loop() {
keyPressed = mini_kp.getKey();
my_moch.state = digitalRead(my_moch.pin);
#ifdef DEBUG
if (keyPressed != 0)
Serial.printf("Tecla pressionada: %c\n", keys[keyPressed - 1]);
#endif
read_pass(keyPressed);
delay(50); // this speeds up the simulation
}