// eFLL includes
#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 <LiquidCrystal.h> // Include LCD library
// Pin definitions
#define LDR A0 // Light sensor pin
#define TRIGGER 4 // Ultrasonic sensor trigger pin
#define ECHO 5 // Ultrasonic sensor echo pin
#define LED 6 // LED pin
#define BUZZER 7 // Buzzer pin
#define RS 8 // LCD RS pin
#define EN 9 // LCD EN pin
#define D4 10 // LCD D4 pin
#define D5 11 // LCD D5 pin
#define D6 12 // LCD D6 pin
#define D7 13 // LCD D7 pin
// Object library
Fuzzy *fuzzy = new Fuzzy();
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); // Initialize LCD
void setup() {
// Set up console and pins
Serial.begin(9600);
pinMode(LDR, INPUT);
pinMode(TRIGGER, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED, OUTPUT);
pinMode(BUZZER, OUTPUT); // Set buzzer pin as output
lcd.begin(16, 2); // Initialize LCD 16x2
lcd.print("Sistem Siap"); // Display initial message
delay(2000); // Wait for 2 seconds
lcd.clear(); // Clear the display
// Fuzzy sets for distance (0-400 cm)
FuzzySet *small = new FuzzySet(0, 0, 0, 120); // Trapezoid MF (a, b, c, d)
FuzzySet *mid = new FuzzySet(60, 120, 120, 180);
FuzzySet *big = new FuzzySet(120, 180, 180, 240);
FuzzySet *verybig = new FuzzySet(180, 240, 400, 400);
// Fuzzy sets for light sensor (0-1023)
FuzzySet *lowldr = new FuzzySet(0, 0, 0, 100);
FuzzySet *midldr = new FuzzySet(60, 200, 500, 700);
FuzzySet *highldr = new FuzzySet(400, 700, 1015, 1015);
// Fuzzy sets for brightness output (0-255)
FuzzySet *off = new FuzzySet(0, 0, 0, 0);
FuzzySet *lowb = new FuzzySet(0, 0, 25, 100);
FuzzySet *midb = new FuzzySet(55, 100, 155, 200);
FuzzySet *highb = new FuzzySet(155, 230, 255, 255);
// Variables
// Fuzzy input for distance
FuzzyInput *distanceInput = new FuzzyInput(1);
distanceInput->addFuzzySet(small);
distanceInput->addFuzzySet(mid);
distanceInput->addFuzzySet(big);
fuzzy->addFuzzyInput(distanceInput);
// Fuzzy input for light sensor
FuzzyInput *ldrInput = new FuzzyInput(2);
ldrInput->addFuzzySet(lowldr);
ldrInput->addFuzzySet(midldr);
ldrInput->addFuzzySet(highldr);
fuzzy->addFuzzyInput(ldrInput);
// Fuzzy output for brightness
FuzzyOutput *brightnessOutput = new FuzzyOutput(1);
brightnessOutput->addFuzzySet(off);
brightnessOutput->addFuzzySet(lowb);
brightnessOutput->addFuzzySet(midb);
brightnessOutput->addFuzzySet(highb);
fuzzy->addFuzzyOutput(brightnessOutput);
// Initialize fuzzy rules (rules omitted here for brevity)
// ...
}
// Returns the distance measured by the ultrasonic sensor
int getDistance() {
digitalWrite(TRIGGER, LOW);
delayMicroseconds(5);
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER, LOW);
long pulse = pulseIn(ECHO, HIGH) / 2;
return pulse * 10 / 292; // Convert to centimeters
}
// Returns the brightness measured by the LDR
int getBrightness() {
return analogRead(LDR);
}
// Main loop
void loop() {
// Get distance and light readings
int dist = getDistance();
int light = getBrightness();
// Validate readings
if (dist < 0 || dist > 400 || light > 1023) return;
// Fuzzification
fuzzy->setInput(1, dist); // Distance as fuzzy input 1
fuzzy->setInput(2, light); // Light as fuzzy input 2
fuzzy->fuzzify();
// Defuzzification
int output = fuzzy->defuzzify(1); // Defuzzify brightness output
// Set LED brightness
analogWrite(LED, output);
// Activate buzzer if LED is on (output > 0)
if (output > 0) {
digitalWrite(BUZZER, HIGH); // Turn on buzzer
lcd.clear();
lcd.print("Alarm Menyala!"); // Display alarm message
} else {
digitalWrite(BUZZER, LOW); // Turn off buzzer
lcd.clear();
lcd.print("Lampu Mati"); // Display light off message
}
// Display LED status
if (output > 0) {
lcd.setCursor(0, 1); // Set cursor to second row
lcd.print("Lampu Menyala"); // Display LED status
}
// Print readings to Serial Monitor
Serial.print("distance: ");
Serial.print(dist);
Serial.print(" light: ");
Serial.print(light);
Serial.print(" => output: ");
Serial.print(output);
Serial.println();
delay(100); // Delay for stability
}