#define BLYNK_TEMPLATE_ID "TMPL6vc2LXsDw"
#define BLYNK_TEMPLATE_NAME "Peringatan Gempa dan Kebakaran"
#define BLYNK_AUTH_TOKEN "B9QkKmFD1i3Q2mAg2K26NoifqNwqSoOz"
#include <Wire.h>
#include <WiFi.h>
#include <MPU6050_light.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Blynk input manual
int manualBuzzer = 0;
int manualServo = 0;
// Objek
MPU6050 mpu(Wire);
BlynkTimer timer;
Servo pintuServo;
// Pin
const int pinGas = 34; // MQ-2 ke pin ADC ESP32
const int pinBuzzer = 27; // Buzzer
const int pinServo = 18; // Servo
// Threshold
const int gasThreshold = 400;
const float accelThreshold = 2.5;
// Setup
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
Wire.begin();
mpu.begin();
mpu.calcOffsets(true, true);
pinMode(pinGas, INPUT);
pinMode(pinBuzzer, OUTPUT);
digitalWrite(pinBuzzer, LOW);
pintuServo.attach(pinServo);
pintuServo.write(0); // posisi awal
timer.setInterval(1000L, bacaSensor);
}
// Loop
void loop() {
Blynk.run();
timer.run();
}
// Fungsi pembacaan sensor
void bacaSensor() {
mpu.update();
float accTotal = sqrt(
pow(mpu.getAccX(), 2) +
pow(mpu.getAccY(), 2) +
pow(mpu.getAccZ(), 2)
);
int gasValue = analogRead(pinGas);
// Asumsi konversi gasValue (0-1023) ke PPM
int ppmGas = (gasValue * 500.0) / 1024; // Misalnya, 1024 adalah ADC penuh
bool asapBahaya = gasValue > gasThreshold;
bool gempaBahaya = accTotal > accelThreshold;
// Kirim status ke Blynk
Blynk.virtualWrite(V0, gempaBahaya ? "Gempa Terdeteksi!" : "Aman");
Blynk.virtualWrite(V1, asapBahaya ? "Asap Terdeteksi!" : "Aman");
// Kirim pembacaan sensor ke Blynk
Blynk.virtualWrite(V4, ppmGas); // Tampilkan nilai PPM gas di Virtual Pin 4
Blynk.virtualWrite(V5, accTotal); // Tampilkan nilai getaran (total akselerasi) di Virtual Pin 5
// Jika bahaya, override manual control
if (asapBahaya || gempaBahaya) {
digitalWrite(pinBuzzer, HIGH);
pintuServo.write(90); // buka pintu
} else {
// Manual control jika aman
digitalWrite(pinBuzzer, manualBuzzer ? HIGH : LOW);
pintuServo.write(manualServo);
}
// Debug
Serial.print("Gempa: "); Serial.print(accTotal, 2); // Cetak nilai akselerasi
Serial.print(" | Asap: "); Serial.println(gasValue); // Cetak nilai MQ-2
}
// Fungsi untuk menghitung PPM berdasarkan nilai ADC dari MQ-2
float calculatePPM(int gasValue) {
// Rumus atau konversi berdasarkan kalibrasi sensor yang sesuai
// Contoh rumus kasarnya, yang sebaiknya disesuaikan dengan kalibrasi sensormu
float ppm = gasValue * (100.0 / 1024); // Menghitung PPM dari nilai ADC
return ppm;
}
// Ambil kontrol manual dari Blynk
BLYNK_WRITE(V2) {
manualBuzzer = param.asInt();
}
BLYNK_WRITE(V3) {
manualServo = param.asInt();
}