#include <LiquidCrystal_I2C.h>
const int numRows = 4;
const int numCols = 4;
const int debounceTime = 20;
const char keymap[numRows][numCols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
const int rowPins[numRows] = {12, 11, 10, 9};
const int colPins[numCols] = {7, 6, 5, 4};
LiquidCrystal_I2C lcd(0x27, 16, 2);
const String password = "123";
const String password2 = "321";
String enter = "";
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
lcd.backlight();
for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row], INPUT_PULLUP);
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column], OUTPUT);
digitalWrite(colPins[column], HIGH);
}
}
void loop()
{
char key = getKey();
if (key != 0)
{
lcd.print(key);
if (key == '#')
{
if (enter == password)
{
lcd.clear();
lcd.setCursor(0, 0);
digitalWrite(2, HIGH);
}
else if (enter == password2)
{
lcd.clear();
lcd.setCursor(0, 0);
digitalWrite(2,LOW);
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Invalid password");
}
enter = "";
lcd.clear();
}
else
{
enter += key;
}
}
}
char getKey()
{
char key = 0;
for (int column = 0; column < numCols; column++)
{
digitalWrite(colPins[column], LOW);
for (int row = 0; row < numRows; row++)
{
if (digitalRead(rowPins[row]) == LOW)
{
delay(debounceTime);
while (digitalRead(rowPins[row]) == LOW) ;
key = keymap[row][column];
digitalWrite(colPins[column], HIGH);
return key;
}
}
digitalWrite(colPins[column], HIGH);
}
return key;
}