#define BLYNK_TEMPLATE_ID "TMPL3h4qbt_Ap"
#define BLYNK_TEMPLATE_NAME "Home Automation System Task 2"
#define BLYNK_AUTH_TOKEN "GuEgdGUGeu7dVqBLerqPA9bgImlcq7Gb"
char ssid[] = "Wokwi-GUEST";
char password[] = "";
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <U8g2lib.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
// === Pin Definitions ===
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define MQ2_PIN 14
#define PIR_PIN 13
#define LDR_ANALOG 36
#define LDR_DIGITAL 32
#define TRIG_PIN 12
#define ECHO_PIN 27
#define BUZZER_PIN 5
#define LED_PIN 18
#define FAN_PIN 4
#define SERVO_PIN 23
#define RGB_R 19
#define RGB_G 18
#define RGB_B 22
// LCD and OLED I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo doorServo;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
// NTP Time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800, 60000); // IST
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
dht.begin();
pinMode(MQ2_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LDR_DIGITAL, INPUT);
pinMode(LDR_ANALOG, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
doorServo.attach(SERVO_PIN);
Wire.begin(16, 17); // SDA, SCL
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Home Init");
delay(2000);
lcd.clear();
u8g2.begin();
timeClient.begin();
}
void loop() {
Blynk.run();
timeClient.update();
float h = dht.readHumidity();
float t = dht.readTemperature();
int gas = digitalRead(MQ2_PIN);
int motion = digitalRead(PIR_PIN);
int ldrValue = analogRead(LDR_ANALOG);
// Distance using Ultrasonic
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
// Light control via LDR
digitalWrite(LED_PIN, ldrValue > 2000);
Blynk.virtualWrite(V6, ldrValue > 2000);
// Fan control via temperature
digitalWrite(FAN_PIN, t > 30);
// Servo control for door
doorServo.write(motion ? 90 : 0);
// === RGB LED + Buzzer Logic ===
bool isTempHigh = t > 30;
bool isHumHigh = h > 60;
if (isTempHigh && isHumHigh) {
// RED: Both high
digitalWrite(RGB_R, HIGH);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, LOW);
digitalWrite(BUZZER_PIN, HIGH);
} else if (!isTempHigh && !isHumHigh) {
// GREEN: Both normal
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, HIGH);
digitalWrite(RGB_B, LOW);
digitalWrite(BUZZER_PIN, LOW);
} else {
// BLUE: One high
digitalWrite(RGB_R, LOW);
digitalWrite(RGB_G, LOW);
digitalWrite(RGB_B, HIGH);
digitalWrite(BUZZER_PIN, LOW);
}
// === LCD Output ===
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(t);
lcd.print(" H:"); lcd.print(h);
lcd.setCursor(0, 1);
lcd.print("G:"); lcd.print(gas ? "Safe" : "Alert");
lcd.print(" D:"); lcd.print((int)distance);
// === OLED Output ===
String formattedTime = timeClient.getFormattedTime();
String doorStatus = motion ? "Door: Open" : "Door: Closed";
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.drawStr(0, 12, "Smart Home");
u8g2.drawStr(0, 30, doorStatus.c_str());
u8g2.drawStr(0, 48, formattedTime.c_str());
u8g2.sendBuffer();
// === Blynk Update ===
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V2, gas);
Blynk.virtualWrite(V3, ldrValue);
Blynk.virtualWrite(V4, distance);
Blynk.virtualWrite(V5, motion);
delay(2000);
}