148 lines
4.2 KiB
C++
148 lines
4.2 KiB
C++
#include "DHT.h"
|
|
#include <WiFi.h>
|
|
#include <Firebase_ESP_Client.h>
|
|
#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
|
|
} |