#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>
// Mendefinisikan pin
#define LDR A1
#define TRIG 2
#define ECHO 6
#define LED 3
// Membuat objek fuzzy dari kelas Fuzzy
Fuzzy *fuzzy = new Fuzzy();
void setup() {
// Menentukan mode pin
Serial.begin(9600); // Mengatur baudrate
pinMode(LDR, INPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED, OUTPUT);
// Mengatur jarak (0-400 cm)
FuzzySet *dekat = new FuzzySet(0, 0, 0, 150);
FuzzySet *normal = new FuzzySet(100, 150, 150, 200);
FuzzySet *jauh = new FuzzySet(150, 200, 200, 300);
FuzzySet *sgtjauh = new FuzzySet(200, 300, 400, 400);
// Mengatur intensitas cahaya
FuzzySet *ldrrendah = new FuzzySet(0, 0, 0, 150);
FuzzySet *ldrnormal = new FuzzySet(80, 200, 600, 800);
FuzzySet *ldrtinggi = new FuzzySet(500, 800, 1023, 1023);
// Mengatur kecerahan
FuzzySet *mati = new FuzzySet(0, 0, 0, 0);
FuzzySet *redup = new FuzzySet(0, 0, 40, 80);
FuzzySet *normalb = new FuzzySet(50, 80, 150, 200);
FuzzySet *terang = new FuzzySet(150, 225, 255, 255);
// Variabel jarak
FuzzyInput *jarak = new FuzzyInput(1);
jarak->addFuzzySet(dekat);
jarak->addFuzzySet(normal);
jarak->addFuzzySet(jauh);
jarak->addFuzzySet(sgtjauh);
fuzzy->addFuzzyInput(jarak);
// Variabel LDR
FuzzyInput *ldr = new FuzzyInput(2);
ldr->addFuzzySet(ldrrendah);
ldr->addFuzzySet(ldrnormal);
ldr->addFuzzySet(ldrtinggi);
fuzzy->addFuzzyInput(ldr);
// Variabel kecerahan
FuzzyOutput *kecerahan = new FuzzyOutput(1);
kecerahan->addFuzzySet(mati);
kecerahan->addFuzzySet(redup);
kecerahan->addFuzzySet(normalb);
kecerahan->addFuzzySet(terang);
fuzzy->addFuzzyOutput(kecerahan);
// Membuat aturan fuzzy 1
// Jika jarak dekat dan LDR rendah, kecerahan terang
FuzzyRuleAntecedent *ifJarakDekatAndLdrRendah = new FuzzyRuleAntecedent();
ifJarakDekatAndLdrRendah->joinWithAND(dekat, ldrrendah);
FuzzyRuleConsequent *thenKecerahanHigh = new FuzzyRuleConsequent();
thenKecerahanHigh->addOutput(terang);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, ifJarakDekatAndLdrRendah, thenKecerahanHigh);
fuzzy->addFuzzyRule(fuzzyRule1);
// Membuat aturan fuzzy 2
// Jika jarak dekat dan LDR tinggi, kecerahan mati
FuzzyRuleAntecedent *ifJarakDekatAndLdrTinggi = new FuzzyRuleAntecedent();
ifJarakDekatAndLdrTinggi->joinWithAND(dekat, ldrtinggi);
FuzzyRuleConsequent *thenKecerahanMati = new FuzzyRuleConsequent();
thenKecerahanMati->addOutput(mati);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, ifJarakDekatAndLdrTinggi, thenKecerahanMati);
fuzzy->addFuzzyRule(fuzzyRule2);
// Membuat aturan fuzzy 3
// Jika jarak normal, kecerahan normal
FuzzyRuleAntecedent *ifJarakNormal = new FuzzyRuleAntecedent();
ifJarakNormal->joinSingle(normal);
FuzzyRuleConsequent *thenKecerahanMid = new FuzzyRuleConsequent();
thenKecerahanMid->addOutput(normalb);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, ifJarakNormal, thenKecerahanMid);
fuzzy->addFuzzyRule(fuzzyRule3);
// Membuat aturan fuzzy 4
// Jika jarak jauh, kecerahan redup
FuzzyRuleAntecedent *ifJarakJauh = new FuzzyRuleAntecedent();
ifJarakJauh->joinSingle(jauh);
FuzzyRuleConsequent *thenKecerahanLow2 = new FuzzyRuleConsequent();
thenKecerahanLow2->addOutput(redup);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, ifJarakJauh, thenKecerahanLow2);
fuzzy->addFuzzyRule(fuzzyRule4);
// Membuat aturan fuzzy 5
// Jika jarak sangat jauh, kecerahan mati
FuzzyRuleAntecedent *ifJarakSgtjauh = new FuzzyRuleAntecedent();
ifJarakSgtjauh->joinSingle(sgtjauh);
FuzzyRuleConsequent *thenKecerahanMati2 = new FuzzyRuleConsequent();
thenKecerahanMati2->addOutput(mati);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, ifJarakSgtjauh, thenKecerahanMati2);
fuzzy->addFuzzyRule(fuzzyRule5);
}
// Fungsi jarak (sensor ultrasonik)
int jarak() {
digitalWrite(TRIG, LOW);
delayMicroseconds(5);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long pulse = pulseIn(ECHO, HIGH) / 2;
return pulse * 10 / 292;
}
// Kecerahan
int kecerahan() {
return analogRead(LDR);
}
void loop() {
int dist = jarak();
int light = kecerahan();
// Jika jarak dan kecerahan bernilai di luar rentang
if (dist < 0 || dist > 400 || light > 1023) return;
// Proses fuzzification
fuzzy->setInput(1, dist); // Variabel dist sebagai fuzzy input 1 (jarak)
fuzzy->setInput(2, light); // Variabel light sebagai fuzzy input 2 (kecerahan)
fuzzy->fuzzify();
// Defuzzification
int hasil = fuzzy->defuzzify(1);
analogWrite(LED, hasil);
// Menampilkan dalam serial monitor
Serial.print("Jarak: ");
Serial.print(dist);
Serial.print(" Kecerahan: ");
Serial.print(light);
Serial.print(" => Hasil: ");
Serial.print(hasil);
Serial.println();
delay(100);
}