#include <Arduino.h>
#include <DHT.h>
#include <Fuzzy.h>
// DHT22 setup
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Fuzzy *fuzzy = new Fuzzy();
void setup() {
Serial.begin(115200);
dht.begin();
// --- Fuzzy Input: Temperature ---
FuzzySet *low = new FuzzySet(0, 0, 20, 25);
FuzzySet *medium = new FuzzySet(22, 27, 30, 35);
FuzzySet *high = new FuzzySet(32, 38, 50, 50);
FuzzyInput *temperature = new FuzzyInput(1);
temperature->addFuzzySet(low);
temperature->addFuzzySet(medium);
temperature->addFuzzySet(high);
fuzzy->addFuzzyInput(temperature);
// --- Fuzzy Output: Speed (0–100%) ---
FuzzySet *slow = new FuzzySet(0, 0, 30, 40);
FuzzySet *moderate = new FuzzySet(35, 50, 65, 75);
FuzzySet *fast = new FuzzySet(70, 85, 100, 100);
FuzzyOutput *motorSpeed = new FuzzyOutput(1);
motorSpeed->addFuzzySet(slow);
motorSpeed->addFuzzySet(moderate);
motorSpeed->addFuzzySet(fast);
fuzzy->addFuzzyOutput(motorSpeed);
// --- Fuzzy Rules ---
FuzzyRuleAntecedent *ifLow = new FuzzyRuleAntecedent();
ifLow->joinSingle(low);
FuzzyRuleConsequent *thenSlow = new FuzzyRuleConsequent();
thenSlow->addOutput(slow);
fuzzy->addFuzzyRule(new FuzzyRule(1, ifLow, thenSlow));
FuzzyRuleAntecedent *ifMed = new FuzzyRuleAntecedent();
ifMed->joinSingle(medium);
FuzzyRuleConsequent *thenModerate = new FuzzyRuleConsequent();
thenModerate->addOutput(moderate);
fuzzy->addFuzzyRule(new FuzzyRule(2, ifMed, thenModerate));
FuzzyRuleAntecedent *ifHigh = new FuzzyRuleAntecedent();
ifHigh->joinSingle(high);
FuzzyRuleConsequent *thenFast = new FuzzyRuleConsequent();
thenFast->addOutput(fast);
fuzzy->addFuzzyRule(new FuzzyRule(3, ifHigh, thenFast));
}
void loop() {
float temp = dht.readTemperature();
if (isnan(temp)) {
Serial.println("Failed to read temperature!");
delay(1000);
return;
}
fuzzy->setInput(1, temp);
fuzzy->fuzzify();
int speedPercent = fuzzy->defuzzify(1); // Output range: 0–100
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" °C → Motor Speed: ");
Serial.print(speedPercent);
Serial.println("%");
delay(1000);
}