#define BLYNK_AUTH_TOKEN "VC1vughjM7vsF50JrZ52btxtE35SmEdU" #define BLYNK_TEMPLATE_ID "TMPL6nUJWUBf2" #define BLYNK_TEMPLATE_NAME "Pemantauan Kandang" #include // Library untuk koneksi WiFi #include #include #include "DHTesp.h" #include #define DHTPIN 2 // Pin data DHT11 terhubung ke pin GPIO2 (D4) pada ESP8266 #define DHTTYPE DHTesp::DHT11 // Tipe sensor DHT11 DHTesp dht; LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD: 0x27, Jumlah kolom: 16, Jumlah baris: 2 const int Sensor = A0; const int BuzzerPin = 14; // Pin GPIO untuk mengendalikan buzzer const int RelayPin = 12; // Pin GPIO untuk mengendalikan relay const int RelayPinKipas = 13; // Pin GPIO untuk mengendalikan relay kipas float voltage = 5.0; // Tegangan referensi ADC (Volt) float ppmThreshold = 20; // Ambang batas ppm float temperatureThreshold = 30; // Ambang batas suhu // Pengaturan WiFi char ssid[] = "Izza"; char password[] = "izzaismi123"; // Token Blynk char auth[] = BLYNK_AUTH_TOKEN; bool manualOffBuzzer = false; // Status manual off untuk buzzer bool manualOffRelay = false; // Status manual off untuk relay bool manualOffRelayKipas = false; // Status manual off untuk relay kipas bool manualControlKipas = false; // Kontrol manual dari Blynk untuk kipas bool manualControlRelay = false; // Kontrol manual dari Blynk untuk relay void setup() { Serial.begin(115200); Serial.println("Sistem Monitor Udara Mulai..."); lcd.init(); // Inisialisasi LCD lcd.backlight(); // Nyalakan backlight LCD pinMode(A0, INPUT); pinMode(BuzzerPin, OUTPUT); // Atur pin buzzer sebagai output pinMode(RelayPin, OUTPUT); // Atur pin relay sebagai output pinMode(RelayPinKipas, OUTPUT); // Atur pin relay kipas sebagai output dht.setup(DHTPIN, DHTTYPE); // Menghubungkan ke jaringan WiFi Serial.println("Menghubungkan ke WiFi..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Menghubungkan"); lcd.setCursor(0, 1); lcd.print("ke WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Mencoba terhubung ke WiFi..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Mencoba"); lcd.setCursor(0, 1); lcd.print("terhubung..."); } Serial.println("Terhubung ke WiFi!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Terhubung ke"); lcd.setCursor(0, 1); lcd.print("WiFi!"); // Inisialisasi koneksi Blynk Blynk.begin(auth, ssid, password, "blynk.cloud", 80); // Tambahkan penundaan untuk memberikan waktu sensor DHT untuk inisialisasi delay(5000); // 5 detik } void loop() { Blynk.run(); delay(dht.getMinimumSamplingPeriod()); float temperature = dht.getTemperature(); // Coba membaca lagi jika pembacaan awal gagal if (isnan(temperature)) { Serial.println("Failed to read from DHT sensor, retrying..."); delay(2000); // Tambahkan penundaan sebelum mencoba membaca lagi temperature = dht.getTemperature(); } if (isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Failed to read"); lcd.setCursor(0,1); lcd.print("from DHT sensor!"); return; } Blynk.virtualWrite(V0, temperature); lcd.clear(); lcd.setCursor(0,0); lcd.print("Suhu: "); lcd.print(temperature); lcd.print("C"); if (temperature > temperatureThreshold && !manualControlKipas) { //Blynk.email Blynk.logEvent("notifikasi","Suhu di atas 30 Derajat Celcius"); lcd.setCursor(0, 1); lcd.print("Status: Panas"); if (!manualOffRelayKipas) { digitalWrite(RelayPinKipas, HIGH); // Nyalakan kipas } } else { lcd.setCursor(0, 1); lcd.print("Status: Normal"); if (!manualControlKipas) { digitalWrite(RelayPinKipas, LOW); // Matikan kipas } } delay(2000); int dataSensor = analogRead(Sensor); float voltageValue = (dataSensor * voltage) / 1023.0; // Mengonversi nilai sensor menjadi tegangan (Volt) // Menghitung konsentrasi partikulat dalam ppm float ppmValue = voltageValue * 10.0; // Mengonversi tegangan menjadi mV // Disesuaikan dengan karakteristik sensor Anda (memerlukan kalibrasi) Blynk.virtualWrite(V2, ppmValue); lcd.clear(); // Membersihkan layar untuk tampilan selanjutnya lcd.setCursor(0, 0); // Posisi kursor LCD di baris 1 kolom 1 lcd.print("PPM: "); lcd.print(ppmValue); // Tampilkan nilai ppm // Memeriksa jika konsentrasi melebihi ambang batas lcd.setCursor(0, 1); // Posisi kursor LCD di baris 2 kolom 1 if (ppmValue > ppmThreshold && !manualControlRelay) { //Blynk.email Blynk.logEvent("notifikasi","Gas Amonia di atas 20 ppm"); lcd.print("Udara:Tidak Baik"); if (!manualOffRelay) { digitalWrite(RelayPin, HIGH); // Nyalakan relay } if (!manualOffBuzzer) { controlBuzzer(true); // Panggil fungsi untuk mengontrol buzzer (aktifkan) } } else { lcd.print("Udara:Baik"); if (!manualControlRelay) { digitalWrite(RelayPin, LOW); // Matikan relay } controlBuzzer(false); // Panggil fungsi untuk mengontrol buzzer (matikan) } delay(2000); } void controlBuzzer(bool state) { if (state) { tone(BuzzerPin, 2000); // Menghasilkan bunyi buzzer pada frekuensi 2000Hz } else { noTone(BuzzerPin); // Pastikan bunyi buzzer dimatikan sepenuhnya } } // Fungsi untuk mematikan buzzer secara manual void manualOffBuzzerFunction() { manualOffBuzzer = true; controlBuzzer(false); } // Fungsi untuk mematikan relay secara manual void manualOffRelayFunction() { manualOffRelay = true; digitalWrite(RelayPin, LOW); } // Fungsi untuk mematikan relay kipas secara manual void manualOffRelayKipasFunction() { manualOffRelayKipas = true; digitalWrite(RelayPinKipas, LOW); } // Fungsi untuk menghidupkan kembali relay dan buzzer secara manual void manualOnFunctions() { manualOffBuzzer = false; manualOffRelay = false; manualOffRelayKipas = false; } // Blynk virtual write functions BLYNK_WRITE(V1) { manualControlKipas = param.asInt(); if (manualControlKipas) { digitalWrite(RelayPinKipas, LOW); // Matikan kipas jika kontrol manual aktif } } BLYNK_WRITE(V3) { manualControlRelay = param.asInt(); if (manualControlRelay) { digitalWrite(RelayPin, LOW); // Matikan relay jika kontrol manual aktif } }