#include <Keypad.h>
#include <string.h>
#define PASSCODE "21103053"
#define UNLOCK_LED_PIN D12
#define BAD_STR_LED_PIN D11
#define ROWS 4
#define COLS 4
#define NUM_CHARS 80
#define ERROR_MS 500
#define PASS_MS 5000
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { D6, D5, D4, D3 };
uint8_t rowPins[ROWS] = { D10, D9, D8, D7 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String ourMsg = "";
bool locked;
bool badStr;
unsigned long badStrTimer = 0;
unsigned long lockTimer = 0;
void setup() {
Serial.begin(9600);
locked = true;
badStr = false;
pinMode(UNLOCK_LED_PIN, OUTPUT);
pinMode(BAD_STR_LED_PIN, OUTPUT);
Serial.println("Enter password followed by # to unlock");
}
void checkStr(void) {
if (ourMsg.equals(PASSCODE)) {
unlock();
} else {
showError();
}
ourMsg = "";
}
void lock(void) {
locked = true;
lockTimer = 0;
Serial.println("Relocking.");
}
void unlock(void) {
locked = false;
lockTimer = millis();
Serial.println("Correct password. LED ON");
digitalWrite(UNLOCK_LED_PIN, HIGH);
}
void showError(void) {
badStr = true;
badStrTimer = millis();
Serial.println("Incorrect password.");
digitalWrite(BAD_STR_LED_PIN, HIGH);
}
void clearError(void) {
badStr = false;
badStrTimer = 0;
digitalWrite(BAD_STR_LED_PIN, LOW);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == '#') {
Serial.println();
checkStr();
} else {
Serial.print(key);
ourMsg += key;
}
}
if (!locked && millis() - lockTimer >= PASS_MS) {
lock();
digitalWrite(UNLOCK_LED_PIN, LOW);
}
if (badStr && millis() - badStrTimer >= ERROR_MS) {
clearError();
}
}