#include <Fuzzy.h>
Fuzzy *fuzzy = new Fuzzy();
#define ADC_VREF_mV 5000.0 // in millivolt
#define ADC_RESOLUTION 4095.0
#define PIN_LM35 A0
#define SUHU_TUBUH A1
byte ledpin1 = 0;
byte ledpin2 = 1;
byte ledpin3 = 2;
byte ledpin4 = 3;
byte ledpin5 = 4;
byte ledpin6 = 5;
byte ledpin7 = 6;
byte ledpin8 = 7;
/*
//input 1
FuzzySet *tempLow = new FuzzySet (0, 0, 10, 17);
FuzzySet *tempMedium = new FuzzySet (10, 17, 20, 23);
FuzzySet *tempHigh = new FuzzySet (20, 23, 30, 30);
//input 2
FuzzySet *randomLow = new FuzzySet (0, 0, 100, 150);
FuzzySet *randomHigh = new FuzzySet (100, 150, 200, 200);
//output
FuzzySet *fanSlow = new FuzzySet (0, 0, 25, 30);
FuzzySet *fanAverage = new FuzzySet (25, 30, 40, 45);
FuzzySet *fanFast = new FuzzySet (40, 45, 50, 50); */
void setup()
{
Serial.begin(9600);
pinMode(ledpin1, OUTPUT);
pinMode(ledpin2, OUTPUT);
pinMode(ledpin3, OUTPUT);
pinMode(ledpin4, OUTPUT);
pinMode(ledpin5, OUTPUT);
pinMode(ledpin6, OUTPUT);
pinMode(ledpin7, OUTPUT);
pinMode(ledpin8, OUTPUT);
FuzzyInput *temperature = new FuzzyInput(1);
FuzzySet *tempLow = new FuzzySet (0, 0, 5, 15);
temperature->addFuzzySet (tempLow);
FuzzySet *tempMedium = new FuzzySet (5, 15, 20, 25);
temperature->addFuzzySet (tempMedium);
FuzzySet *tempHigh = new FuzzySet (20, 25, 30, 30);
temperature->addFuzzySet (tempHigh);
fuzzy->addFuzzyInput (temperature);
FuzzyInput *bodytemper = new FuzzyInput(2);
FuzzySet *bodLow = new FuzzySet (0, 0, 5, 20);
bodytemper->addFuzzySet (bodLow);
FuzzySet *bodHigh = new FuzzySet (5, 20, 35, 35);
bodytemper->addFuzzySet (bodHigh);
fuzzy->addFuzzyInput (bodytemper);
FuzzyOutput *outfan = new FuzzyOutput(1);
FuzzySet *fanSlow = new FuzzySet (0, 0, 10, 20);
outfan->addFuzzySet (fanSlow);
FuzzySet *fanAverage = new FuzzySet (10, 20, 30, 40);
outfan->addFuzzySet (fanAverage);
FuzzySet *fanFast = new FuzzySet (30, 40, 50, 50);
outfan->addFuzzySet (fanFast);
fuzzy->addFuzzyOutput (outfan);
/*
//rule 1 single
FuzzyRuleAntecedent *iftempLow = new FuzzyRuleAntecedent();
iftempLow->joinSingle(tempLow);
FuzzyRuleConsequent *thenfanslow = new FuzzyRuleConsequent();
thenfanslow ->addOutput(fanSlow);
FuzzyRule *fuzzyRulel = new FuzzyRule(1, iftempLow, thenfanslow);
fuzzy->addFuzzyRule(fuzzyRulel);
//rule 2 single
FuzzyRuleAntecedent *iftempMed = new FuzzyRuleAntecedent();
iftempMed->joinSingle(tempMedium);
FuzzyRuleConsequent *thenfanave = new FuzzyRuleConsequent();
thenfanave->addOutput(fanSlow);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, iftempMed, thenfanave);
fuzzy->addFuzzyRule(fuzzyRule2);
//rule 3 single
FuzzyRuleAntecedent *iftempHigh = new FuzzyRuleAntecedent();
iftempHigh->joinSingle(tempHigh);
FuzzyRuleConsequent *thenfanfast = new FuzzyRuleConsequent();
thenfanfast->addOutput(fanAverage);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, iftempHigh, thenfanfast);
fuzzy->addFuzzyRule(fuzzyRule3); */
//rule 1
FuzzyRuleAntecedent *tempLow_bodLow = new FuzzyRuleAntecedent();
tempLow_bodLow->joinWithAND(tempLow, bodLow);
FuzzyRuleConsequent *fanslow1 = new FuzzyRuleConsequent();
fanslow1 ->addOutput(fanSlow);
FuzzyRule *fuzzyRulel = new FuzzyRule(1, tempLow_bodLow, fanslow1);
fuzzy->addFuzzyRule(fuzzyRulel);
//rule 2
FuzzyRuleAntecedent *tempLow_bodHigh = new FuzzyRuleAntecedent();
tempLow_bodHigh->joinWithAND(tempLow, bodHigh);
FuzzyRuleConsequent *fanave1 = new FuzzyRuleConsequent();
fanave1->addOutput(fanAverage);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, tempLow_bodHigh, fanave1);
fuzzy->addFuzzyRule(fuzzyRule2);
//rule 3
FuzzyRuleAntecedent *tempMedium_bodLow = new FuzzyRuleAntecedent();
tempMedium_bodLow->joinWithAND(tempMedium, bodLow);
FuzzyRuleConsequent *fanslow2 = new FuzzyRuleConsequent();
fanslow2->addOutput(fanSlow);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, tempMedium_bodLow, fanslow2);
fuzzy->addFuzzyRule(fuzzyRule3);
//rule 4
FuzzyRuleAntecedent *tempMedium_bodHigh = new FuzzyRuleAntecedent();
tempMedium_bodHigh->joinWithAND(tempMedium, bodHigh);
FuzzyRuleConsequent *fanfast1 = new FuzzyRuleConsequent();
fanfast1->addOutput(fanFast);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, tempMedium_bodHigh, fanfast1);
fuzzy->addFuzzyRule(fuzzyRule4);
//rule 5
FuzzyRuleAntecedent *tempHigh_bodLow = new FuzzyRuleAntecedent();
tempHigh_bodLow->joinWithAND(tempHigh, bodLow);
FuzzyRuleConsequent *fanave3 = new FuzzyRuleConsequent();
fanave3->addOutput(fanAverage);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, tempHigh_bodLow, fanave3);
fuzzy->addFuzzyRule(fuzzyRule5);
//rule 6
FuzzyRuleAntecedent *tempHigh_bodHigh= new FuzzyRuleAntecedent();
tempHigh_bodHigh->joinWithAND(tempHigh, bodHigh);
FuzzyRuleConsequent *fanfast2 = new FuzzyRuleConsequent();
fanfast2->addOutput(fanFast);
FuzzyRule *fuzzyRule6 = new FuzzyRule(6, tempHigh_bodHigh, fanfast2);
fuzzy->addFuzzyRule(fuzzyRule6);
}
void loop()
{
float pencacah = random(-10,10);
float bodtemp = analogRead(SUHU_TUBUH);
float adcVal = analogRead(PIN_LM35);
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
float rumus = (milliVolt / 10);
float in_temperature = rumus + pencacah;
float in_bodytemp = map(bodtemp, 0, 1024, 0, 35);
fuzzy->setInput (1, in_temperature);
fuzzy->setInput (2, in_bodytemp);
float fuzziiii = fuzzy->fuzzify ();
float out_fan = fuzzy->defuzzify(1);
if (out_fan>=0 && out_fan<=10.0) {
digitalWrite(ledpin1, LOW);
digitalWrite(ledpin2, LOW);
digitalWrite(ledpin3, LOW);
digitalWrite(ledpin4, HIGH);
digitalWrite(ledpin5, HIGH);
digitalWrite(ledpin6, HIGH);
digitalWrite(ledpin7, HIGH);
digitalWrite(ledpin8, HIGH);
}
else if (out_fan>=10.1 && out_fan<=20.0) {
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, HIGH);
digitalWrite(ledpin3, LOW);
digitalWrite(ledpin4, LOW);
digitalWrite(ledpin5, HIGH);
digitalWrite(ledpin6, HIGH);
digitalWrite(ledpin7, HIGH);
digitalWrite(ledpin8, HIGH);
}
else if (out_fan>=20.1 && out_fan<=30.0) {
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, HIGH);
digitalWrite(ledpin3, HIGH);
digitalWrite(ledpin4, LOW);
digitalWrite(ledpin5, LOW);
digitalWrite(ledpin6, HIGH);
digitalWrite(ledpin7, HIGH);
digitalWrite(ledpin8, HIGH);
}
else if (out_fan>=30.1 && out_fan<=40.0) {
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, HIGH);
digitalWrite(ledpin3, HIGH);
digitalWrite(ledpin4, HIGH);
digitalWrite(ledpin5, LOW);
digitalWrite(ledpin6, LOW);
digitalWrite(ledpin7, HIGH);
digitalWrite(ledpin8, HIGH);
}
else if (out_fan>=40.1 && out_fan<=50.0) {
digitalWrite(ledpin1, HIGH);
digitalWrite(ledpin2, HIGH);
digitalWrite(ledpin3, HIGH);
digitalWrite(ledpin4, HIGH);
digitalWrite(ledpin5, HIGH);
digitalWrite(ledpin6, LOW);
digitalWrite(ledpin7, LOW);
digitalWrite(ledpin8, LOW);
}
Serial.print("");
Serial.print("Suhu Ruangan = ");
Serial.print(in_temperature); Serial.println(" °C");
Serial.print("Suhu Tubuh = ");
Serial.print(in_bodytemp); Serial.println(" °C");
Serial.print("Kecepatan Kipas = ");
Serial.print(out_fan); Serial.println(" rpm");
delay(1000);
}