//libary
#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 POT A2
#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(POT, 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);
//Mengatur input Potensio
FuzzySet *potrendah = new FuzzySet(0,0,0,200);
FuzzySet *potnormal = new FuzzySet(100,400,600,800);
FuzzySet *pottinggi = new FuzzySet(600,800,1023,1023);
// 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 Potensio
FuzzyInput *potensio = new FuzzyInput(3);
potensio->addFuzzySet(potrendah);
potensio->addFuzzySet(potnormal);
potensio->addFuzzySet(pottinggi);
fuzzy->addFuzzyInput(potensio);
// 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,LDR rendah,Potensio rendah, kecerahan terang
FuzzyRuleAntecedent *ifJarakDekatAndLdrRendah = new FuzzyRuleAntecedent();
ifJarakDekatAndLdrRendah->joinWithAND(dekat, ldrrendah);
FuzzyRuleAntecedent *ifJarakDekatAndLdrRendahAndPotRendah = new FuzzyRuleAntecedent();
ifJarakDekatAndLdrRendahAndPotRendah->joinWithAND(ifJarakDekatAndLdrRendah, potrendah);
FuzzyRuleConsequent *thenKecerahanHigh = new FuzzyRuleConsequent();
thenKecerahanHigh->addOutput(terang);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, ifJarakDekatAndLdrRendahAndPotRendah, 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 dan potensio normal kecerahan normal
FuzzyRuleAntecedent *ifJarakNormalAndPotNormal = new FuzzyRuleAntecedent();
ifJarakNormalAndPotNormal->joinWithAND(normal, potnormal);
FuzzyRuleConsequent *thenKecerahanMid = new FuzzyRuleConsequent();
thenKecerahanMid->addOutput(normalb);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, ifJarakNormalAndPotNormal, thenKecerahanMid);
fuzzy->addFuzzyRule(fuzzyRule3);
// Membuat aturan fuzzy 4
// Jika jarak jauh, potensio tinggi kecerahan redup
FuzzyRuleAntecedent *ifJarakJauhAndPotTinggi = new FuzzyRuleAntecedent();
ifJarakJauhAndPotTinggi->joinWithAND(jauh,pottinggi);
FuzzyRuleConsequent *thenKecerahanLow = new FuzzyRuleConsequent();
thenKecerahanLow->addOutput(redup);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, ifJarakJauhAndPotTinggi, thenKecerahanLow);
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;
}
// Intensitas Cahaya
int intensitas() {
return analogRead(LDR);
}
//Potensio
int potensiometer(){
return analogRead(POT);
}
void loop() {
int dist = jarak();
int light = intensitas();
int pot = potensiometer();
// Jika jarak dan intensitas bernilai di luar rentang
if (dist < 0 || dist > 400 || light > 1023 || pot>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 (intensitas)
fuzzy->setInput(3,pot); //variabel pot sebagai fuzzy input 3 (potensiometer)
fuzzy->fuzzify();
// Defuzzification
int hasil = fuzzy->defuzzify(1);
analogWrite(LED, hasil);
// Menampilkan dalam serial monitor
Serial.print("Jarak: ");
Serial.print(dist);
Serial.print(" Light: ");
Serial.print(light);
Serial.print(" Potensio :");
Serial.print(pot);
Serial.print(" => Hasil: ");
Serial.print(hasil);
Serial.println();
delay(100);
}