#define BLYNK_TEMPLATE_ID "TMPL2bsJyrlzm"
#define BLYNK_TEMPLATE_NAME "Quickstart Device"
#define BLYNK_AUTH_TOKEN "A46L3pvXe3F5VHGO6nhqXBv9C7GB9RQG"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include "time.h"
// إعداد الوقت (NTP)
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3 * 3600; // +3 GMT للسودان
const int daylightOffset_sec = 0;
#define DHTPIN 4
#define DHTTYPE DHT22
#define PIR_PIN 5
#define SOUND_BTN 12
#define BUZZER 15
#define LED 2
#define SERVO_PIN 18
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
WidgetLCD lcdWidget(V5);
WidgetLED ledWidget(V6);
float t, h;
bool motion = false, sound = false;
unsigned long eventTime = 0;
bool eventActive = false;
bool servoRight = true;
String lastName = ""; // اسم الطالب من بايثون
// استقبال الاسم من بايثون عبر Blynk (V3)
BLYNK_WRITE(V3) {
lastName = param.asStr();
// الحصول على الوقت الحالي
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("⚠️ Failed to get time");
return;
}
char timeString[30];
strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);
if (lastName == "Unauthorized") {
// تفعيل التنبيه (ضوء + صوت + سيرفو)
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, HIGH);
myservo.write(0); // تحريك السيرفو
eventActive = true;
eventTime = millis();
// عرض Unauthorized على الشاشات
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALERT!");
lcd.setCursor(0, 1);
lcd.print("Unauthorized");
lcdWidget.clear();
lcdWidget.print(0, 0, "ALERT!");
lcdWidget.print(0, 1, "Unauthorized");
ledWidget.on();
String logData = "Unauthorized Entry | " + String(timeString);
Serial.println("🚨 " + logData);
Blynk.virtualWrite(V4, logData);
} else {
// عرض الاسم كحضور عادي
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Entry:");
lcd.setCursor(0, 1);
lcd.print(lastName);
lcdWidget.clear();
lcdWidget.print(0, 0, "Entry:");
lcdWidget.print(0, 1, lastName);
String logData = "Entry " + lastName + " | " + String(timeString);
Serial.println("✅ " + logData);
Blynk.virtualWrite(V4, logData);
}
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(SOUND_BTN, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
myservo.attach(SERVO_PIN);
myservo.write(90); // الوضع الطبيعي
lcd.init();
lcd.backlight();
dht.begin();
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// إعداد NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
Blynk.run();
h = dht.readHumidity();
t = dht.readTemperature();
motion = digitalRead(PIR_PIN);
sound = !digitalRead(SOUND_BTN);
if (motion || sound) {
eventActive = true;
eventTime = millis();
digitalWrite(BUZZER, HIGH);
digitalWrite(LED, HIGH);
// تحريك السيرفو لمحاكاة الكاميرا
if (servoRight) {
myservo.write(0);
} else {
myservo.write(180);
}
servoRight = !servoRight;
if (motion && sound) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motion & Noise");
lcd.setCursor(0, 1);
lcd.print("Detected");
lcdWidget.clear();
lcdWidget.print(0, 0, "Motion & Noise");
lcdWidget.print(0, 1, "Detected");
ledWidget.on();
Blynk.virtualWrite(V4, "Motion & Noise Detected");
} else if (motion) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motion Detected");
lcdWidget.clear();
lcdWidget.print(0, 0, "Motion Detected");
ledWidget.on();
Blynk.virtualWrite(V4, "Motion Detected");
} else if (sound) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Noise Detected");
lcdWidget.clear();
lcdWidget.print(0, 0, "Noise Detected");
ledWidget.on();
Blynk.virtualWrite(V4, "Noise Detected");
}
}
// إيقاف الحدث بعد 5 ثواني
if (eventActive && (millis() - eventTime >= 5000)) {
eventActive = false;
digitalWrite(BUZZER, LOW);
digitalWrite(LED, LOW);
ledWidget.off();
myservo.write(90); // عودة للوضع الطبيعي
}
// في الوضع الطبيعي عرض الحرارة والرطوبة
if (!eventActive) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(t, 1);
lcd.print(" H:");
lcd.print(h, 1);
lcdWidget.clear();
lcdWidget.print(0, 0, "T:" + String(t, 1));
lcdWidget.print(0, 1, "H:" + String(h, 1));
String data = "T:" + String(t, 1) + " H:" + String(h, 1);
Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V2, h);
Blynk.virtualWrite(V4, data);
}
}
LCD
PIR
LED
DHT22
BUZZER
SERVO
SOUND BTN
R 220
R 10K