#define BLYNK_TEMPLATE_ID "TMPL68qanz-W7" // Template ID
#define BLYNK_TEMPLATE_NAME "smart home esp32" // Template Name
#define BLYNK_PRINT Serial
#include <WiFi.h> // Use WiFi.h for ESP32
#include <BlynkSimpleEsp32.h> // Use BlynkSimpleEsp32.h for ESP32
#include <ESP32Servo.h>
// Token Blynk dan informasi WiFi
char auth[] = "mtOPELEmIJ1MiXjvkVf3ZKiDM3ml1Dci"; // Token autentikasi Blynk
char ssid[] = "Wokwi-GUEST"; // SSID WiFi untuk Wokwi
char pass[] = ""; // Tidak perlu password untuk Wokwi-GUEST
Servo pagarServo;
int pos = 0;
const int gasPin = 5; // Sensor Gas pada GPIO 5 (D1 pada NodeMCU ESP8266)
const int pirPin = 4; // Sensor PIR pada GPIO 4 (D2 pada NodeMCU ESP8266)
const int kipasPin = 0; // Relay Kipas pada GPIO 0 (D3 pada NodeMCU ESP8266)
const int servoPin = 14; // Servo untuk Pagar pada GPIO 14 (D5 pada NodeMCU ESP8266)
const int buzzerPin = 12; // Buzzer pada GPIO 12 (D6 pada NodeMCU ESP8266)
const int lampuPin = 13; // Relay Lampu pada GPIO 13 (D7 pada NodeMCU ESP8266)
bool gasDetected = false;
bool motionDetected = false;
BlynkTimer timer;
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
pinMode(gasPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(kipasPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(lampuPin, OUTPUT); // Relay untuk Lampu
pagarServo.attach(servoPin);
digitalWrite(kipasPin, LOW); // Kipas mati saat awal
pagarServo.write(0); // Servo posisi tertutup saat awal
digitalWrite(buzzerPin, LOW); // Buzzer mati saat awal
digitalWrite(lampuPin, LOW); // Lampu mati saat awal
timer.setInterval(1000L, checkSensors);
}
// Fungsi kontrol lampu dari Blynk
BLYNK_WRITE(V3) { // Kontrol lampu melalui Virtual Pin V3
int lampuState = param.asInt(); // Baca nilai dari Blynk (0 atau 1)
if (lampuState == 1) {
digitalWrite(lampuPin, HIGH); // Nyalakan lampu
Serial.println("Lampu dinyalakan melalui Blynk.");
} else {
digitalWrite(lampuPin, LOW); // Matikan lampu
Serial.println("Lampu dimatikan melalui Blynk.");
}
}
void checkSensors() {
// Baca sensor gas
gasDetected = digitalRead(gasPin);
// Baca sensor PIR
motionDetected = digitalRead(pirPin);
if (gasDetected) {
Serial.println("Gas terdeteksi! Menyalakan kipas dan alarm.");
digitalWrite(kipasPin, HIGH); // Nyalakan kipas
digitalWrite(buzzerPin, HIGH); // Nyalakan buzzer (alarm)
Blynk.logEvent("gas_detected", "Bahaya! Gas terdeteksi!");
} else {
digitalWrite(kipasPin, LOW); // Matikan kipas
digitalWrite(buzzerPin, LOW); // Matikan buzzer
}
if (motionDetected) {
Serial.println("Gerakan terdeteksi! Membuka pagar.");
bukaPagar(); // Buka pagar
Blynk.logEvent("motion_detected", "Gerakan terdeteksi, pagar terbuka.");
} else {
tutupPagar(); // Tutup pagar
}
// Update status ke Blynk
Blynk.virtualWrite(V1, gasDetected); // Update status gas ke Blynk
Blynk.virtualWrite(V2, motionDetected); // Update status PIR ke Blynk
}
void bukaPagar() {
for (pos = 0; pos <= 90; pos += 1) {
pagarServo.write(pos);
delay(15);
}
}
void tutupPagar() {
for (pos = 90; pos >= 0; pos -= 1) {
pagarServo.write(pos);
delay(15);
}
}
void loop() {
Blynk.run();
timer.run();
}