#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 2 // Pin untuk sensor DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT
#define BUZZER_PIN 3 // Pin untuk buzzer
#define LED_PIN 4 // Pin untuk LED
#define POT_PIN A0 // Pin untuk potentiometer
#define GAS_SENSOR_PIN A1 // Pin untuk sensor gas MQ-2
// Alamat I2C untuk LCD 16x2
#define I2C_ADDRESS 0x27
LiquidCrystal_I2C lcd(I2C_ADDRESS, 16, 2); // Inisialisasi LCD
DHT dht(DHTPIN, DHTTYPE);
// Fungsi untuk fuzzifikasi suhu
float fuzzifyTemperature(float temperature) {
if (temperature < 20) return 1; // Dingin
else if (temperature >= 20 && temperature <= 30) return (30 - temperature) / 10; // Normal
else return 0; // Panas
}
// Fungsi untuk fuzzifikasi kadar gas
float fuzzifyGas(float gasLevel) {
if (gasLevel < 300) return 1; // Rendah
else if (gasLevel >= 300 && gasLevel <= 700) return (700 - gasLevel) / 400; // Sedang
else return 0; // Tinggi
}
// Fungsi inferensi dan defuzzifikasi
String inferAndDefuzzify(float temperature, float gasLevel) {
float tempMembership = fuzzifyTemperature(temperature);
float gasMembership = fuzzifyGas(gasLevel);
float dangerLevel = min(tempMembership, gasMembership); // Menggunakan min untuk inferensi
if (dangerLevel > 0.5) {
return "Bahaya";
} else if (tempMembership > 0 || gasMembership > 0) {
return "Waspada";
} else {
return "Aman";
}
}
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight jika ada
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
delay(2000); // Tunggu beberapa detik antara pembacaan
float h = dht.readHumidity(); // Membaca kelembapan
float t = dht.readTemperature(); // Membaca suhu dari sensor DHT22
// Membaca nilai dari sensor gas MQ-2
int gasValue = analogRead(GAS_SENSOR_PIN);
float gasLevel = map(gasValue, 0, 1023, 0, 1000); // Mengonversi nilai analog ke ppm
// Menggunakan nilai dari potentiometer sebagai input suhu manual
int potValue = analogRead(POT_PIN);
float manualTemperature = map(potValue, 0, 1023, -10, 50); // Rentang suhu manual dari -10°C hingga 50°C
// Cek apakah pembacaan gagal
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca dari DHT sensor!");
return;
}
// Menampilkan data di LCD dengan format yang diinginkan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(manualTemperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Gas: ");
lcd.print(gasLevel);
lcd.print(" ppm");
// Inferensi dan defuzzifikasi untuk menentukan status keselamatan
String safetyStatus = inferAndDefuzzify(manualTemperature, gasLevel);
if (safetyStatus == "Bahaya") {
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer
digitalWrite(LED_PIN, HIGH); // Nyalakan LED
lcd.setCursor(0, 1);
lcd.print("ALERT: Bahaya! ");
Serial.println("ALERT: Bahaya!");
delay(1000); // Delay untuk memberi waktu tampilan alert sebelum refresh LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status: Bahaya");
} else if (safetyStatus == "Waspada") {
digitalWrite(BUZZER_PIN, LOW); // Nonaktifkan buzzer
digitalWrite(LED_PIN, HIGH); // Nyalakan LED
lcd.setCursor(0, 1);
lcd.print("Waspada! ");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status: Waspada");
} else {
digitalWrite(BUZZER_PIN, LOW); // Nonaktifkan buzzer
digitalWrite(LED_PIN, LOW); // Matikan LED
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status: Aman");
}
Serial.print("Suhu: ");
Serial.print(manualTemperature);
Serial.print(" °C, Kelembapan: ");
Serial.print(h);
Serial.print(" %, Gas: ");
Serial.print(gasLevel);
Serial.println(" ppm");
}