From 9a1aabda21753dc610816a5b74e9826cbe920d87 Mon Sep 17 00:00:00 2001 From: rezainalvito Date: Tue, 11 Jun 2024 12:08:00 +0700 Subject: [PATCH] first commit --- Dapur_Pintar.ino | 323 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 Dapur_Pintar.ino diff --git a/Dapur_Pintar.ino b/Dapur_Pintar.ino new file mode 100644 index 0000000..02c3164 --- /dev/null +++ b/Dapur_Pintar.ino @@ -0,0 +1,323 @@ +#include +#include +#include +#include +#include +#include +#include +#include "MQ135.h" +#include +#include +#include +#include + +/* Your Soft AP WiFi Credentials */ +const char *ssid = "IoT Smart Kitchen"; // WiFi Name +const char* password = "1234567890"; // Password + +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 64 // OLED display height, in pixels +#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) +#define DHTTYPE DHT22 // DHT 22 +#define DHTPIN D4 //DHT22 Pin D4(GPIO 2) +#define relay1 D5 // Lampu D5(GPIO 14) +#define relay2 D6 // Kulkas D6(GPIO 12) +#define relay3 D3 // Pompa D7(GPIO 13) +#define relay4 D8 // Kipas D8(GPIO 15) +#define buzzer 10 //Buzzer Pin(GPIO 10) +#define PIR D7 //PIR Sensor Pin D3(GPIO 0) +#define Api D0 // Flame sensor Pin D0 + +#define MQ135_PIN A0 // Pin analog yang digunakan untuk sensor MQ135 +#define RLOAD 10.0 // Nilai resistansi beban (10kΩ) +#define VCC 5.0 + +MQ135 gasSensor(MQ135_PIN); +float R0 = 0.41; // Nilai R0 yang telah dikalibrasi, sesuaikan dengan hasil kalibrasi + +int pompa_air; +int alarm_status; +int pir_status = 0; +int flame_sensor = 0; + +DHT dht(DHTPIN, DHTTYPE); +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + +/* Start Webserver */ +AsyncWebServer server(80); + +/* Attach ESP-DASH to AsyncWebServer */ +/* ESPDash dashboard(&server); */ /*Bisa Mengunakan IP Default */ +ESPDash dashboard(&server, "/rezainalvito-e32210750-smartkitchen"); +/* + Dashboard Cards + Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional) ) +*/ +Card AIQ(&dashboard, GENERIC_CARD, "Index Kualitas Udara", "PPM"); +Card temperature(&dashboard, TEMPERATURE_CARD, "Temperatur", "°C"); +Card humidity(&dashboard, HUMIDITY_CARD, "Kelembaban", "%"); +Card Buzzer(&dashboard, STATUS_CARD, "Alarm"); +Card Motion_PIR(&dashboard, STATUS_CARD, "Objek"); +Card Motion_Flame(&dashboard, STATUS_CARD, "Api"); +Card light(&dashboard, BUTTON_CARD, "Lampu"); +Card fridge(&dashboard, BUTTON_CARD, "Kulkas"); +Card oven(&dashboard, BUTTON_CARD, "Pompa"); +Card fan(&dashboard, BUTTON_CARD, "Kipas"); + + +void setup() { + Serial.begin(115200); + + /* Connect WiFi */ + WiFi.softAP(ssid, password); + Serial.print("IP address: "); + Serial.println(WiFi.softAPIP()); + /* Start AsyncWebServer */ + server.begin(); + + dht.begin(); + display.begin(SSD1306_SWITCHCAPVCC, 0x3C); + + pinMode(PIR, INPUT); + pinMode(Api, INPUT); + pinMode(buzzer, OUTPUT); + //pinMode(pompa, OUTPUT); + pinMode(relay1, OUTPUT); + pinMode(relay2, OUTPUT); + pinMode(relay3, OUTPUT); + pinMode(relay4, OUTPUT); + + digitalWrite(buzzer, LOW); + //digitalWrite(pompa, LOW); + digitalWrite(relay1, HIGH); + digitalWrite(relay2, HIGH); + digitalWrite(relay3, HIGH); + digitalWrite(relay4, HIGH); + delay(100); +} + +void loop() { + // Baca nilai resistansi sensor (Rs) + int sensorValue = analogRead(MQ135_PIN); + float voltage = sensorValue * (VCC / 1023.0); // Konversi nilai bacaan analog ke tegangan (dalam volt) + float Rs = (VCC - voltage) / voltage * RLOAD; + + // Hitung PPM menggunakan rumus yang sesuai + float PPM = pow(10, ((log10(Rs / R0) - 0.12) / -0.27)); + + // Tampilkan hasil PPM + Serial.print("Nilai PPM: "); + Serial.println(PPM); + + float t = dht.readTemperature(); + float h = dht.readHumidity(); + + pir_status = digitalRead(PIR); + flame_sensor = digitalRead(Api); + alarm_status = digitalRead(buzzer); + //pompa_air = digitalRead(pompa); + + if (t > 30) { + // Suhu melebihi 30 derajat Celsius + display.clearDisplay(); + display.setCursor(0, 0); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Kondisi Suhu Saat Ini"); + + display.setCursor(0, 20); //oled display + display.setTextSize(2); + display.setTextColor(WHITE); + display.println("Panas"); + display.display(); + delay(1500); + } else if (t < 30) { + // Suhu di bawah 30 derajat Celsius + display.clearDisplay(); + display.setCursor(0, 0); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Kondisi Suhu Saat Ini:"); + + display.setCursor(0, 20); //oled display + display.setTextSize(2); + display.setTextColor(WHITE); + display.println("Normal"); + display.display(); + delay(1500); + } + + if (pir_status == 1) + { + Serial.println("Terdeteksi"); + Motion_PIR.update("Terdeteksi", "s"); + dashboard.sendUpdates(); + } + else if (pir_status == 0) + { + Serial.println("Tidak Terdeteksi Objek"); + Motion_PIR.update("Tidak Terdeteksi", "d"); + dashboard.sendUpdates(); + } + + if (flame_sensor == 1) + { + //digitalWrite(buzzer, HIGH); + digitalWrite(relay3, LOW); + Motion_Flame.update("Bahaya Timbul Api", "d"); + //Buzzer.update("Aktif", "w"); + oven.update(HIGH); + dashboard.sendUpdates(); + } + else if (flame_sensor == 0) + { + //digitalWrite(buzzer, LOW); + digitalWrite(relay3, HIGH); + Motion_Flame.update("Situasi Aman", "s"); + //Buzzer.update("Mati", "s"); + oven.update(LOW); + dashboard.sendUpdates(); + } + + if (PPM> 150) + { + digitalWrite(buzzer, HIGH); + digitalWrite(relay4, LOW); + Buzzer.update("Aktif", "w"); + fan.update(HIGH); + dashboard.sendUpdates(); + + display.clearDisplay(); + display.setCursor(0, 0); + display.setTextSize(2); + display.setTextColor(WHITE); + display.println("Terdeteksi"); + + display.setCursor(0, 20); //oled display + display.setTextSize(2); + display.setTextColor(WHITE); + display.println("Kebocoran"); + + display.setCursor(0, 40); //oled display + display.setTextSize(2); + display.setTextColor(WHITE); + display.println("Gas"); + + display.display(); + delay(1500); + } + else + { + digitalWrite(buzzer, LOW); + digitalWrite(relay4, HIGH); + Serial.println("Buzzer Status: OFF"); + Serial.println("Exhaust Fan: OFF"); + Buzzer.update("Mati", "s"); + fan.update(LOW); + dashboard.sendUpdates(); + } + + temperature.update(t); + humidity.update(h); + AIQ.update(PPM); +//Button for Light + light.attachCallback([&](bool value){ + Serial.println("[light] Button Callback Triggered: "+String((value)?"HIGH":"LOW")); + digitalWrite(relay1, (value)); + light.update(value); + dashboard.sendUpdates(); +}); +//Button for Fridge + fridge.attachCallback([&](bool value){ + Serial.println("[fridge] Button Callback Triggered: "+String((value)?"HIGH":"LOW")); + digitalWrite(relay2, (value)); + fridge.update(value); + dashboard.sendUpdates(); +}); +//Button for Oven + oven.attachCallback([&](bool value){ + Serial.println("[oven] Button Callback Triggered: "+String((value)?"HIGH":"LOW")); + digitalWrite(relay3, (value)); + oven.update(value); + dashboard.sendUpdates(); +}); +//Button for Fan + fan.attachCallback([&](bool value){ + Serial.println("[fan] Button Callback Triggered: "+String((value)?"HIGH":"LOW")); + digitalWrite(relay4, (value)); + fan.update(value); + dashboard.sendUpdates(); +}); + /* Send Updates to our Dashboard (realtime) */ + dashboard.sendUpdates(); + dashboard.setAuthentication("rezainalvito", "12121212"); + delay(1500); + + // Display Rezainal Vito + display.clearDisplay(); + display.setCursor(0, 0); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Dapur Pintar - IoT"); + + display.setCursor(0, 20); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Rezainal Vito"); + + display.setCursor(0, 35); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("E32210750"); + + display.setCursor(0, 50); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Teknik Komputer"); + + display.display(); + delay(2000); + + // display temperature + display.clearDisplay(); + display.setTextSize(1); + display.setCursor(0, 0); + display.print("Temperature: "); + display.setTextSize(2); + display.setCursor(0, 10); + display.print(t); + display.print(" "); + display.setTextSize(1); + display.cp437(true); + display.write(167); + display.setTextSize(2); + display.print("C"); + + // display humidity + display.setTextSize(1); + display.setCursor(0, 35); + display.print("Humidity: "); + display.setTextSize(2); + display.setCursor(0, 45); + display.print(h); + display.print(" %"); + display.display(); + delay(1500); + + // Display Air Quality Index + display.clearDisplay(); + display.setCursor(0, 0); //oled display + display.setTextSize(1); + display.setTextColor(WHITE); + display.println("Air Quality Index"); + + display.setCursor(0, 20); //oled display + display.setTextSize(2); + display.setTextColor(WHITE); + display.print(PPM); + display.setTextSize(1); + display.setTextColor(WHITE); + display.println(" PPM"); + display.display(); + delay(1500); +}