// #define BLYNK_TEMPLATE_ID "TMPL6kDBnhdEs"
// #define BLYNK_TEMPLATE_NAME "Smart Home"
// #define BLYNK_AUTH_TOKEN "_rM5KIJejNwg5VtUH5r_v3DR3xsJwB3e"
#define BLYNK_TEMPLATE_ID "TMPL6cx1Z0uT9"
#define BLYNK_TEMPLATE_NAME "Smart Switch"
#define BLYNK_AUTH_TOKEN "DgQf_gjaPPwGDB3_YCkxhQcZQ07wES6E"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// DHT sensor
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Potentiometer (gas and flame sensor simulation)
#define GASPIN 34
#define FLAMEPIN 35
// Relay pin
#define RELAYPIN 13
// Speaker dan LED
#define SPEAKERPIN 32
#define LED_INDICATOR_PIN 25
#define LED_LAMP1_PIN 26
#define LED_LAMP2_PIN 27
// Blynk virtual pins
#define VPIN_TEMPERATURE V1
#define VPIN_HUMIDITY V2
#define VPIN_GAS V3
#define VPIN_FLAME V4
#define VPIN_RELAY V5
#define VPIN_LAMP1 V6
#define VPIN_LAMP2 V7
// Timer
BlynkTimer timer;
bool useProject1 = true; // Flag to switch between projects
void switchProject() {
if (useProject1) {
Blynk.config(BLYNK_AUTH_TOKEN);
Blynk.connect();
useProject1 = false;
} else {
Blynk.config(BLYNK_AUTH_TOKEN);
Blynk.connect();
useProject1 = true;
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAYPIN, OUTPUT);
pinMode(GASPIN, INPUT);
pinMode(FLAMEPIN, INPUT);
pinMode(SPEAKERPIN, OUTPUT);
pinMode(LED_INDICATOR_PIN, OUTPUT);
pinMode(LED_LAMP1_PIN, OUTPUT);
pinMode(LED_LAMP2_PIN, OUTPUT);
digitalWrite(RELAYPIN, LOW);
digitalWrite(SPEAKERPIN, LOW);
digitalWrite(LED_INDICATOR_PIN, LOW);
digitalWrite(LED_LAMP1_PIN, LOW);
digitalWrite(LED_LAMP2_PIN, LOW);
lcd.init(); // Initialize the LCD
lcd.backlight(); // Turn on the LCD backlight
// Welcome message with scrolling text
lcd.setCursor(0, 0);
lcd.print("Welcome to Smart Home");
// lcd.setCursor(0, 1);
// lcd.print("Home");
delay(2000); // Delay to show the full message initially
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft(); // Scroll text to the left
delay(300); // Delay 0.3 second between scroll steps
}
lcd.clear();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
lcd.setCursor(0, 0);
lcd.print("Connecting to");
lcd.setCursor(0, 1);
lcd.print("WiFi...");
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft(); // Scroll text to the left
delay(300); // Delay 0.3 second between scroll steps
}
lcd.clear();
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
lcd.setCursor(0, 0);
lcd.print("Connected to WiFi");
for (int i = 0; i < 16; i++) {
lcd.scrollDisplayLeft(); // Scroll text to the left
delay(300); // Delay 0.3 second between scroll steps
}
lcd.clear();
// Blynk.begin(BLYNK_AUTH_TOKEN, ssid, password);
// Blynk.begin(BLYNK_AUTH_TOKEN1, ssid, password);
Blynk.config(BLYNK_AUTH_TOKEN);
Blynk.connect();
// Set the timer to switch between projects every 30 seconds (adjust as needed)
timer.setInterval(30000L, switchProject);
}
BLYNK_WRITE(VPIN_LAMP1) {
int pinValue = param.asInt();
digitalWrite(LED_LAMP1_PIN, pinValue);
}
BLYNK_WRITE(VPIN_LAMP2) {
int pinValue = param.asInt();
digitalWrite(LED_LAMP2_PIN, pinValue);
}
void loop() {
Blynk.run();
timer.run();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int gasValue = analogRead(GASPIN);
int flameValue = analogRead(FLAMEPIN);
// Limits the potentiometer value in the range 0-1000
gasValue = constrain(gasValue, 0, 1023);
flameValue = constrain(flameValue, 0, 1023);
Blynk.virtualWrite(VPIN_TEMPERATURE, temperature);
Blynk.virtualWrite(VPIN_HUMIDITY, humidity);
Blynk.virtualWrite(VPIN_GAS, gasValue);
Blynk.virtualWrite(VPIN_FLAME, flameValue);
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("% ");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gas: ");
lcd.print(gasValue);
lcd.print("ppm ");
lcd.setCursor(0, 1);
lcd.print("Flame: ");
lcd.print(flameValue);
lcd.print("ppm ");
delay(1000);
lcd.clear();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" °C, Humidity: ");
Serial.print(humidity);
Serial.print(" %, Gas: ");
Serial.print(gasValue);
Serial.print(", Flame: ");
Serial.println(flameValue);
if (gasValue > 1000 || flameValue > 1000) {
digitalWrite(RELAYPIN, HIGH); // Turn on relay
Blynk.virtualWrite(VPIN_RELAY, 1);
tone(SPEAKERPIN, 1000); // Activate speaker with 1000 Hz tone
digitalWrite(LED_INDICATOR_PIN, HIGH); // Turn on indicator LED
lcd.setCursor(0, 0);
lcd.print("Alert! Gas/Fire");
} else {
digitalWrite(RELAYPIN, LOW); // Turn off relay
Blynk.virtualWrite(VPIN_RELAY, 0);
noTone(SPEAKERPIN); // Deactivate speaker
digitalWrite(LED_INDICATOR_PIN, LOW); // Turn off indicator LED
lcd.print("Normal! Gas/Fire");
}
delay(2000);
lcd.clear();
}
// Function to control relays from Blynk
BLYNK_WRITE(VPIN_RELAY) {
int relayState = param.asInt();
if (relayState == 1) {
digitalWrite(RELAYPIN, HIGH);
lcd.setCursor(0, 0);
lcd.print("Relay On ");
} else {
digitalWrite(RELAYPIN, LOW);
lcd.setCursor(0, 0);
lcd.print("Relay Off ");
}
}