#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
#include <IRremote.h>
#include <dht.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
#define SERVO_PIN 6
#define SERVO_LOCK_POS 20
#define SERVO_UNLOCK_POS 90
#define PIN_RECEIVER 10
#define PIN_LED 13
#define DHT22_PIN 11
dht DHT;
IRrecv receiver(PIN_RECEIVER);
Servo lockServo;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
bool isLocked = true;
int LED = 1;
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
String correctCode = "1234";
void lock() {
lockServo.write(SERVO_LOCK_POS);
isLocked = true;
}
void unlock() {
lockServo.write(SERVO_UNLOCK_POS);
isLocked = false;
}
void setup() {
lcd.begin(16, 2);
receiver.enableIRIn();
pinMode(PIN_LED, OUTPUT);
lockServo.attach(SERVO_PIN);
lock();
lcd.setCursor(4, 0);
lcd.print("Welcome!");
delay(1000);
lcd.clear();
}
void loop() {
if (receiver.decode()) {
if (receiver.decodedIRData.command == 162) {
LED = !LED;
digitalWrite(PIN_LED, LED);
}
receiver.resume();
}
if (isLocked) {
int chk = DHT.read22(DHT22_PIN);
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(DHT.temperature, 1);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(DHT.humidity, 1);
lcd.print("%");
char key = keypad.getKey();
if (key == 'B') {
lcd.clear();
lcd.print("Enter Code: ");
String enteredCode = "";
while (enteredCode.length() < 4) {
key = keypad.getKey();
if (key && key >= '0' && key <= '9') {
lcd.print('*');
enteredCode += key;
}
}
if (enteredCode == correctCode) {
unlock();
lcd.clear();
lcd.print("Unlocked!");
delay(1000);
lock();
lcd.clear();
} else {
lcd.clear();
lcd.print("Wrong Code!");
delay(1000);
lcd.clear();
}
}
}
delay(200);
}