#include "DHT.h" #include #include #include "addons/TokenHelper.h" #include "addons/RTDBHelper.h" // ======= KONFIGURASI WIFI ======= #define WIFI_SSID "flame" #define WIFI_PASSWORD "Nisa1234." // ======= KONFIGURASI FIREBASE ======= #define API_KEY "AIzaSyBWdmHcBVtmkZ8Eeg5aaLF9nmsiL47MXaI" #define DATABASE_URL "https://deteksi-kebakaran-berbas-915bd-default-rtdb.firebaseio.com/" #define USER_EMAIL "esp32@device.com" #define USER_PASSWORD "123456" // ======= DEFINISI PIN ======= #define DHTPIN 5 #define DHTTYPE DHT11 #define FLAME_PIN 35 #define BUZZER_PIN 2 #define MQ_PIN 34 #define RELAY_PUMP 19 #define RELAY_EXHAUST 23 // ======= BATAS DETEKSI ======= #define SUHU_THRESHOLD 30.0 #define GAS_THRESHOLD 100 // ======= OBJEK ======= DHT dht(DHTPIN, DHTTYPE); FirebaseData fbdo; FirebaseAuth auth; FirebaseConfig config; bool signupOK = false; unsigned long sendDataPrevMillis = 0; unsigned long timerDelay = 2000; void setup() { Serial.begin(115200); pinMode(FLAME_PIN, INPUT); pinMode(BUZZER_PIN, OUTPUT); pinMode(RELAY_PUMP, OUTPUT); pinMode(RELAY_EXHAUST, OUTPUT); digitalWrite(RELAY_PUMP, LOW); digitalWrite(RELAY_EXHAUST, LOW); digitalWrite(BUZZER_PIN, LOW); dht.begin(); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(300); } Serial.println(); Serial.println("Connected to WiFi"); config.api_key = API_KEY; config.database_url = DATABASE_URL; auth.user.email = USER_EMAIL; auth.user.password = USER_PASSWORD; if (Firebase.signUp(&config, &auth, USER_EMAIL, USER_PASSWORD)) { Serial.println("Firebase SignUp OK"); signupOK = true; } else { Serial.printf("Signup error: %s\n", config.signer.signupError.message.c_str()); signupOK = true; } config.token_status_callback = tokenStatusCallback; Firebase.begin(&config, &auth); Firebase.reconnectWiFi(true); Serial.println("Sistem Deteksi Kebakaran Siap"); delay(2000); } void loop() { float suhu = dht.readTemperature(); float kelembapan = dht.readHumidity(); if (isnan(suhu) || isnan(kelembapan)) { Serial.println("Gagal membaca dari sensor DHT!"); return; } int statusApi = digitalRead(FLAME_PIN); bool apiTerdeteksi = (statusApi == LOW); // LOW = api terdeteksi // Baca sensor gas (MQ-2) int totalGas = 0; for (int i = 0; i < 10; i++) { totalGas += analogRead(MQ_PIN); delay(5); } int avgGas = totalGas / 10; // === SERIAL MONITOR === Serial.print("Suhu: "); Serial.print(suhu); Serial.print("°C | Kelembapan: "); Serial.print(kelembapan); Serial.print("% | Api: "); Serial.print(apiTerdeteksi ? "TERDETEKSI" : "AMAN"); Serial.print(" | Gas: "); Serial.println(avgGas); // === LOGIKA BUZZER === if (avgGas > 100) { digitalWrite(BUZZER_PIN, HIGH); // Gas berbahaya, buzzer nyala } else { digitalWrite(BUZZER_PIN, LOW); // Aman, buzzer mati } // === LOGIKA POMPA & KIPAS === if (suhu > 35 && apiTerdeteksi) { digitalWrite(RELAY_PUMP, HIGH); // Aktifkan waterpump digitalWrite(RELAY_EXHAUST, HIGH); // Aktifkan kipas Serial.println("Bahaya: Suhu tinggi & api terdeteksi, pompa & kipas ON"); } else { digitalWrite(RELAY_PUMP, LOW); // Matikan waterpump digitalWrite(RELAY_EXHAUST, LOW); // Matikan kipas Serial.println("Aman: Pompa & kipas dimatikan"); } // === KIRIM KE FIREBASE === if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > timerDelay || sendDataPrevMillis == 0)) { sendDataPrevMillis = millis(); Firebase.RTDB.setFloat(&fbdo, "/sensor_data/suhu", suhu); Firebase.RTDB.setFloat(&fbdo, "/sensor_data/kelembapan", kelembapan); Firebase.RTDB.setBool(&fbdo, "/sensor_data/api_terdeteksi", apiTerdeteksi); Firebase.RTDB.setInt(&fbdo, "/sensor_data/gas_value", avgGas); Firebase.RTDB.setBool(&fbdo, "/sensor_data/pump_active", digitalRead(RELAY_PUMP)); Firebase.RTDB.setBool(&fbdo, "/sensor_data/exhaust_active", digitalRead(RELAY_EXHAUST)); Firebase.RTDB.setBool(&fbdo, "/sensor_data/buzzer_active", digitalRead(BUZZER_PIN)); Serial.println("Data dikirim ke Firebase"); } delay(2000); // Delay loop 2 detik }