#include "DHT.h"
#define DHTPIN 12
#define DHTTYPE DHT22
#define LED1 2
#define LED2 4
#define LED3 5
DHT dht(DHTPIN, DHTTYPE);
float trimf(float x, float a, float b, float c) {
if (a == b) {
if (x <= a) return 1;
if (x >= c) return 0;
return (c - x) / (c - b);
}
if (b == c) {
if (x <= a) return 0;
if (x >= c) return 1;
return (x - a) / (b - a);
}
if (x <= a || x >= c) return 0;
if (x == b) return 1;
if (x < b) return (x - a) / (b - a);
return (c - x) / (c - b);
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) return;
// Fuzzification
float lowT = trimf(temp, 0, 0, 20);
float midT = trimf(temp, 10, 25, 30);
float highT = trimf(temp, 20, 40, 40);
float lowH = trimf(humi, 0, 0, 40);
float midH = trimf(humi, 30, 50, 70);
float highH = trimf(humi, 60, 100, 100);
// Rule Evaluation
float r_high = max(min(midT, lowH), min(highT, lowH)); // 3 LED
float r_mid = max(min(midT, midH), min(highT, midH)); // 2 LED
float r_low = max(max(lowT, highH), min(lowT, midH)); // 1 LED
// Defuzzification
int ledLevel = 1;
float maxVal = r_low;
if (r_mid > maxVal) {
maxVal = r_mid;
ledLevel = 2;
}
if (r_high > maxVal) {
maxVal = r_high;
ledLevel = 3;
}
// Output
digitalWrite(LED1, HIGH);
digitalWrite(LED2, (ledLevel >= 2) ? HIGH : LOW);
digitalWrite(LED3, (ledLevel >= 3) ? HIGH : LOW);
Serial.print("T: "); Serial.print(temp);
Serial.print("°C | H: "); Serial.print(humi);
Serial.print("% | Level: "); Serial.println(ledLevel);
delay(500);
}