// Menyertakan pustaka eFLL
#include <Fuzzy.h>
#include <FuzzyComposition.h>
#include <FuzzyInput.h>
#include <FuzzyIO.h>
#include <FuzzyOutput.h>
#include <FuzzyRule.h>
#include <FuzzyRuleAntecedent.h>
#include <FuzzyRuleConsequent.h>
#include <FuzzySet.h>
#include <DHT.h> // Pustaka untuk sensor DHT22
// Definisi pin
#define DHTPIN 2 // Pin untuk sensor DHT22
#define DHTTYPE DHT22 // Tipe sensor DHT
#define POTENSIOMETER A1 // Pin untuk potensiometer
#define TRIGGER 4 // Pin untuk trigger sensor ultrasonik
#define ECHO 5 // Pin untuk echo sensor ultrasonik
#define LED 6 // Pin untuk LED
// Membuat objek DHT
DHT dht(DHTPIN, DHTTYPE);
// Membuat objek library fuzzy
Fuzzy *logika_fuzzy = new Fuzzy();
void setup() {
// Mengatur komunikasi serial dan mode pin
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 9600
pinMode(POTENSIOMETER, INPUT); // Mengatur pin potensiometer sebagai input
pinMode(TRIGGER, OUTPUT); // Mengatur pin trigger sebagai output
pinMode(ECHO, INPUT); // Mengatur pin echo sebagai input
pinMode(LED, OUTPUT); // Mengatur pin LED sebagai output
// Inisialisasi sensor DHT22
dht.begin();
// Mendefinisikan himpunan fuzzy untuk jarak (0-400 cm)
FuzzySet *kecil = new FuzzySet(0, 0, 0, 120); // Himpunan fuzzy untuk jarak kecil
FuzzySet *sedang = new FuzzySet(60, 120, 120, 180); // Himpunan fuzzy untuk jarak sedang
FuzzySet *besar = new FuzzySet(120, 180, 180, 240); // Himpunan fuzzy untuk jarak besar
FuzzySet *sangatBesar = new FuzzySet(180, 240, 400, 400); // Himpunan fuzzy untuk jarak sangat besar
// Mendefinisikan himpunan fuzzy untuk kelembaban (0-100)
FuzzySet *rendahHumi = new FuzzySet(0, 0, 0, 30); // Himpunan fuzzy untuk kelembaban rendah
FuzzySet *sedangHumi = new FuzzySet(20, 30, 70, 80); // Himpunan fuzzy untuk kelembaban sedang
FuzzySet *tinggiHumi = new FuzzySet(60, 80, 100, 100); // Himpunan fuzzy untuk kelembaban tinggi
// Mendefinisikan himpunan fuzzy untuk potensiometer (0-1023)
FuzzySet *rendahPot = new FuzzySet(0, 0, 0, 100); // Himpunan fuzzy untuk potensiometer rendah
FuzzySet *sedangPot = new FuzzySet(60, 200, 500, 700); // Himpunan fuzzy untuk potensiometer sedang
FuzzySet *tinggiPot = new FuzzySet(400, 700, 1023, 1023); // Himpunan fuzzy untuk potensiometer tinggi
// Mendefinisikan himpunan fuzzy untuk kecerahan (0-255)
FuzzySet *matiB = new FuzzySet(0, 0, 0, 0); // Himpunan fuzzy untuk kecerahan mati
FuzzySet *rendahB = new FuzzySet(0, 0, 25, 100); // Himpunan fuzzy untuk kecerahan rendah
FuzzySet *sedangB = new FuzzySet(55, 100, 155, 200); // Himpunan fuzzy untuk kecerahan sedang
FuzzySet *tinggiB = new FuzzySet(155, 230, 255, 255); // Himpunan fuzzy untuk kecerahan tinggi
// Definisi variabel fuzzy
// Variabel jarak dengan universe 0-400 sebagai input
FuzzyInput *jarak = new FuzzyInput(1);
jarak->addFuzzySet(kecil); // Menambahkan himpunan fuzzy kecil
jarak->addFuzzySet(sedang); // Menambahkan himpunan fuzzy sedang
jarak->addFuzzySet(besar); // Menambahkan himpunan fuzzy besar
jarak->addFuzzySet(sangatBesar); // Menambahkan himpunan fuzzy sangat besar
logika_fuzzy->addFuzzyInput(jarak);
// Variabel kelembaban dengan universe 0-100 sebagai input
FuzzyInput *kelembaban = new FuzzyInput(2);
kelembaban->addFuzzySet(rendahHumi); // Menambahkan himpunan fuzzy rendah
kelembaban->addFuzzySet(sedangHumi); // Menambahkan himpunan fuzzy sedang
kelembaban->addFuzzySet(tinggiHumi); // Menambahkan himpunan fuzzy tinggi
logika_fuzzy->addFuzzyInput(kelembaban);
// Variabel potensiometer dengan universe 0-1023 sebagai input
FuzzyInput *potensiometer = new FuzzyInput(3);
potensiometer->addFuzzySet(rendahPot); // Menambahkan himpunan fuzzy rendah
potensiometer->addFuzzySet(sedangPot); // Menambahkan himpunan fuzzy sedang
potensiometer->addFuzzySet(tinggiPot); // Menambahkan himpunan fuzzy tinggi
logika_fuzzy->addFuzzyInput(potensiometer);
// Variabel kecerahan dengan universe 0-255 sebagai output
FuzzyOutput *kecerahan = new FuzzyOutput(1);
kecerahan->addFuzzySet(matiB); // Menambahkan himpunan fuzzy mati
kecerahan->addFuzzySet(rendahB); // Menambahkan himpunan fuzzy rendah
kecerahan->addFuzzySet(sedangB); // Menambahkan himpunan fuzzy sedang
kecerahan->addFuzzySet(tinggiB); // Menambahkan himpunan fuzzy tinggi
logika_fuzzy->addFuzzyOutput(kecerahan);
// Aturan Fuzzy
// Aturan 1: Jika jarak kecil dan kelembaban rendah dan potensiometer sedang, maka kecerahan tinggi
FuzzyRuleAntecedent *ifJarakKecilDanHumiRendah = new FuzzyRuleAntecedent();
ifJarakKecilDanHumiRendah->joinWithAND(kecil, rendahHumi); // Jika jarak kecil DAN kelembaban rendah
FuzzyRuleAntecedent *ifJarakKecilDanHumiRendahDanPotSedang = new FuzzyRuleAntecedent();
ifJarakKecilDanHumiRendahDanPotSedang->joinWithAND(ifJarakKecilDanHumiRendah, sedangPot); // DAN potensiometer sedang
FuzzyRuleConsequent *thenKecerahanTinggi = new FuzzyRuleConsequent();
thenKecerahanTinggi->addOutput(tinggiB); // Maka kecerahan tinggi
FuzzyRule *aturan1 = new FuzzyRule(1, ifJarakKecilDanHumiRendahDanPotSedang, thenKecerahanTinggi);
logika_fuzzy->addFuzzyRule(aturan1);
// Aturan 2: Jika jarak sedang dan kelembaban sedang dan potensiometer tinggi, maka kecerahan sedang
FuzzyRuleAntecedent *ifJarakSedangDanHumiSedang = new FuzzyRuleAntecedent();
ifJarakSedangDanHumiSedang->joinWithAND(sedang, sedangHumi); // Jika jarak sedang DAN kelembaban sedang
FuzzyRuleAntecedent *ifJarakSedangDanHumiSedangDanPotTinggi = new FuzzyRuleAntecedent();
ifJarakSedangDanHumiSedangDanPotTinggi->joinWithAND(ifJarakSedangDanHumiSedang, tinggiPot); // DAN potensiometer tinggi
FuzzyRuleConsequent *thenKecerahanSedang = new FuzzyRuleConsequent();
thenKecerahanSedang->addOutput(sedangB); // Maka kecerahan sedang
FuzzyRule *aturan2 = new FuzzyRule(2, ifJarakSedangDanHumiSedangDanPotTinggi, thenKecerahanSedang);
logika_fuzzy->addFuzzyRule(aturan2);
// Aturan 3: Jika jarak besar dan kelembaban tinggi dan potensiometer rendah, maka kecerahan rendah
FuzzyRuleAntecedent *ifJarakBesarDanHumiTinggi = new FuzzyRuleAntecedent();
ifJarakBesarDanHumiTinggi->joinWithAND(besar, tinggiHumi); // Jika jarak besar DAN kelembaban tinggi
FuzzyRuleAntecedent *ifJarakBesarDanHumiTinggiDanPotRendah = new FuzzyRuleAntecedent();
ifJarakBesarDanHumiTinggiDanPotRendah->joinWithAND(ifJarakBesarDanHumiTinggi, rendahPot); // DAN potensiometer rendah
FuzzyRuleConsequent *thenKecerahanRendah = new FuzzyRuleConsequent();
thenKecerahanRendah->addOutput(rendahB); // Maka kecerahan rendah
FuzzyRule *aturan3 = new FuzzyRule(3, ifJarakBesarDanHumiTinggiDanPotRendah, thenKecerahanRendah);
logika_fuzzy->addFuzzyRule(aturan3);
// Aturan 4: Jika jarak sangat besar, maka kecerahan mati
FuzzyRuleAntecedent *ifJarakSangatBesar = new FuzzyRuleAntecedent();
ifJarakSangatBesar->joinSingle(sangatBesar); // Jika jarak sangat besar
FuzzyRuleConsequent *thenKecerahanMati = new FuzzyRuleConsequent();
thenKecerahanMati->addOutput(matiB); // Maka kecerahan mati
FuzzyRule *aturan4 = new FuzzyRule(4, ifJarakSangatBesar, thenKecerahanMati);
logika_fuzzy->addFuzzyRule(aturan4);
}
void loop() {
// Pembacaan potensiometer
int nilai_potensiometer = analogRead(POTENSIOMETER);
// Pembacaan suhu dan kelembaban dari sensor DHT22
float kelembaban = dht.readHumidity();
// Pembacaan jarak dari sensor ultrasonik
digitalWrite(TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
float jarak = pulseIn(ECHO, HIGH) * 0.034 / 2;
// Mengatur nilai input ke sistem fuzzy
logika_fuzzy->setInput(1, jarak); // Input untuk jarak
logika_fuzzy->setInput(2, kelembaban); // Input untuk kelembaban
logika_fuzzy->setInput(3, nilai_potensiometer); // Input untuk potensiometer
// Menjalankan sistem fuzzy
logika_fuzzy->fuzzify();
// Mendapatkan hasil output dari sistem fuzzy
float kecerahan = logika_fuzzy->defuzzify(1);
// Mengatur LED berdasarkan nilai fuzzy
analogWrite(LED, kecerahan);
// Mencetak hasil ke Serial Monitor
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.print(" cm, Kelembaban: ");
Serial.print(kelembaban);
Serial.print("%, Potensiometer: ");
Serial.print(nilai_potensiometer);
Serial.print(", Kecerahan LED: ");
Serial.println(kecerahan);
// Penundaan untuk loop
delay(1000); // Delay untuk 1 detik sebelum mengulang loop
}