#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
const int DHT_PIN = 15;
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
float fuzzySugeno(float suhu, float kelembaban);
float min(float a, float b) {
return a < b ? a : b;
}
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
lcd.init();
lcd.backlight();
}
// Tentukan fungsi keanggotaan untuk suhu (Dingin, Normal, Panas)
float suhuDingin(float suhu){
if(suhu >= 17 && suhu <= 23)
return (23 - suhu) / (23 - 17);
else
return 0;
}
float suhuNormal(float suhu){
if(suhu >= 17 && suhu <= 23)
return (suhu - 17) / (23 - 17);
else if(suhu >= 23 && suhu <= 35)
return (35 - suhu) / (35 - 23);
else
return 0;
}
float suhuPanas(float suhu){
if(suhu >= 23 && suhu <= 35)
return (suhu - 23) / (35 - 23);
else
return 0;
}
float humadityLembab(float kelembaban){
if(kelembaban >= 30 && kelembaban <= 60)
return (50 - kelembaban) / (50 - 30);
else
return 0;
}
float humadityNormal(float kelembaban){
if(kelembaban >= 30 && kelembaban <= 60)
return (kelembaban - 30) / (60 - 30);
else if(kelembaban >= 60 && kelembaban <= 90)
return (90 - kelembaban) / (90 - 60);
else
return 0;
}
float humadityKering(float kelembaban){
if(kelembaban >= 60 && kelembaban <= 90)
return (kelembaban - 60) / (90 - 60);
else
return 0;
}
// Fungsi untuk menerapkan logika fuzzy
float fuzzySugeno(float suhu, float kelembaban) {
// Aturan 1
float rule1 = min(suhuDingin(suhu), humadityLembab(kelembaban));
float output1 = 25;
// Aturan 2
float rule2 = min(suhuDingin(suhu), humadityNormal(kelembaban));
float output2 = 50;
// Aturan 3
float rule3 = min(suhuDingin(suhu), humadityKering(kelembaban));
float output3 = 25;
// Aturan 4
float rule4 = min(suhuNormal(suhu), humadityLembab(kelembaban));
float output4 = 25;
// Aturan 5
float rule5 = min(suhuNormal(suhu), humadityNormal(kelembaban));
float output5 = 25;
// Aturan 6
float rule6 = min(suhuNormal(suhu), humadityKering(kelembaban));
float output6 = 0;
// Aturan 7
float rule7 = min(suhuPanas(suhu), humadityLembab(kelembaban));
float output7 = 25;
// Aturan 8
float rule8 = min(suhuPanas(suhu), humadityNormal(kelembaban));
float output8 = 0;
// Aturan 9
float rule9 = min(suhuPanas(suhu), humadityKering(kelembaban));
float output9 = 0;
// Defuzzifikasi
float totalMembership = 0;
float totalWeightedOutput = 0;
// Hitung nilai keanggotaan tiap aturan
totalMembership = totalMembership + rule1;
totalMembership = totalMembership + rule2;
totalMembership = totalMembership + rule3;
totalMembership = totalMembership + rule4;
totalMembership = totalMembership + rule5;
totalMembership = totalMembership + rule6;
totalMembership = totalMembership + rule7;
totalMembership = totalMembership + rule8;
totalMembership = totalMembership + rule9;
// Hitung nilai output terbobot tiap aturan
totalWeightedOutput = totalWeightedOutput + (rule1 * output1);
totalWeightedOutput = totalWeightedOutput + (rule2 * output2);
totalWeightedOutput = totalWeightedOutput + (rule3 * output3);
totalWeightedOutput = totalWeightedOutput + (rule4 * output4);
totalWeightedOutput = totalWeightedOutput + (rule5 * output5);
totalWeightedOutput = totalWeightedOutput + (rule6 * output6);
totalWeightedOutput = totalWeightedOutput + (rule7 * output7);
totalWeightedOutput = totalWeightedOutput + (rule8 * output8);
totalWeightedOutput = totalWeightedOutput + (rule9 * output9);
// Hitung nilai defuzzifikasi
float defuzzifiedResult = totalWeightedOutput / totalMembership;
return defuzzifiedResult;
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 1) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("--");
lcd.setCursor(0, 0);
lcd.print("Suhu : " + String(data.temperature, 1) + "\xDF"+"C ");
lcd.setCursor(0, 1);
lcd.print("Kelembaban : " + String(data.humidity, 1) + "% ");
lcd.scrollDisplayLeft();
//lcd.print("Wokwi Online IoT");
// Hitung nilai kualitas udara dengan logika fuzzy
float PengukurSuhu = fuzzySugeno(data.temperature, data.humidity);
// Tampilkan data kualitas udara di Serial Monitor
Serial.print("Kualitas Suhu: ");
Serial.println(PengukurSuhu);
Serial.println("--------------------");
delay (3000);
}