#include <Wire.h>
#include <LiquidCrystal.h>
// Konfigurasi LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD Setup
// Pin untuk sensor gas dan suhu
#define GasSensor A0
#define SuhuSensor A1
#define LedPin 13
#define BuzzerPin 7
#define RelayPin 8
// 20,30,35
// Fungsi untuk menghitung output fuzzy
float suhuDingin(float x) {
if (x <= 20.0) return 1.0;
else if (x > 20.0 && x <= 25.0) return (25.0 - x) / 5.0;
else return 0.0;
}
float suhuNormal(float x) {
if (x <= 20.0) return 0.0;
else if (x > 20.0 && x <= 25.0) return (x-20.0) / 5.0;
else if (x > 30.0 && x <= 35.0) return (35.0-x) / 5.0;
else return 0.0;
}
float suhuPanas(float x) {
if (x <= 30.0) return 0.0;
if (x > 30.0 && x <= 35.0) return (x-30.0) / 5.0;
else return 1.0;
}
// 500,1000,1250
// Fungsi fuzzy untuk konsentrasi gas
float gasRendah(float x) {
if (x <= 500.0) return 1.0;
else if (x > 500.0 && x <= 750.0) return (750.0-x) / 250.0;
else return 0.0;
}
float gasNormal(float x) {
if (x <= 500.0) return 0.0;
else if (x > 500.0 && x <= 750.0) return (x-500.0) / 250.0;
else if (x > 1000.0 && x <= 1250.0) return (1250.0-x) / 250.0;
else return 0.0;
}
float gasTinggi(float x) {
if (x <= 1000.0) return 0.0;
if (x > 1000.0 && x <= 1250.0) return (x-1000.0) / 250.0;
else return 1.0;
}
// Fungsi defuzzifikasi untuk menghitung output berdasarkan suhu dan konsentrasi gas
float defuzzifikasi(float suhu, float konsentrasi) {
// Menghitung nilai keanggotaan untuk suhu dan gas
float dingin = suhuDingin(suhu);
float normal = suhuNormal(suhu);
float panas = suhuPanas(suhu);
float rendah = gasRendah(konsentrasi);
float normalGas = gasNormal(konsentrasi);
float tinggi = gasTinggi(konsentrasi);
// Inferensi fuzzy untuk kondisi aman dan bahaya
float aman = max(
max(max(min(dingin, rendah), min(dingin, normalGas)),min(panas,rendah)),
max(max(min(normal, rendah), min(normal, normalGas)),min(panas, normalGas))
);
float bahaya = max(
max(min(dingin, tinggi), min(normal, tinggi)),
min(panas, tinggi)
);
// Rentang output, titik ambang berdasarkan keanggotaan aman dan bahaya
float t1 = aman * 1250.0 + 750.0; // Titik untuk kondisi aman
float t2 = bahaya * 1250.0 + 750.0; // Titik untuk kondisi bahaya
// Perhitungan m1, m2, m3 untuk menghitung kontribusi centroid
float m1 = aman * (t1 * t1 / 2) - aman * (0 * 0 / 2);
float m2 = (((t2 * t2 * t2 / 3) - (750.0 * (t2 * t2)) / 2) / 1250.0) -
(((t1 * t1 * t1 / 3) - (750.0 * (t1 * t1)) / 2) / 1250.0);
float m3 = bahaya * (2000.0 * 2000.0 / 2) - bahaya * (t2 * t2 / 2);
// Perhitungan a1, a2, a3 untuk menghitung luas area keanggotaan
float a1 = aman * t1 - aman * 0;
float a2 = ((((t2 * t2) / 2) - (750.0 * t2)) / 1250.0) -
((((t1 * t1) / 2) - (750.0 * t1)) / 1250.0);
float a3 = bahaya * 2000.0 - bahaya * t2;
// Menghindari pembagian dengan nol
if (a1 + a2 + a3 == 0) return 0;
// Menghitung centroid (z) dan mengembalikan nilai defuzzifikasi
float z = (m1 + m2 + m3) / (a1 + a2 + a3);
return z;
}
void setup() {
Serial.begin(115200);
lcd.begin(20, 4);
// Setup pin mode
pinMode(LedPin, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(RelayPin, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("Sistem Deteksi Gas");
delay(2000);
lcd.clear();
}
void loop() {
// Membaca data dari sensor
int gasAnalog = analogRead(GasSensor);
int suhuAnalog = analogRead(SuhuSensor);
// Mengonversi nilai sensor ke skala yang sesuai
float konsentrasi = map(gasAnalog, 0, 1023, 0, 2501);
float suhu = map(suhuAnalog, 0, 1023, 0, 45);
// Menggunakan metode defuzzifikasi untuk mendapatkan output
float nilaiDefuzzifikasi = defuzzifikasi(suhu, konsentrasi);
// Menampilkan hasil di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Konsentrasi: ");
lcd.print(konsentrasi);
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.setCursor(0, 2);
lcd.print("Output: ");
lcd.print(nilaiDefuzzifikasi);
// Menampilkan status aman atau bahaya di LCD
lcd.setCursor(0, 3);
if (nilaiDefuzzifikasi > 1500.0) { // Jika nilai defuzzifikasi lebih besar dari 0.5, dianggap "Bahaya"
lcd.print("Status: Bahaya");
} else {
lcd.print("Status: Aman");
}
// Logika untuk mengaktifkan Buzzer, LED, dan Relay
if (nilaiDefuzzifikasi >= 1500.0) { // Jika status berbahaya
digitalWrite(LedPin, HIGH); // Hidupkan LED
digitalWrite(BuzzerPin, HIGH); // Hidupkan Buzzer
tone(BuzzerPin, 262, 250); // Buzzer sound
digitalWrite(RelayPin, LOW); // Tutup Relay
} else { // Jika status aman
digitalWrite(LedPin, LOW); // Matikan LED
digitalWrite(BuzzerPin, LOW); // Matikan Buzzer
digitalWrite(RelayPin, HIGH); // Buka Relay
}
//Menampilkan hasil di Serial Monitor
Serial.println("=======================================");
Serial.println(" DETEKSI KEBOCORAN GAS ");
Serial.println("=======================================");
Serial.println("INPUT:");
Serial.print(" - Konsentrasi: ");
Serial.print(konsentrasi, 1);
Serial.println(" ppm");
Serial.print(" - Suhu: ");
Serial.print(suhu, 1);
Serial.println(" C");
Serial.println("---------------------------------------");
Serial.print("OUTPUT (Defuzzifikasi): ");
Serial.println(nilaiDefuzzifikasi);
if (nilaiDefuzzifikasi > 1500.0) {
Serial.println("Status: Bahaya");
} else {
Serial.println("Status: Aman");
}
Serial.println("=======================================");
delay(2000); // Delay untuk memberikan waktu antara pembacaan sensor
}