// Smart Home System with ESP32
// Fitur: Sensor pintu (LDR), Gas MQ2, DHT22, LCD I2C, buzzer + LED, kontrol AC dan blower
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// === PIN DEFINISI ===
#define LDR_PIN 13 // Sensor pintu (input digital)
#define MQ2_PIN 34 // Sensor gas (input analog)
#define DHT_PIN 4 // Sensor suhu (digital)
#define BUZZER_PIN 25 // Buzzer
#define LED1 26 // Indikator bahaya
#define LED2 27 // Kontrol AC relay
#define LED3 14 // Kontrol blower relay
// === DHT ===
#define DHTTYPE DHT22
DHT dht(DHT_PIN, DHTTYPE);
// === LCD I2C ===
LiquidCrystal_I2C lcd(0x27, 16, 2);
// === Telegram ===
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOTtoken "7148350230:AAH8pSCsd02LG0VoC079B5SYlSS-lmkrrm8"
#define CHAT_ID "518947846"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// === Variabel Global ===
bool blowerActive = false;
bool blowerManualOverride = false;
bool doorAlertSent = false;
bool gasAlertSent = false;
bool dangerAlertSent = false;
// === Timer untuk gas level sedang ===
unsigned long lastGasBeep = 0;
const unsigned long gasBeepInterval = 3000; // 3 detik
void kirimPesanTelegram(String pesan) {
if (WiFi.status() == WL_CONNECTED) {
bot.sendMessage(CHAT_ID, pesan, "Markdown");
}
}
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Home Ready");
delay(2000);
// === Koneksi Wi-Fi ===
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
client.setInsecure();
Serial.println("WiFi Connected");
}
void loop() {
bool isDoorOpen = digitalRead(LDR_PIN) == HIGH;
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gasVal = analogRead(MQ2_PIN);
if (isnan(temp) || isnan(hum)) return;
// === PRIORITAS 1: PINTU TERBUKA ===
if (isDoorOpen) {
digitalWrite(LED2, LOW); // Matikan AC
digitalWrite(LED3, LOW); // Matikan blower
lcd.setCursor(0, 0);
lcd.print("PINTU TERBUKA! ");
lcd.setCursor(0, 1);
lcd.print("AC & Blower OFF ");
if (temp > 27 && !doorAlertSent) {
tone(BUZZER_PIN, 800, 200);
digitalWrite(LED1, HIGH);
delay(200);
digitalWrite(LED1, LOW);
delay(3000);
kirimPesanTelegram("Pintu Terbuka! Suhu di atas 27C.");
doorAlertSent = true;
}
return;
}
// === PRIORITAS 2: DETEKSI GAS ===
bool gasAman = (gasVal < 1000);
if (!gasAman) {
if ((gasVal > 2000 || (blowerActive && gasVal > 1000)) && !dangerAlertSent) {
// Level gas berbahaya
digitalWrite(LED3, HIGH); // Nyalakan blower
tone(BUZZER_PIN, 2000, 500);
digitalWrite(LED1, HIGH);
lcd.setCursor(0, 0);
lcd.print("BAHAYA GAS!!! ");
lcd.setCursor(0, 1);
lcd.print("Blower aktif ");
delay(2000);
kirimPesanTelegram("BAHAYA GAS!!! Blower diaktifkan.");
dangerAlertSent = true;
}
else if (gasVal >= 1000 && gasVal <= 2000 && !gasAlertSent) {
// Level gas sedang: buzzer bunyi setiap 3 detik
if (millis() - lastGasBeep >= gasBeepInterval) {
tone(BUZZER_PIN, 1000, 300);
digitalWrite(LED1, HIGH);
delay(300);
digitalWrite(LED1, LOW);
lastGasBeep = millis();
}
kirimPesanTelegram("Peringatan! Gas tinggi terdeteksi.");
gasAlertSent = true;
}
} else {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED3, LOW);
blowerActive = false;
dangerAlertSent = false;
gasAlertSent = false;
}
// === PRIORITAS 3: KONTROL SUHU ===
if (temp > 35) { // Suhu sangat panas
digitalWrite(LED2, HIGH); // AC nyala
digitalWrite(LED3, HIGH); // Blower nyala
lcd.setCursor(0, 0);
lcd.print("SUHU EKSTREM! ");
lcd.setCursor(0, 1);
lcd.print("AC+Blower ON ");
tone(BUZZER_PIN, 1500, 200);
delay(300);
kirimPesanTelegram("Suhu sangat tinggi! AC dan blower diaktifkan.");
}
else if (temp > 30) { // Suhu panas
digitalWrite(LED2, HIGH); // AC nyala
digitalWrite(LED3, LOW); // Blower mati
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temp, 1);
lcd.print((char)223);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("AC aktif ");
}
else { // Suhu normal
digitalWrite(LED2, LOW); // AC mati
digitalWrite(LED3, LOW); // Blower mati
lcd.setCursor(0, 0);
lcd.print("Suhu Normal: ");
lcd.setCursor(0, 1);
lcd.print(temp, 1);
lcd.print((char)223);
lcd.print("C ");
}
delay(100);
}