commit 40703851e3afc9b55d690ffc414eace84bcada3b Author: Krisnance Date: Fri Aug 16 13:31:09 2024 +0700 Kontrol Suhu Kopi diff --git a/Kontrol_Suhu_Kopi b/Kontrol_Suhu_Kopi new file mode 100644 index 0000000..c872a3d --- /dev/null +++ b/Kontrol_Suhu_Kopi @@ -0,0 +1,246 @@ +#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; +}