// Library untuk DHT22, LCD I2C, dan Buzzer
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 // Pin DHT22 dihubungkan ke pin digital 2
#define DHTTYPE DHT22 // Tipe sensor DHT22
#define BUZZER_PIN 13 // Buzzer dihubungkan ke pin digital 3
DHT dht(DHTPIN, DHTTYPE);
// Inisialisasi LCD dengan alamat 0x27 dan ukuran 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(20, 4); // Perbaikan di sini
lcd.backlight(); // Nyalakan lampu latar LCD
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
lcd.setCursor(0, 0);
lcd.print("Suhu & Kelembapan");
delay(2000);
}
void loop() {
delay(2000); // Delay 2 detik
float suhu = dht.readTemperature();
float kelembapan = dht.readHumidity();
if (isnan(suhu) || isnan(kelembapan)) {
Serial.println("Gagal membaca sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gagal Baca Sensor");
return;
}
// Fuzzyfikasi Suhu
float muRendahSuhu = (suhu <= 30) ? 1 : (suhu >= 60) ? 0 : (60 - suhu) / 30.0;
float muSedangSuhu = (suhu <= 30 || suhu >= 60) ? 0 : (suhu - 30) / 30.0;
float muTinggiSuhu = (suhu >= 60) ? 1 : 0;
// Fuzzyfikasi Kelembapan
float muKeringKelembapan = (kelembapan <= 20) ? 1 : (kelembapan >= 50) ? 0 : (50 - kelembapan) / 30.0;
float muNormalKelembapan = (kelembapan <= 20 || kelembapan >= 50) ? 0 : (kelembapan - 20) / 30.0;
float muBasahKelembapan = (kelembapan >= 50) ? 1 : 0;
// α-Predikat dan Z untuk masing-masing aturan
float alpha[9], z[9];
alpha[0] = min(muRendahSuhu, muKeringKelembapan); z[0] = 50;
alpha[1] = min(muRendahSuhu, muNormalKelembapan); z[1] = 30;
alpha[2] = min(muRendahSuhu, muBasahKelembapan); z[2] = 200;
alpha[3] = min(muSedangSuhu, muKeringKelembapan); z[3] = 80;
alpha[4] = min(muSedangSuhu, muNormalKelembapan); z[4] = 60;
alpha[5] = min(muSedangSuhu, muBasahKelembapan); z[5] = 200;
alpha[6] = min(muTinggiSuhu, muKeringKelembapan); z[6] = 110;
alpha[7] = min(muTinggiSuhu, muNormalKelembapan); z[7] = 90;
alpha[8] = min(muTinggiSuhu, muBasahKelembapan); z[8] = 200;
// Defuzzifikasi Sugeno
float sumAlphaZ = 0, sumAlpha = 0;
for (int i = 0; i < 9; i++) {
sumAlphaZ += alpha[i] * z[i];
sumAlpha += alpha[i];
}
float Z = (sumAlpha != 0) ? (sumAlphaZ / sumAlpha) : 0;
// Output ke Serial Monitor
Serial.println("=====================================");
Serial.println(" Data Suhu dan Kelembapan ");
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" °C, Kelembapan: ");
Serial.print(kelembapan);
Serial.print(" %, Nilai Defuzzifikasi: ");
Serial.println(Z);
Serial.println("=====================================");
// Tampilkan data di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembapan: ");
lcd.print(kelembapan);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Defuzz: ");
lcd.print(Z);
// Kontrol Buzzer berdasarkan hasil inferensi
if (Z >= 100) {
digitalWrite(BUZZER_PIN, HIGH); // Bahaya
} else if (Z >= 60) {
tone(BUZZER_PIN, 1000, 500); // Waspada
} else {
digitalWrite(BUZZER_PIN, LOW); // Aman
}
delay(2000); // Delay sebelum pembacaan berikutnya
}