TKK_Nisa_E32221364/esp32.ino

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
}