#include <WiFi.h>
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
#include <ThingSpeak.h>
WiFiClient client;
long myChannelNumber = 2651307;
const char* myWriteAPIKey = "9KEHGRE598FZ1EIM";
#define SERVO_PIN 32
#define PIR_PIN 25
#define BUZZER_PIN 19
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int statusCode;
bool motionDetected = false;
bool doorLocked = true;
Servo doorLock;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
void setup() {
ThingSpeak.begin(client);
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
Serial.println("Hello, ESP32!");
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
doorLock.attach(SERVO_PIN);
doorLock.write(0);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Smart Door Lock");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnected.");
}
delay(10);
Serial.print("door is locked: ");
Serial.println(doorLocked);
ThingSpeak.setField(1, doorLocked ? 1 : 0);
statusCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (statusCode == 200) {
Serial.println("Channel update successful.");
} else {
Serial.println("Problem Writing data. HTTP error code :" + String(statusCode));
}
motionDetected = digitalRead(PIR_PIN);
if (motionDetected && doorLocked) {
unlockDoor();
} else if (!doorLocked) {
lockDoor();
}
delay(200);
}
void unlockDoor() {
Serial.println("unlock");
doorLock.write(90);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Motion Detected");
LCD.setCursor(0, 1);
LCD.print("Door is Unlocked");
tone(BUZZER_PIN, 200);
delay(100);
noTone(BUZZER_PIN);
delay(4500);
doorLocked = false;
}
void lockDoor() {
Serial.println("lock");
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Door is Locked");
doorLock.write(45);
doorLocked = true;
}