#include #include #include #define LORA_SS 5 #define LORA_RST 14 #define LORA_DIO0 2 #define RELAY_PIN 27 #define FIRE_SENSOR_PIN 33 #define MQ2_SENSOR_PIN 26 #define DHTPIN 4 #define DHTTYPE DHT11 #define SOIL_SENSOR_PIN 25 DHT dht(DHTPIN, DHTTYPE); bool pengirimanAktif = true; bool relayAktifKarenaKebakaran = false; int lastRelayState = LOW; unsigned long lastSendTime = 0; const unsigned long interval = 1000; void setup() { delay(3000); Serial.begin(115200); while (!Serial) ; Serial.println("Memulai setup..."); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); Serial.println("Relay diset LOW"); pinMode(FIRE_SENSOR_PIN, INPUT); pinMode(MQ2_SENSOR_PIN, INPUT); dht.begin(); LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); delay(1000); if (!LoRa.begin(433E6)) { Serial.println("Gagal memulai LoRa"); while (1) ; } Serial.println("LoRa siap mengirim"); } void loop() { if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd == "pause") { pengirimanAktif = false; Serial.println("Pengiriman LoRa dihentikan"); } else if (cmd == "resume") { pengirimanAktif = true; Serial.println("Pengiriman LoRa dilanjutkan"); } } int fireDigital = digitalRead(FIRE_SENSOR_PIN); int asapDigital = digitalRead(MQ2_SENSOR_PIN); float suhuC = dht.readTemperature(); int soilRaw = analogRead(SOIL_SENSOR_PIN); int kelembabanTanah = map(soilRaw, 1949, 4095, 100, 0); kelembabanTanah = constrain(kelembabanTanah, 0, 100); String statusApi = (fireDigital == LOW) ? "iya" : "tidak"; String statusAsap = (asapDigital == LOW) ? "iya" : "tidak"; bool suhuTinggi = suhuC > 40.0; String statusKebakaran = "tidak"; if (fireDigital == LOW && asapDigital == LOW && suhuTinggi) { statusKebakaran = "iya"; } else { statusKebakaran = "tidak"; } Serial.println("Sensor:"); Serial.println(" - Api: " + String(fireDigital == LOW ? "iya" : "tidak")); Serial.println(" - Asap: " + String(asapDigital == LOW ? "iya" : "tidak")); Serial.println(" - Suhu: " + String(suhuC, 1) + "C"); Serial.println(" - Tanah: " + String(kelembabanTanah) + "%"); if (statusKebakaran == "iya") { digitalWrite(RELAY_PIN, HIGH); relayAktifKarenaKebakaran = true; Serial.println("Kebakaran terdeteksi! Relay ON"); } else if (relayAktifKarenaKebakaran && fireDigital == HIGH) { Serial.println("Api padam"); delay(300); digitalWrite(RELAY_PIN, LOW); relayAktifKarenaKebakaran = false; Serial.println("Relay dimatikan otomatis setelah api padam"); } else { digitalWrite(RELAY_PIN, LOW); relayAktifKarenaKebakaran = false; Serial.println("Kondisi aman - Relay OFF"); } if (millis() - lastSendTime > interval) { lastSendTime = millis(); String apiStr = (fireDigital == LOW ? "iya" : "tidak"); String asapStr = (asapDigital == LOW ? "iya" : "tidak"); String suhuStr = isnan(suhuC) ? "nanC" : String(suhuC, 1) + "C"; String tanahStr = String(kelembabanTanah) + "%"; String relayStr = (digitalRead(RELAY_PIN) ? "ON" : "OFF"); String data = "api:" + apiStr + ",asap:" + asapStr + ",suhu:" + suhuStr + ",tanah:" + tanahStr + ",relay:" + relayStr; String statusGabungan = "Status: " + statusApi + " - Relay " + relayStr; if (pengirimanAktif) { kirimLoRa(data); delay(1000), kirimLoRa(statusGabungan); delay(1000); Serial.println("Data dikirim:\n" + data); Serial.println("Status dikirim:\n" + statusGabungan); } } if (pengirimanAktif) { kirimLoRa("kebakaran:" + statusKebakaran); delay(300); Serial.println("Status kebakaran dikirim: kebakaran:" + statusKebakaran); } delay(400); } void kirimLoRa(String pesan) { Serial.println("LoRa kirim:\n" + pesan); LoRa.beginPacket(); LoRa.print(pesan); LoRa.endPacket(); delay(100); }