
Deskripsi Fuzzy Logic
Pengertian Logika fuzzy adalah Suatu Algoritma pendekatan untuk komputasi yang menyerupai penalaran manusia dengan memperhitungkan ketidakpastian dan ketidakjelasan. Berbeda dengan logika biner yang hanya mengenal dua nilai, yaitu benar (1) dan salah (0), logika fuzzy memperbolehkan nilai antara 0 dan 1. Ini memungkinkan sistem untuk membuat keputusan yang lebih fleksibel dan cerdas. Salah satu aplikasi menarik dari logika fuzzy adalah pada platform mikrokontroler seperti Arduino.
Prinsip Dasar Logika Fuzzy
Logika fuzzy bekerja berdasarkan konsep himpunan fuzzy. Dalam himpunan fuzzy, setiap elemen memiliki derajat keanggotaan yang berkisar antara 0 dan 1. Berikut adalah langkah-langkah dasar dalam sistem logika fuzzy:
- Fuzzifikasi: Mengonversi input yang tegas menjadi nilai fuzzy.
- Inferensi: Memproses nilai fuzzy menggunakan aturan-aturan logika fuzzy untuk menghasilkan keluaran fuzzy.
- Defuzzifikasi: Mengonversi keluaran fuzzy kembali menjadi nilai tegas.
Contoh Program Arduino Menggunakan Algoritma Fuzzy Logic
#include <EEPROM.h> // We are going to read and write PICC’s UIDs from/to EEPROM
#include <SPI.h> // RC522 Module uses SPI protocol
#include <MFRC522.h> // Library for Mifare RC522 Devices
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <mlx90615.h>
#include <LiquidCrystal_I2C.h>
#include <math.h>
#include “Fuzzy.h”
#define SDA_PIN A4 //define the SDA pin
#define SCL_PIN A5 //define the SCL pin
#define ledOut 4
#define SS_PIN 10
#define RST_PIN 9
#define buzzer A0
Fuzzy *fuzzy = new Fuzzy();
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
TinyGPSPlus gps;
LiquidCrystal_I2C lcd(0x27, 16, 2);
static const int RXPin = 2, TXPin = 3;
// The serial connection to the GPS device
SoftwareSerial mySerial(9, 8);
SoftwareSerial ss(RXPin, TXPin);
MLX90615 mlx = MLX90615();
String content= “”;
byte letter;
static const uint32_t GPSBaud = 9600;
uint32_t tsLastTime = 0;
float gpsLat, gpsLon;
float temp, tempO, tempA;
byte i;
int penumpang=0;
// FuzzyInput
FuzzySet *hipotermia = new FuzzySet(29, 29, 34, 35);
FuzzySet *normal = new FuzzySet(33.5, 35, 36, 37.5);
FuzzySet *demam = new FuzzySet(37, 37.5, 37.5, 38);
FuzzySet *demamTinggi = new FuzzySet(37.5, 39, 40, 40);
// FuzzyInput
FuzzySet *sepi = new FuzzySet(0, 0, 4, 6);
FuzzySet *sedang = new FuzzySet(4, 5, 8, 9);
FuzzySet *penuh = new FuzzySet(8, 9, 10, 11);
FuzzySet *sangatPenuh = new FuzzySet(10, 12, 20, 20);
// FuzzyOutput
FuzzySet *low = new FuzzySet(0, 0, 30, 40);
FuzzySet *medium = new FuzzySet(40, 50, 50, 60);
FuzzySet *high = new FuzzySet(60, 70, 100, 100);
void setup() {
//Arduino Pin Configuration
mySerial.begin(9600);
ss.begin(GPSBaud);
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
beepBuzzer();
lcdWelcome();
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
mlx.begin();
Serial.print(“Sensor ID number = “);
Serial.println(mlx.get_id(), HEX);
// FuzzyInput
FuzzyInput *temperature = new FuzzyInput(1);//2
temperature->addFuzzySet(hipotermia);
temperature->addFuzzySet(normal);
temperature->addFuzzySet(demam);
temperature->addFuzzySet(demamTinggi);
fuzzy->addFuzzyInput(temperature);
FuzzyInput *passenger = new FuzzyInput(2);//2
passenger->addFuzzySet(sepi);
passenger->addFuzzySet(sedang);
passenger->addFuzzySet(penuh);
passenger->addFuzzySet(sangatPenuh);
fuzzy->addFuzzyInput(passenger);
// FuzzyOutput
FuzzyOutput *risk = new FuzzyOutput(1);
risk->addFuzzySet(low);
risk->addFuzzySet(medium);
risk->addFuzzySet(high);
fuzzy->addFuzzyOutput(risk);
// Building FuzzyRule 1
FuzzyRuleConsequent *then_low = new FuzzyRuleConsequent();
then_low->addOutput(low);
FuzzyRuleConsequent *then_medium = new FuzzyRuleConsequent();
then_medium->addOutput(medium);
FuzzyRuleConsequent *then_high = new FuzzyRuleConsequent();
then_high->addOutput(high);
//Building Rule1
FuzzyRuleAntecedent *hipotermia_sepi_low = new FuzzyRuleAntecedent();
hipotermia_sepi_low->joinWithAND(hipotermia, sepi);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, hipotermia_sepi_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule1);
// Building FuzzyRule 2
FuzzyRuleAntecedent *hipotermia_sedang_low = new FuzzyRuleAntecedent();
hipotermia_sedang_low->joinWithAND(hipotermia, sedang);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, hipotermia_sedang_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule2);
// Building FuzzyRule 3
FuzzyRuleAntecedent *hipotermia_penuh_medium = new FuzzyRuleAntecedent();
hipotermia_penuh_medium->joinWithAND(hipotermia, penuh);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, hipotermia_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule3);
// Building FuzzyRule 4
FuzzyRuleAntecedent *hipotermia_sangatPenuh_high = new FuzzyRuleAntecedent();
hipotermia_sangatPenuh_high->joinWithAND(hipotermia, sangatPenuh);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, hipotermia_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule4);
// Building FuzzyRule 5
FuzzyRuleAntecedent *normal_sepi_low = new FuzzyRuleAntecedent();
normal_sepi_low->joinWithAND(normal, sepi);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, normal_sepi_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule5);
// Building FuzzyRule 6
FuzzyRuleAntecedent *normal_sedang_low = new FuzzyRuleAntecedent();
normal_sedang_low->joinWithAND(normal, sedang);
FuzzyRule *fuzzyRule6 = new FuzzyRule(6, normal_sedang_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule6);
// Building FuzzyRule 7
FuzzyRuleAntecedent *normal_penuh_medium = new FuzzyRuleAntecedent();
normal_penuh_medium->joinWithAND(normal, penuh);
FuzzyRule *fuzzyRule7 = new FuzzyRule(7, normal_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule7);
// Building FuzzyRule 8
FuzzyRuleAntecedent *normal_sangatPenuh_high = new FuzzyRuleAntecedent();
normal_sangatPenuh_high->joinWithAND(normal, sangatPenuh);
FuzzyRule *fuzzyRule8 = new FuzzyRule(8, normal_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule8);
// Building FuzzyRule 9
FuzzyRuleAntecedent *demam_sepi_medium = new FuzzyRuleAntecedent();
demam_sepi_medium->joinWithAND(demam, sepi);
FuzzyRule *fuzzyRule9 = new FuzzyRule(9, demam_sepi_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule9);
// Building FuzzyRule 10
FuzzyRuleAntecedent *demam_sedang_medium = new FuzzyRuleAntecedent();
demam_sedang_medium->joinWithAND(demam, sedang);
FuzzyRule *fuzzyRule10 = new FuzzyRule(10, demam_sedang_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule10);
// Building FuzzyRule 11
FuzzyRuleAntecedent *demam_penuh_medium = new FuzzyRuleAntecedent();
demam_penuh_medium->joinWithAND(demam, penuh);
FuzzyRule *fuzzyRule11 = new FuzzyRule(11, demam_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule11);
// Building FuzzyRule 12
FuzzyRuleAntecedent *demam_sangatPenuh_high = new FuzzyRuleAntecedent();
demam_sangatPenuh_high->joinWithAND(demam, sangatPenuh);
FuzzyRule *fuzzyRule12 = new FuzzyRule(12, demam_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule12);
// Building FuzzyRule 13
FuzzyRuleAntecedent *demamTinggi_sepi_high = new FuzzyRuleAntecedent();
demamTinggi_sepi_high->joinWithAND(demamTinggi, sepi);
FuzzyRule *fuzzyRule13 = new FuzzyRule(13, demamTinggi_sepi_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule13);
// Building FuzzyRule 14
FuzzyRuleAntecedent *demamTinggi_sedang_high = new FuzzyRuleAntecedent();
demamTinggi_sedang_high->joinWithAND(demamTinggi, sedang);
FuzzyRule *fuzzyRule14 = new FuzzyRule(14, demamTinggi_sedang_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule14);
// Building FuzzyRule 15
FuzzyRuleAntecedent *demamTinggi_penuh_high = new FuzzyRuleAntecedent();
demamTinggi_penuh_high->joinWithAND(demamTinggi, penuh);
FuzzyRule *fuzzyRule15 = new FuzzyRule(15, demamTinggi_penuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule15);
// Building FuzzyRule 16
FuzzyRuleAntecedent *demamTinggi_sangatPenuh_high = new FuzzyRuleAntecedent();
demamTinggi_sangatPenuh_high->joinWithAND(demamTinggi, sangatPenuh);
FuzzyRule *fuzzyRule16 = new FuzzyRule(16, demamTinggi_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule16);
}
//float fuzzy1;
void loop() {
// put your main code here, to run repeatedly:
temp= mlx.get_object_temp();
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
if (millis() > 5000 && gps.charsProcessed() < 10){
Serial.println(F(“No GPS detected: check wiring.”));
while(true);
}
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
//Show UID on serial monitor
Serial.print(“UID tag :”);
for (i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “);
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print(“Message : “);
//content.toUpperCase();
if(content!= “0”){
delay(500);
lcd.clear();
lcd.setCursor(0,1);lcd.print(“Card detected!”);
beepBuzzer();
lcd.clear();
lcd.setCursor(0,0);lcd.print(“Your body temp…”);
lcd.setCursor(0,1);lcd.print(temp);
lcd.print(” “);
delay(2000);
lcd.clear();
lcd.setCursor(0,1);lcd.print(“Fuzzy Process..”);
delay(2000);
lcd.clear();
fuzzy->setInput(2, float(36.5));//in 1
fuzzy->setInput(1, float(10));//in 2
fuzzy->fuzzify();
float fuzzy1 = fuzzy->defuzzify(1);
Serial.print(“Fuzzy:”);Serial.println(fuzzy1);
lcd.setCursor(0,0);lcd.print(“Fuzzy:”);
lcd.setCursor(6,0);lcd.print(fuzzy1);
lcd.print(” “);
lcd.setCursor(0,1);lcd.print(“Pas:”);
lcd.setCursor(4,1);lcd.print(penumpang);
delay(2000);
if(fuzzy1>=0 && fuzzy1<=40){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Result…”);
lcd.setCursor(0,1);
lcd.print(“NORMAL”);
delay(2000);
lcd.clear();
//Blynk.virtualWrite(V2,passanger);
for(int i=0;i<50; i++){
//door_open(170);
}
//door_off(0);
lcd.clear();
delay(3000);
for(int i=0;i<50; i++){
//door_close(170);
}
lcd.clear();
penumpang++;
}
else if(fuzzy1>40 && fuzzy1<=60){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Result…”);
lcd.setCursor(0,1);
lcd.print(“MEDIUM”);
delay(2000);
lcd.clear();
//Blynk.virtualWrite(V2,passanger);
for(int i=0;i<50; i++){
//door_open(170);
}
//door_off(0);
lcd.clear();
delay(3000);
for(int i=0;i<50; i++){
//door_close(170);
}
lcd.clear();
penumpang++;
}
else{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Result…”);
lcd.setCursor(0,1);
lcd.print(“HIGH”);
digitalWrite(buzzer, HIGH);
delay(2000);
digitalWrite(buzzer, LOW);
lcd.clear();
}
}
lcd.setCursor(0,0);lcd.print(“Tap U’re Card!”);
lcd.setCursor(0,1);lcd.print(“P:”);
lcd.setCursor(2,1);lcd.print(penumpang);
delay(20000);
/*
if (millis() – tsLastTime > 1000){
mySerial.print(gpsLat);
Serial.print(gpsLat);
mySerial.print(‘,’);
Serial.print(‘,’);
mySerial.print(gpsLon);
Serial.print(gpsLon);
mySerial.print(‘,’);
Serial.print(‘,’);
mySerial.print(mlx.get_object_temp());
Serial.print(mlx.get_object_temp());
mySerial.print(‘,’);
Serial.print(‘,’);
mySerial.print(mlx.get_ambient_temp());
Serial.print(mlx.get_ambient_temp());
mySerial.print(‘,’);
Serial.print(‘,’);
mySerial.print(uuid_card);
Serial.print(uuid_card);
mySerial.print(‘\n’);
Serial.println();
tsLastTime= millis();
uuid_card=””;
}
*/
}
void displayInfo(){
Serial.print(F(“Location: “));
if (gps.location.isValid()){
gpsLat=gps.location.lat();
gpsLon= gps.location.lng();
Serial.print(gps.location.lat(), 6);
Serial.print(F(“,”));
Serial.print(gps.location.lng(), 6);
}else{
Serial.print(F(“INVALID”));
}
Serial.print(F(” Date/Time: “));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F(“/”));
Serial.print(gps.date.day());
Serial.print(F(“/”));
Serial.print(gps.date.year());
}
else
{
Serial.print(F(“INVALID”));
}
Serial.print(F(” “));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F(“0”));
Serial.print(gps.time.hour());
Serial.print(F(“:”));
if (gps.time.minute() < 10) Serial.print(F(“0”));
Serial.print(gps.time.minute());
Serial.print(F(“:”));
if (gps.time.second() < 10) Serial.print(F(“0”));
Serial.print(gps.time.second());
Serial.print(F(“.”));
if (gps.time.centisecond() < 10) Serial.print(F(“0”));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F(“INVALID”));
}
Serial.println();
}
/*
void setupFuzzy(){
// FuzzyInput
FuzzyInput *temperature = new FuzzyInput(1);//2
temperature->addFuzzySet(hipotermia);
temperature->addFuzzySet(normal);
temperature->addFuzzySet(demam);
temperature->addFuzzySet(demamTinggi);
fuzzy->addFuzzyInput(temperature);
FuzzyInput *passenger = new FuzzyInput(2);//2
passenger->addFuzzySet(sepi);
passenger->addFuzzySet(sedang);
passenger->addFuzzySet(penuh);
passenger->addFuzzySet(sangatPenuh);
fuzzy->addFuzzyInput(passenger);
// FuzzyOutput
FuzzyOutput *risk = new FuzzyOutput(1);
risk->addFuzzySet(low);
risk->addFuzzySet(medium);
risk->addFuzzySet(high);
fuzzy->addFuzzyOutput(risk);
// Building FuzzyRule 1
FuzzyRuleConsequent *then_low = new FuzzyRuleConsequent();
then_low->addOutput(low);
FuzzyRuleConsequent *then_medium = new FuzzyRuleConsequent();
then_medium->addOutput(medium);
FuzzyRuleConsequent *then_high = new FuzzyRuleConsequent();
then_high->addOutput(high);
//Building Rule1
FuzzyRuleAntecedent *hipotermia_sepi_low = new FuzzyRuleAntecedent();
hipotermia_sepi_low->joinWithAND(hipotermia, sepi);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, hipotermia_sepi_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule1);
// Building FuzzyRule 2
FuzzyRuleAntecedent *hipotermia_sedang_low = new FuzzyRuleAntecedent();
hipotermia_sedang_low->joinWithAND(hipotermia, sedang);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, hipotermia_sedang_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule2);
// Building FuzzyRule 3
FuzzyRuleAntecedent *hipotermia_penuh_medium = new FuzzyRuleAntecedent();
hipotermia_penuh_medium->joinWithAND(hipotermia, penuh);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, hipotermia_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule3);
// Building FuzzyRule 4
FuzzyRuleAntecedent *hipotermia_sangatPenuh_high = new FuzzyRuleAntecedent();
hipotermia_sangatPenuh_high->joinWithAND(hipotermia, sangatPenuh);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, hipotermia_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule4);
// Building FuzzyRule 5
FuzzyRuleAntecedent *normal_sepi_low = new FuzzyRuleAntecedent();
normal_sepi_low->joinWithAND(normal, sepi);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, normal_sepi_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule5);
// Building FuzzyRule 6
FuzzyRuleAntecedent *normal_sedang_low = new FuzzyRuleAntecedent();
normal_sedang_low->joinWithAND(normal, sedang);
FuzzyRule *fuzzyRule6 = new FuzzyRule(6, normal_sedang_low, then_low);
fuzzy->addFuzzyRule(fuzzyRule6);
// Building FuzzyRule 7
FuzzyRuleAntecedent *normal_penuh_medium = new FuzzyRuleAntecedent();
normal_penuh_medium->joinWithAND(normal, penuh);
FuzzyRule *fuzzyRule7 = new FuzzyRule(7, normal_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule7);
// Building FuzzyRule 8
FuzzyRuleAntecedent *normal_sangatPenuh_high = new FuzzyRuleAntecedent();
normal_sangatPenuh_high->joinWithAND(normal, sangatPenuh);
FuzzyRule *fuzzyRule8 = new FuzzyRule(8, normal_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule8);
// Building FuzzyRule 9
FuzzyRuleAntecedent *demam_sepi_medium = new FuzzyRuleAntecedent();
demam_sepi_medium->joinWithAND(demam, sepi);
FuzzyRule *fuzzyRule9 = new FuzzyRule(9, demam_sepi_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule9);
// Building FuzzyRule 10
FuzzyRuleAntecedent *demam_sedang_medium = new FuzzyRuleAntecedent();
demam_sedang_medium->joinWithAND(demam, sedang);
FuzzyRule *fuzzyRule10 = new FuzzyRule(10, demam_sedang_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule10);
// Building FuzzyRule 11
FuzzyRuleAntecedent *demam_penuh_medium = new FuzzyRuleAntecedent();
demam_penuh_medium->joinWithAND(demam, penuh);
FuzzyRule *fuzzyRule11 = new FuzzyRule(11, demam_penuh_medium, then_medium);
fuzzy->addFuzzyRule(fuzzyRule11);
// Building FuzzyRule 12
FuzzyRuleAntecedent *demam_sangatPenuh_high = new FuzzyRuleAntecedent();
demam_sangatPenuh_high->joinWithAND(demam, sangatPenuh);
FuzzyRule *fuzzyRule12 = new FuzzyRule(12, demam_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule12);
// Building FuzzyRule 13
FuzzyRuleAntecedent *demamTinggi_sepi_high = new FuzzyRuleAntecedent();
demamTinggi_sepi_high->joinWithAND(demamTinggi, sepi);
FuzzyRule *fuzzyRule13 = new FuzzyRule(13, demamTinggi_sepi_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule13);
// Building FuzzyRule 14
FuzzyRuleAntecedent *demamTinggi_sedang_high = new FuzzyRuleAntecedent();
demamTinggi_sedang_high->joinWithAND(demamTinggi, sedang);
FuzzyRule *fuzzyRule14 = new FuzzyRule(14, demamTinggi_sedang_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule14);
// Building FuzzyRule 15
FuzzyRuleAntecedent *demamTinggi_penuh_high = new FuzzyRuleAntecedent();
demamTinggi_penuh_high->joinWithAND(demamTinggi, penuh);
FuzzyRule *fuzzyRule15 = new FuzzyRule(15, demamTinggi_penuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule15);
// Building FuzzyRule 16
FuzzyRuleAntecedent *demamTinggi_sangatPenuh_high = new FuzzyRuleAntecedent();
demamTinggi_sangatPenuh_high->joinWithAND(demamTinggi, sangatPenuh);
FuzzyRule *fuzzyRule16 = new FuzzyRule(16, demamTinggi_sangatPenuh_high, then_high);
fuzzy->addFuzzyRule(fuzzyRule16);
}
*/
void lcdWelcome(){
lcd.begin();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(“N AMALIA R”);
lcd.setCursor(0,1);
lcd.print(“4619217004”);
delay(2000);
lcd.clear();
}
void beepBuzzer(){
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
delay(50);
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
}
void fuzzyResult(float fuzzy){
}


