#include <DHT.h>
// Pin definisi
#define DHTPIN 4 // Pin untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT
#define LDRPIN 34 // Pin untuk sensor LDR
#define RELAYPIN 25 // Pin untuk relay
// Inisialisasi DHT
DHT dht(DHTPIN, DHTTYPE);
// Variabel untuk fuzzy
float suhuLow, suhuMedium, suhuHigh;
float cahayaLow, cahayaMedium, cahayaHigh;
// Fungsi untuk logika fuzzy suhu
void fuzzySuhu(float suhu, float &low, float &medium, float &high) {
low = max(0.0f, min(1.0f, (30.0f - suhu) / 5.0f));
medium = max(0.0f, min((suhu - 25.0f) / 5.0f, (35.0f - suhu) /
5.0f));
high = max(0.0f, min((suhu - 30.0f) / 5.0f, 1.0f));
}
// Fungsi untuk logika fuzzy cahaya
void fuzzyCahaya(int cahaya, float &low, float &medium, float &high)
{
low = max(0.0f, min(1.0f, (500 - cahaya) / 200.0f));
medium = max(0.0f, min((cahaya - 300) / 200.0f, (700 - cahaya) /
200.0f));
high = max(0.0f, min((cahaya - 500) / 200.0f, 1.0f));
}
// Fungsi untuk menentukan status relay berdasarkan aturan fuzzy
bool fuzzyRelay(float suhu, int cahaya) {
// Hitung derajat keanggotaan fuzzy untuk suhu dan cahaya
fuzzySuhu(suhu, suhuLow, suhuMedium, suhuHigh);
fuzzyCahaya(cahaya, cahayaLow, cahayaMedium, cahayaHigh);
// Aturan fuzzy:
// 1. Jika suhu tinggi atau cahaya rendah -> Relay hidup
float rule1 = max(suhuHigh, cahayaLow);
// 2. Jika suhu sedang dan cahaya sedang -> Relay mati
float rule2 = min(suhuMedium, cahayaMedium);
// 3. Jika suhu rendah dan cahaya tinggi -> Relay mati
float rule3 = min(suhuLow, cahayaHigh);
// 4. Jika suhu tinggi dan cahaya tinggi -> Relay hidup
float rule4 = min(suhuHigh, cahayaHigh);
// Gabungkan semua aturan
float hidup = max(rule1, rule4); // Relay hidup
float mati = max(rule2, rule3); // Relay mati
// Relay hidup jika derajat keanggotaan "hidup" lebih besar dari "mati"
return hidup > mati;
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LDRPIN, INPUT);
pinMode(RELAYPIN, OUTPUT);
// Pastikan relay dalam keadaan mati di awal
digitalWrite(RELAYPIN, LOW);
Serial.println("Fuzzy Relay Dimulai");
}
void loop() {
// Membaca suhu dari sensor DHT22
float suhu = dht.readTemperature();
// Membaca nilai cahaya dari LDR
int cahaya = analogRead(LDRPIN);
// Jika pembacaan suhu gagal
if (isnan(suhu)) {
Serial.println("Error membaca suhu!");
return;
}
// Menentukan status relay berdasarkan fuzzy logic
bool relayStatus = fuzzyRelay(suhu, cahaya);
// Kontrol relay
digitalWrite(RELAYPIN, relayStatus ? HIGH : LOW);
// Tampilkan data ke serial monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" C, Cahaya: ");
Serial.print(cahaya);
Serial.print(", Relay: ");
Serial.println(relayStatus ? "Hidup" : "Mati");
// Tampilkan keanggotaan fuzzy untuk debugging
Serial.print("Suhu Low: ");
Serial.print(suhuLow);
Serial.print(", Medium: ");
Serial.print(suhuMedium);
Serial.print(", High: ");
Serial.print(suhuHigh);
Serial.print(" | Cahaya Low: ");
Serial.print(cahayaLow);
Serial.print(", Medium: ");
Serial.print(cahayaMedium);
Serial.print(", High: ");
Serial.println(cahayaHigh);
delay(2000); // Delay 2 detik
}