#include <Servo.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Servo waterPump;
const int DHT_PIN = 7;
const int WATER_PUMP_PIN = 9; // Diubah dari BUZZER_PIN
DHT dht(DHT_PIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 16, 2);
double ZBerhenti(double a_predikat) {
double rendah = 40;
double tinggi = 80;
double ZBerhenti = tinggi - a_predikat * (tinggi - rendah);
return ZBerhenti;
}
double ZMenyiram(double a_predikat) {
double rendah = 40;
double tinggi = 80;
double ZMenyiram = a_predikat * (tinggi - rendah) + rendah;
return ZMenyiram;
}
void setup() {
Serial.begin(115200);
pinMode(WATER_PUMP_PIN, OUTPUT);
waterPump.attach(WATER_PUMP_PIN);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
dht.begin();
}
void loop() {
digitalWrite(WATER_PUMP_PIN, HIGH);
digitalWrite(WATER_PUMP_PIN, LOW);
/////////////////////////////////////////////////////////
///////////////////////////Suhu//////////////////////////
/////////////////////////////////////////////////////////
// Input nilai suhu dari sensor DHT
double suhuValue = dht.readTemperature(); // Diubah dari getTemperature
double aman = 16; // Batas bawah suhu
double panas = 50; // Batas atas suhu (Diubah dari api)
// Memetakan nilai suhuValue dari rentang (batas bawah) ke (batas atas) ke rentang baru (misalnya, 0 hingga 100)
double x = map(suhuValue, aman, panas, 16, 50);
Serial.println("==========Suhu==========");
Serial.println("Nilai X (suhu): " + String(x, 0));
// Fuzzifikasi
double Suhu_Rendah;
if (x >= panas) {
Suhu_Rendah = 0;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
} else if (aman < x && x < panas) {
Suhu_Rendah = (panas - x) / (panas - aman);
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 4));
} else if (x <= aman) {
Suhu_Rendah = 1;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
}
double Suhu_Tinggi;
if (x <= aman) {
Suhu_Tinggi = 0;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
} else if (aman < x && x < panas) {
Suhu_Tinggi = (x - aman) / (panas - aman);
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 4));
} else if (x >= panas) {
Suhu_Tinggi = 1;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
}
/////////////////////////////////////////////////////////
////////////////////////////Kelembaban///////////////////
/////////////////////////////////////////////////////////
// Kelembaban
// Input nilai Kelembaban dari sensor kelembaban
double KelembabanValue = dht.readHumidity();
double normal = 20;
double kering = 80;
double y = map (KelembabanValue, normal, kering, 20, 80);
Serial.println("============Kelembaban============");
Serial.println("Nilai Y: " + String(y, 0) + " C");
double Kelembaban_Rendah;
if (y >= kering) { // Updated from kebakaran
Kelembaban_Rendah = 0;
Serial.println("μKelembaban_Rendah [Y]: " + String(Kelembaban_Rendah, 0));
} else if (normal < y && y < kering) {
Kelembaban_Rendah = (kering - y) / (kering - normal);
Serial.println("μKelembaban_Rendah [Y]: " + String(Kelembaban_Rendah, 4));
} else if (y <= normal) {
Kelembaban_Rendah = 1;
Serial.println("μKelembaban_Rendah [Y]: " + String(Kelembaban_Rendah, 0));
}
double Kelembaban_Tinggi;
if (y <= normal) {
Kelembaban_Tinggi = 0;
Serial.println("μKelembaban_Tinggi [Y]: " + String(Kelembaban_Tinggi, 0));
} else if (y > normal && y < kering) {
Kelembaban_Tinggi = (y - normal) / (kering - normal);
Serial.println("μKelembaban_Tinggi [Y]: " + String(Kelembaban_Tinggi, 4));
} else if (y >= kering) {
Kelembaban_Tinggi = 1;
Serial.println("μKelembaban_Tinggi [Y]: " + String(Kelembaban_Tinggi, 0));
}
///////////////////////////////////////////////////////
///////////////////////Inferensi///////////////////////
///////////////////////////////////////////////////////
Serial.println("===========Inferensi=========");
// [R1] aman & Normal = Berhenti
double a_predikat1 = min(Suhu_Rendah, Kelembaban_Rendah);
Serial.println("a_predikat 1: " + String(a_predikat1, 4));
double Z1 = ZMenyiram(a_predikat1);
Serial.println("z1: " + String(Z1, 0));
// [R2] panas & Normal = Menyiram
double a_predikat2 = min(Suhu_Rendah, Kelembaban_Tinggi);
Serial.println("a_predikat 2: " + String(a_predikat2, 4));
double Z2 = ZBerhenti(a_predikat2);
Serial.println("z2: " + String(Z2, 0));
// [R3] aman & Kering = Berhenti
double a_predikat3 = min(Suhu_Tinggi, Kelembaban_Rendah);
Serial.println("a_predikat 3: " + String(a_predikat3, 4));
double Z3 = ZMenyiram(a_predikat3);
Serial.println("z3: " + String(Z3, 0));
// [R4] panas & Kering = Menyiram
double a_predikat4 = min(Suhu_Tinggi, Kelembaban_Tinggi);
Serial.println("a_predikat 4: " + String(a_predikat4, 4));
double Z4 = ZBerhenti(a_predikat4);
Serial.println("z4: " + String(Z4, 0));
///////////////////////////////////////////////////////
/////////////////////Defuzifikasi//////////////////////
///////////////////////////////////////////////////////
Serial.println("=========Defuzifikasi========");
double z = (a_predikat1 * Z1 + a_predikat2 * Z2 + a_predikat3 * Z3 + a_predikat4 * Z4) /
(a_predikat1 + a_predikat2 + a_predikat3 + a_predikat4);
Serial.println("Hasil nilai Z: " + String(z, 3));
lcd.clear();
lcd.setCursor(0, 0);
lcd.setCursor(0, 1);
if (z <= 50) {
lcd.print("TIDAK MENYIRAM");
delay(2000);
} else {
lcd.print("MENYIRAM ");
waterPump.write(WATER_PUMP_PIN);
waterPump.write(200);
delay(1000);
waterPump.write(0);
delay(5000);
Serial.println("Hasil nilai Z: " + String(z, 3));
lcd.setCursor(0, 0);
lcd.print("DERAJAT:");
lcd.setCursor(0, 1);
lcd.print(z, 4);
lcd.print(" C");
delay(1000);
}
}