#include <DHT.h>
// Pin definitions
#define DHTPIN 2 // Pin DHT Sensor
#define DHTTYPE DHT22 // Tipe sensor (DHT11 atau DHT22)
#define ledRed 3
#define ledYellow 4
#define ledGreen 5
DHT dht(DHTPIN, DHTTYPE);
// Fuzzy membership functions
float suhuDingin(float x) {
if (x <= 18) return 1.0;
else if (x > 18 && x <= 23) return (23 - x) / 5.0;
else return 0.0;
}
float suhuNormal(float x) {
if (x <= 18) return 0.0;
else if (x > 18 && x <= 23) return (x - 18) / 5.0;
else if (x > 23 && x <= 28) return (28 - x) / 5.0;
else return 0.0;
}
float suhuPanas(float x) {
if (x <= 28) return 0.0;
else if (x > 28 && x <= 80) return (x - 28) / 52.0;
else return 1.0;
}
float kelembapanRendah(float x) {
if (x <= 25) return 1.0;
else if (x > 25 && x <= 75) return (75 - x) / 50.0;
else return 0.0;
}
float kelembapanSedang(float x) {
if (x <= 25) return 0.0;
else if (x > 25 && x <= 75) return (x - 25) / 50.0;
else if (x > 75 && x <= 100) return (100 - x) / 25.0;
else return 0.0;
}
float kelembapanTinggi(float x) {
if (x <= 75) return 0.0;
else if (x > 75 && x <= 100) return (x - 75) / 25.0;
else return 1.0;
}
// Fungsi defuzzifikasi
float defuzzifikasi(float suhu, float kelembapan) {
float dingin = suhuDingin(suhu);
float normal = suhuNormal(suhu);
float panas = suhuPanas(suhu);
float rendah = kelembapanRendah(kelembapan);
float sedang = kelembapanSedang(kelembapan);
float tinggi = kelembapanTinggi(kelembapan);
// Rule base
float rendahOut = max(
max(min(dingin, rendah), min(dingin, sedang)),
min(dingin, tinggi)
);
float sedangOut = max(
max(min(normal, rendah), min(normal, sedang)),
min(panas, rendah)
);
float tinggiOut = max(
max(min(panas, sedang), min(panas, tinggi)),
min(normal, tinggi)
);
// Weighted average (defuzzifikasi)
float z = ((rendahOut * 100) + (sedangOut * 400) + (tinggiOut * 800)) /
(rendahOut + sedangOut + tinggiOut);
return z;
}
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGreen, OUTPUT);
}
void loop() {
// Membaca suhu dan kelembapan dari sensor DHT
float suhu = dht.readTemperature();
float kelembapan = dht.readHumidity();
if (isnan(suhu) || isnan(kelembapan)) {
Serial.println("Gagal membaca dari sensor DHT!");
return;
}
// Menampilkan nilai suhu dan kelembapan di Serial Monitor
Serial.println("-------------------------------");
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" °C");
Serial.print("Kelembapan: ");
Serial.print(kelembapan);
Serial.println(" %");
float z = defuzzifikasi(suhu, kelembapan);
Serial.print("Output (z): ");
Serial.println(z);
Serial.println("-------------------------------");
// Mengatur LED berdasarkan nilai z
if (z <= 200) {
Serial.println("Rendah");
digitalWrite(ledRed, HIGH); // Lampu merah menyala
digitalWrite(ledYellow, LOW); // Lampu kuning mati
digitalWrite(ledGreen, LOW); // Lampu hijau mati
} else if (z > 200 && z <= 600) {
Serial.println("Sedang");
digitalWrite(ledRed, LOW); // Lampu merah mati
digitalWrite(ledYellow, HIGH); // Lampu kuning menyala
digitalWrite(ledGreen, LOW); // Lampu hijau mati
} else {
Serial.println("Tinggi");
digitalWrite(ledRed, LOW); // Lampu merah mati
digitalWrite(ledYellow, LOW); // Lampu kuning mati
digitalWrite(ledGreen, HIGH); // Lampu hijau menyala
}
// Delay untuk stabilitas
delay(2000);
}