/* WOKWIIIIII
Fadillah Avieroes Asy'ari
3F / D-IV TE
*/
// eFLL Library untuk Logika Fuzzy
#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>
// Pin untuk sensor dan LED
#define WAGYU A5 // Light sensor (LDR)
#define TIGER 13 // Ultrasonic sensor trigger
#define EKO 12 // Ultrasonic sensor echo
const int ledCount = 10; // Jumlah LED bar graph
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; // Pin tiap LED bar graph
// Fuzzy logic object
Fuzzy *fuzzy = new Fuzzy();
void setup() {
// Setup Serial Monitor debugging
Serial.begin(9600);
// Configure sensor pins
pinMode(WAGYU, INPUT); // LDR sensor
pinMode(TIGER, OUTPUT); // Ultrasonic trigger pin
pinMode(EKO, INPUT); // Ultrasonic echo pin
// Setup LED bar graph sebagai output
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
// Fuzzy Set untuk Jarak dalam cm (range: 0-400)
FuzzySet *kcl = new FuzzySet(0, 0, 0, 120); // Jarak kecil
FuzzySet *sdg = new FuzzySet(60, 120, 120, 180); // Jarak sedang
FuzzySet *gde = new FuzzySet(120, 180, 180, 240); // Jarak jauh
FuzzySet *gdebgt = new FuzzySet(180, 240, 400, 400); // Jarak jauh banget
// Fuzzy Set untuk Intensitas Cahaya (ldr) dalam lux (range: 0-1023)
FuzzySet *ldrrendah = new FuzzySet(0, 0, 0, 100); // Intensitas Cahaya rendah
FuzzySet *ldrsedang = new FuzzySet(60, 200, 500, 700); // Intensitas Cahaya sedang
FuzzySet *ldrtinggi = new FuzzySet(400, 700, 1015, 1015); // Intensitas Cahaya tinggi
// Fuzzy Set untuk Kecerahan dalam PWM (range: 0-255)
FuzzySet *mati = new FuzzySet(0, 0, 0, 0); // Kecerahan mati
FuzzySet *redup = new FuzzySet(0, 0, 25, 100); // Kecerahan redup
FuzzySet *murup = new FuzzySet(55, 100, 155, 200); // Kecerahan murup
FuzzySet *trang = new FuzzySet(155, 230, 255, 255); // Kecerahan terang
// Fuzzy input (jarak dan ldr) dan tambahkan fuzzy sets
FuzzyInput *jarak = new FuzzyInput(1); // Fuzzy input 1: Jarak
jarak->addFuzzySet(kcl); // Set Jarak dekat
jarak->addFuzzySet(sdg); // Set Jarak sedang
jarak->addFuzzySet(gde); // Set Jarak jauh
jarak->addFuzzySet(gdebgt); // Set Jarak jauh banget
fuzzy->addFuzzyInput(jarak); // Masukkan input ke system
FuzzyInput *ldr = new FuzzyInput(2); // Fuzzy input 2: Intensitas Cahaya
ldr->addFuzzySet(ldrrendah); // Set Intensitas Cahaya rendah
ldr->addFuzzySet(ldrsedang); // Set Intensitas Cahaya sedang
ldr->addFuzzySet(ldrtinggi); // Set Intensitas Cahaya tinggi
fuzzy->addFuzzyInput(ldr); // Masukkan input ke system
// Fuzzy output (cerah) dan fuzzy sets
FuzzyOutput *cerah = new FuzzyOutput(1); // Fuzzy output 1: Kecerahan level
cerah->addFuzzySet(mati); // Tambahkan kondisi mati
cerah->addFuzzySet(redup); // Tambahkan kondisi redup
cerah->addFuzzySet(murup); // Tambahkan kondisi murup
cerah->addFuzzySet(trang); // Tambahkan kondisi terang
fuzzy->addFuzzyOutput(cerah); // Tambahkan output kedalam system
// Fuzzy Rules
FuzzyRuleAntecedent *ifJarakKcldanLdrRendah = new FuzzyRuleAntecedent(); // Jika Jarak kecil dan cahaya rendah
ifJarakKcldanLdrRendah->joinWithAND(kcl, ldrrendah);
FuzzyRuleConsequent *thenCerahTrang = new FuzzyRuleConsequent(); // Maka Kecerahan terang
thenCerahTrang->addOutput(trang);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, ifJarakKcldanLdrRendah, thenCerahTrang); // Buat rule 1
fuzzy->addFuzzyRule(fuzzyRule1); // Tambahkan rule ke system
FuzzyRuleAntecedent *ifJarakKcldanLdrTinggi = new FuzzyRuleAntecedent(); // Jika Jarak kecil dan cahaya tinggi
ifJarakKcldanLdrTinggi->joinWithAND(kcl, ldrtinggi);
FuzzyRuleConsequent *thenCerahMati = new FuzzyRuleConsequent(); // Maka Kecerahan mati
thenCerahMati->addOutput(mati);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, ifJarakKcldanLdrTinggi, thenCerahMati); // Buat rule 2
fuzzy->addFuzzyRule(fuzzyRule2); // Tambahkan rule ke system
FuzzyRuleAntecedent *ifJarakSdg = new FuzzyRuleAntecedent(); // Jika Jarak sedang
ifJarakSdg->joinSingle(sdg);
FuzzyRuleConsequent *thenCerahMurup = new FuzzyRuleConsequent(); // Maka Kecerahan murup
thenCerahMurup->addOutput(murup);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, ifJarakSdg, thenCerahMurup); // Buat rule 3
fuzzy->addFuzzyRule(fuzzyRule3); // Tambahkan rule ke system
FuzzyRuleAntecedent *ifJarakGde = new FuzzyRuleAntecedent(); // Jika Jarak jauh
ifJarakGde->joinSingle(gde);
FuzzyRuleConsequent *thenCerahRedup = new FuzzyRuleConsequent(); // Maka Kecerahan redup
thenCerahRedup->addOutput(redup);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, ifJarakGde, thenCerahRedup); // Buat rule 4
fuzzy->addFuzzyRule(fuzzyRule4); // Tambahkan rule ke system
FuzzyRuleAntecedent *ifJarakGdebgt = new FuzzyRuleAntecedent(); // Jika Jarak jauh banget
ifJarakGdebgt->joinSingle(gdebgt);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, ifJarakGdebgt, thenCerahMati); // Buat rule 5: maka Kecerahan mati
fuzzy->addFuzzyRule(fuzzyRule5); // Tambahkan rule ke system
}
// Membaca jarak dengan sensor ultrasonic
int jarak() {
digitalWrite(TIGER, LOW); // Trigger pin LOW
delayMicroseconds(5);
digitalWrite(TIGER, HIGH); // Pulse trigger
delayMicroseconds(10);
digitalWrite(TIGER, LOW); // End pulse
long pulse = pulseIn(EKO, HIGH) / 2; // Membaca echo pulsedan dibagi 2
return pulse * 10 / 292; // Konversi waktu ke Jarak dalam cm
}
// Membaca Intensitas Cahaya dari LDR
int cerah() {
return analogRead(WAGYU); // Return analog value (0-1023) untuk Intensitas Cahaya
}
// Main loop
void loop() {
// Membaca Jarak dan Intensitas Cahaya
int dist = jarak(); // Jarak
int light = cerah(); // Intensitas Cahaya
// Check validasi bacaan (within range)
if (dist < 0 || dist > 400 || light > 1023) return;
// Set input fuzzy logic system
fuzzy->setInput(1, dist); // Set Jarak input 1
fuzzy->setInput(2, light); // Set light input 2
fuzzy->fuzzify(); // Process fuzzy logic
// output Fuzzifikasi (Kecerahan level)
int output = fuzzy->defuzzify(1); // Kecerahan output (0-255)
// Petakan Kecerahan output kedalam jumlah LED yang aktif dalam bar graph
int ledLevel = map(output, 0, 255, 0, ledCount); // Map Kecerahan LED count (0-10)
// Update LED bar graph berdasarkan output level
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH); // menghidupkan LED sesuai output level
} else {
digitalWrite(ledPins[thisLed], LOW); // mematikan LED lainnya
}
}
// Print bacaan sensor and LED level ke Serial Monitor untuk debugging
Serial.print("jarak: ");
Serial.print(dist);
Serial.print(" light: ");
Serial.print(light);
Serial.print(" => LED level: ");
Serial.print(ledLevel);
Serial.println();
delay(100); // Delay
}