#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
String database[4][50]={
{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50"},
{"nama1","nama2","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama","nama"},
{"nis1","nis2","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis","nis"},
{"123456","123456","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password","password"}
};
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 25200;
const int daylightOffset_sec = 3600;
byte pin_rows[ROW_NUM] = {2, 4, 5, 19};
byte pin_column[COLUMN_NUM] = {13, 27, 26, 25};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer);
String enteredPassword = "";
uint8_t numID = 0;
unsigned long previousMillis = 0;
const long interval = 1000;
boolean blinkState = false;
unsigned int countTimeout = 0;
boolean resetSystem = false;
String weekDay = "";
String currentDate = "";
String formattedTime = "";
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
lcd.setCursor(0, 0);
lcd.print("Connecting to ");
lcd.setCursor(0, 1);
lcd.print(WIFI_SSID);
delay(500);
}
lcd.clear();
Serial.print("\nWiFi connected. IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Retrieving time: ");
lcd.setCursor(0, 0);
lcd.print("Doorlock System ");
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
time_t now = time(nullptr);
int xCursor = 0;
while (now < 24 * daylightOffset_sec){
Serial.print(".");
lcd.setCursor(xCursor, 1);
lcd.print(".");
xCursor++;
if(xCursor>15){
lcd.setCursor(0, 1);
lcd.print(" ");
xCursor=0;
}
delay(100);
now = time(nullptr);
}
Serial.println(now);
timeClient.begin(gmtOffset_sec);
timeClient.setTimeOffset(gmtOffset_sec);
size_t freeHeap = heap_caps_get_free_size(MALLOC_CAP_8BIT);
Serial.print("Free Heap Size: ");
Serial.print(freeHeap);
Serial.println(" bytes");
Serial.println("Alat Ready .");
delay(1000);
lcd.clear();
}
void loop() {
while (numID == 0) {
timeClient.update();
weekDay = weekDays[timeClient.getDay()];
time_t epochTime = timeClient.getEpochTime();
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
int currentMonth = ptm->tm_mon+1;
int currentYear = ptm->tm_year+1900;
currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
formattedTime = timeClient.getFormattedTime();
lcd.setCursor(0, 0);
lcd.print("Scan your finger");
lcd.setCursor(0, 1);
for(int x=0;x<((16-formattedTime.length())/2);x++){lcd.print(" ");}
lcd.print(formattedTime);
while (Serial.available()>0){
numID = Serial.parseInt();
}
}
while (numID > 0){
lcd.setCursor(0, 0);
lcd.print(" Welcome. ");
lcd.setCursor(0, 1);
for(int x=0;x<((16-database[1][numID-1].length())/2);x++){lcd.print(" ");}
lcd.print(database[1][numID-1]);
delay(2000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
while (numID > 0){
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
blinkState = !blinkState;
countTimeout++;
}
char key = keypad.getKey();
if (key) {
Serial.println(key);
checkPassword(key);
}
lcd.setCursor(0, 0);
lcd.print("Enter password "+String(5-countTimeout));
lcd.setCursor(0, 1);
for(int x=0;x<enteredPassword.length();x++){
lcd.print("*");
}
if (countTimeout > 5) {
countTimeout=0;
numID=0;
}
}
}
void checkPassword(char key) {
if (key == '#') {
lcd.setCursor(0, 0);
lcd.print("Check password..");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(1000);
if (enteredPassword == database[3][numID-1]) {
lcd.setCursor(0, 0);
lcd.print("Password correct");
lcd.setCursor(0, 1);
lcd.print("Open doorlock . ");
delay(2000);
lcd.clear();
enteredPassword = "";
numID = 0;
}
else {
lcd.setCursor(0, 0);
lcd.print("Wrong password !");
lcd.setCursor(0, 1);
lcd.print("Try again . ");
delay(2000);
lcd.clear();
enteredPassword = "";
}
}
else {
enteredPassword += key;
}
}