/**
Program ini adalah implementasi dari kontroler logika fuzzy
menggunakan Arduino dan beberapa sensor. Tujuannya adalah mengontrol
kecerahan lampu LED berdasarkan dua input, yaitu jarak sensor ultrasonik
dan nilai sensor LDR (Light Dependent Resistor).
Kontroler logika fuzzy digunakan untuk membuat keputusan berdasarkan
aturan-aturan fuzzy yang telah ditentukan.
**/
#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>
// Pendefinisian pin (sensor dan aktuator yang digunakan)
#define TRIG_PIN 9
#define ECHO_PIN 10
#define BUZZER_PIN 11
// Objek fuzzy
Fuzzy *fuzzy = new Fuzzy();
void setup() {
// Menginisialisasi komunikasi serial dan pengaturan mode pin
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Fuzzy sets untuk jarak (0-400 cm)
FuzzySet *very_close = new FuzzySet(0, 0, 10, 20); // Jarak sangat dekat
FuzzySet *close = new FuzzySet(10, 20, 30, 40); // Jarak dekat
FuzzySet *far = new FuzzySet(30, 40, 50, 60); // Jarak jauh
FuzzySet *very_far = new FuzzySet(50, 60, 400, 400); // Jarak sangat jauh
// Fuzzy sets untuk buzzer (frekuensi buzzer, 0-255)
FuzzySet *silent = new FuzzySet(0, 0, 0, 0); // Tidak ada suara
FuzzySet *low = new FuzzySet(0, 64, 128, 128); // Suara rendah
FuzzySet *medium = new FuzzySet(128, 192, 192, 255); // Suara sedang
FuzzySet *high = new FuzzySet(192, 255, 255, 255); // Suara tinggi
// Fuzzy input untuk jarak
FuzzyInput *distance = new FuzzyInput(1);
distance->addFuzzySet(very_close);
distance->addFuzzySet(close);
distance->addFuzzySet(far);
distance->addFuzzySet(very_far);
fuzzy->addFuzzyInput(distance);
// Fuzzy output untuk buzzer
FuzzyOutput *buzzer = new FuzzyOutput(1);
buzzer->addFuzzySet(silent);
buzzer->addFuzzySet(low);
buzzer->addFuzzySet(medium);
buzzer->addFuzzySet(high);
fuzzy->addFuzzyOutput(buzzer);
// Aturan fuzzy
FuzzyRuleAntecedent *ifVeryClose = new FuzzyRuleAntecedent();
ifVeryClose->joinSingle(very_close);
FuzzyRuleConsequent *thenHigh = new FuzzyRuleConsequent();
thenHigh->addOutput(high);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, ifVeryClose, thenHigh);
fuzzy->addFuzzyRule(fuzzyRule1);
FuzzyRuleAntecedent *ifClose = new FuzzyRuleAntecedent();
ifClose->joinSingle(close);
FuzzyRuleConsequent *thenMedium = new FuzzyRuleConsequent();
thenMedium->addOutput(medium);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, ifClose, thenMedium);
fuzzy->addFuzzyRule(fuzzyRule2);
FuzzyRuleAntecedent *ifFar = new FuzzyRuleAntecedent();
ifFar->joinSingle(far);
FuzzyRuleConsequent *thenLow = new FuzzyRuleConsequent();
thenLow->addOutput(low);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, ifFar, thenLow);
fuzzy->addFuzzyRule(fuzzyRule3);
FuzzyRuleAntecedent *ifVeryFar = new FuzzyRuleAntecedent();
ifVeryFar->joinSingle(very_far);
FuzzyRuleConsequent *thenSilent = new FuzzyRuleConsequent();
thenSilent->addOutput(silent);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, ifVeryFar, thenSilent);
fuzzy->addFuzzyRule(fuzzyRule4);
}
// Fungsi untuk mengukur jarak menggunakan sensor ultrasonik
int measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2; // Menghitung jarak dalam cm
return distance;
}
void loop() {
// Mengukur jarak
int distance = measureDistance();
Serial.print("Jarak: ");
Serial.println(distance);
// Set input fuzzy
fuzzy->setInput(1, distance);
// Fuzzifikasi
fuzzy->fuzzify();
// Dapatkan output untuk buzzer
int buzzerOutput = fuzzy->defuzzify(1);
// Jika jarak sangat dekat (very_close), buat buzzer berbunyi cepat (on-off cepat)
if (distance <= 10) { // Sesuai dengan rentang very_close
// Mengatur buzzer untuk mati hidup dengan interval singkat (bunyi cepat)
for (int i = 0; i < 5; i++) { // Loop untuk mengaktifkan buzzer secara cepat
digitalWrite(BUZZER_PIN, HIGH);
delay(100); // Buzzer menyala (cepat)
digitalWrite(BUZZER_PIN, LOW);
delay(100); // Buzzer mati (cepat)
}
} else {
// Setel frekuensi buzzer sesuai dengan output fuzzy untuk jarak lainnya
analogWrite(BUZZER_PIN, buzzerOutput);
}
// Tunggu sebentar sebelum mengulangi loop
delay(200);
}