#include #include #include #define DHTPIN D5 // Pin data sensor DHT11 terhubung ke pin D5 #define DHTTYPE DHT11 // Tipe sensor DHT11 #define USERNAME "krisnance" // Username Thinger.io #define DEVICE_ID "esp82" // Device ID #define DEVICE_CREDENTIAL "OfI-n+i2y$$i34y9" // Device Credential #define SSID "itsyourboiman" // Nama WiFi #define SSID_PASSWORD "pelerquda" // Password WiFi #define BUCKET_ID "database" // ID Data Bucket const long interval = 5000; // Waktu maksimum untuk terhubung ke WiFi (dalam milidetik) unsigned long previousMillis = 0; const int mq2Pin = A0; // Pin A0 digunakan untuk membaca data analog dari sensor MQ-2 const int buzzerPin = D0; // Pin D0 digunakan untuk mengendalikan buzzer const int relayPin1 = D1; // Pin D1 digunakan untuk mengendalikan relay 1 (Fan) const int relayPin2 = D2; // Pin D2 digunakan untuk mengendalikan relay 2 const int relayPin4 = D4; // Pin D4 digunakan untuk mengendalikan relay 4 (Lampu) DHT dht(DHTPIN, DHTTYPE); ThingerESP8266 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); unsigned long lastNotificationTime1 = 0; const unsigned long notificationInterval = 60000; unsigned long lastBuzzerMillis = 0; const unsigned long buzzerOnTime = 500; const unsigned long buzzerOffTime = 500; unsigned long buzzerStartTime = 0; int buzzerState = LOW; bool smokeDetected = false; bool manualFanControl = false; bool manualLampControl = false; bool manualBuzzerControl = false; bool modeOtomatis = true; float Ro = 10; // Nilai awal Ro, akan diupdate setelah kalibrasi const float RL = 10.0; // Nilai resistor load dalam kilo ohm const float Vcc = 5.0; // Tegangan suplai void setup() { Serial.begin(9600); // Inisialisasi komunikasi serial dengan kecepatan 9600 bps thing.add_wifi(SSID, SSID_PASSWORD); Serial.print("Connecting to "); Serial.println(SSID); WiFi.begin(SSID, SSID_PASSWORD); while (WiFi.status() != WL_CONNECTED && millis() - previousMillis < interval) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected."); pinMode(buzzerPin, OUTPUT); // Mengatur pin buzzer sebagai output pinMode(relayPin1, OUTPUT); // Mengatur pin relay 1 sebagai output pinMode(relayPin2, OUTPUT); // Mengatur pin relay 2 sebagai output pinMode(relayPin4, OUTPUT); // Mengatur pin relay 4 sebagai output dht.begin(); // Inisialisasi sensor DHT // Kalibrasi sensor MQ2 dan dapatkan nilai Ro Ro = calibrateSensor(); Serial.print("Nilai Ro: "); Serial.println(Ro); // Resource untuk membaca data sensor thing["sensorData"] >> [](pson& out) { float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); int sensorValue = analogRead(mq2Pin); bool fanStatus = digitalRead(relayPin1) == LOW; // LOW berarti relay aktif bool lampStatus = digitalRead(relayPin4) == LOW; // LOW berarti relay aktif out["Suhu"] = temperature; out["Kelembapan"] = humidity; out["Asap"] = sensorValue; out["Fan"] = fanStatus; out["Lampu"] = lampStatus; }; // Resource untuk mengendalikan Fan thing["Fan"] << [](pson& in) { if (in.is_empty()) { in = digitalRead(relayPin1) == LOW; // Mengirim status Fan saat ini } else { manualFanControl = true; modeOtomatis = false; digitalWrite(relayPin1, in ? LOW : HIGH); // Mengatur status Fan digitalWrite(relayPin2, in ? LOW : HIGH); // Mengatur status Fan Serial.print("Fan manual control set to: "); Serial.println(in ? "ON" : "OFF"); } }; // Resource untuk mengendalikan Lampu thing["Lampu"] << [](pson& in) { if (in.is_empty()) { in = digitalRead(relayPin4) == LOW; // Mengirim status Lampu saat ini } else { manualLampControl = true; modeOtomatis = false; digitalWrite(relayPin4, in ? LOW : HIGH); // Mengatur status Lampu Serial.print("Lampu manual control set to: "); Serial.println(in ? "ON" : "OFF"); } }; // Resource untuk mengendalikan Buzzer thing["Buzzer"] << [](pson& in) { if (in.is_empty()) { in = manualBuzzerControl; // Mengirim status Buzzer saat ini } else { manualBuzzerControl = in; if (manualBuzzerControl) { buzzerStartTime = millis(); digitalWrite(buzzerPin, HIGH); Serial.println("Buzzer diaktifkan secara manual selama 5 detik"); } else { digitalWrite(buzzerPin, LOW); Serial.println("Buzzer dimatikan secara manual"); } } }; // Resource untuk mengendalikan mode otomatis thing["ModeOtomatis"] << [](pson& in) { if (in.is_empty()) { in = modeOtomatis; // Mengirim status Mode Otomatis saat ini } else { modeOtomatis = in; manualFanControl = !modeOtomatis; manualLampControl = !modeOtomatis; Serial.print("Mode Otomatis "); Serial.println(modeOtomatis ? "diaktifkan" : "dimatikan"); } }; // Resource untuk mendapatkan status mode otomatis thing["getModeOtomatis"] >> [](pson& out) { out["modeOtomatis"] = modeOtomatis; }; } void loop() { unsigned long currentTime = millis(); thing.handle(); int sensorValue = analogRead(mq2Pin); // Membaca nilai analog dari sensor MQ-2 // Baca suhu dan kelembapan dari sensor DHT11 float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); if (isnan(humidity) || isnan(temperature)) { Serial.println("Gagal membaca dari sensor DHT11!"); return; } Serial.print("Suhu: "); Serial.print(temperature); Serial.print(" C, Kelembapan: "); Serial.print(humidity); Serial.println("%"); if (modeOtomatis) { // Aksi ketika suhu di atas 30 derajat Celsius if (temperature > 30) { digitalWrite(relayPin1, LOW); // Menyalakan relay 1 (Fan) digitalWrite(relayPin2, LOW); // Menyalakan relay 2 (Fan) Serial.println("Suhu di atas 30 C, Relay 1 dan Relay 2 (Fan) dinyalakan"); } else { digitalWrite(relayPin1, HIGH); // Matikan relay 1 (Fan) digitalWrite(relayPin2, HIGH); // Matikan relay 2 (Fan) } // Aksi ketika kelembapan di bawah 70% if (humidity < 70) { digitalWrite(relayPin4, LOW); // Menyalakan relay 4 (Lampu) Serial.println("Kelembapan di bawah 70%, Relay 4 (Lampu) dinyalakan"); } else { digitalWrite(relayPin4, HIGH); // Matikan relay 4 (Lampu) } } // Ambang batas untuk mendeteksi asap int smokeThreshold = 400; if (sensorValue >= smokeThreshold) { Serial.println("Asap Terdeteksi!"); smokeDetected = true; // Logika untuk menyalakan buzzer if (currentTime - lastBuzzerMillis >= (buzzerState == HIGH ? buzzerOnTime : buzzerOffTime)) { buzzerState = !buzzerState; digitalWrite(buzzerPin, buzzerState); lastBuzzerMillis = currentTime; } // Mengirim Notifikasi Telegram dengan interval 1 menit if (lastNotificationTime1 == 0 || currentTime - lastNotificationTime1 >= notificationInterval) { thing.call_endpoint("telegram_bot"); lastNotificationTime1 = currentTime; } } else { smokeDetected = false; digitalWrite(buzzerPin, LOW); // Pastikan buzzer mati jika tidak ada asap } // Matikan buzzer setelah 5 detik jika diaktifkan secara manual if (manualBuzzerControl && (currentTime - buzzerStartTime >= 5000)) { manualBuzzerControl = false; digitalWrite(buzzerPin, LOW); Serial.println("Buzzer dimatikan setelah 5 detik"); } // Kirim data ke Data Bucket pson data; data["Suhu"] = temperature; data["Kelembapan"] = humidity; data["Asap"] = sensorValue; data["Fan"] = digitalRead(relayPin1) == LOW; // LOW berarti relay aktif data["Lampu"] = digitalRead(relayPin4) == LOW; // LOW berarti relay aktif thing.write_bucket(BUCKET_ID, data); delay(1000); // Delay sebelum pembacaan berikutnya } // Fungsi untuk kalibrasi sensor MQ2 dan mendapatkan nilai Ro float calibrateSensor() { float val = 0; for (int i = 0; i < 100; i++) { val += getSensorResistance(); delay(50); } val = val / 100; // Rata-rata dari 100 pengukuran return val / 9.83; // 9.83 adalah Rs/Ro di udara bersih (untuk asap) } // Fungsi untuk mendapatkan nilai resistansi sensor MQ2 float getSensorResistance() { int analogValue = analogRead(mq2Pin); // Baca nilai analog float voltage = (analogValue / 1023.0) * Vcc; // Hitung tegangan float Rs = (Vcc - voltage) * RL / voltage; // Hitung Rs return Rs; }