#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define LUX_CALC_EXPONENT -1.405
LiquidCrystal_I2C lcd(0x27, 5, 6);
#define PIN_DHT 2
#define TIPE_DHT DHT11
#define PIN_BUZZER 8 // Ganti dengan pin yang sesuai untuk buzzer
DHT dht(PIN_DHT, TIPE_DHT);
int buzzer = PIN_BUZZER; // Inisialisasi pin buzzer
void setup() {
Serial.begin(9600);
while (!Serial);
dht.begin();
lcd.begin(16, 2); // Inisialisasi LCD dengan 16 kolom dan 2 baris
lcd.backlight(); // Hidupkan backlight LCD
lcd.clear(); // Bersihkan tampilan LCD
lcd.setCursor(0, 0);
lcd.print("Prediksi Cuaca");
}
void loop() {
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
float kecepatanAngin = bacaKecepatanAngin(); // Fungsi baca kecepatan angin (implementasikan sesuai kebutuhan)
// Logika Fuzzy Mamdani
float keanggotaanSuhuRendah = hitungKeanggotaan(suhu, 20, 25);
float keanggotaanSuhuSedang = hitungKeanggotaan(suhu, 20, 30);
float keanggotaanSuhuTinggi = hitungKeanggotaan(suhu, 25, 30);
float keanggotaanKelembabanRendah = hitungKeanggotaan(kelembaban, 30, 40);
float keanggotaanKelembabanSedang = hitungKeanggotaan(kelembaban, 30, 60);
float keanggotaanKelembabanTinggi = hitungKeanggotaan(kelembaban, 40, 60);
float keanggotaanKecepatanAnginLambat = hitungKeanggotaan(kecepatanAngin, 0, 10);
float keanggotaanKecepatanAnginSedang = hitungKeanggotaan(kecepatanAngin, 5, 15);
float keanggotaanKecepatanAnginCepat = hitungKeanggotaan(kecepatanAngin, 10, 20);
// Evaluasi Aturan (Mamdani)
float keanggotaanCerah = min(min(keanggotaanSuhuRendah, keanggotaanKelembabanTinggi), keanggotaanKecepatanAnginCepat);
float keanggotaanBerawan = min(min(keanggotaanSuhuSedang, keanggotaanKelembabanSedang), keanggotaanKecepatanAnginSedang);
float keanggotaanHujan = min(min(keanggotaanSuhuTinggi, keanggotaanKelembabanRendah), keanggotaanKecepatanAnginLambat);
// Defuzzifikasi (Rata-rata Terbobot)
float nilaiKeluaran = (keanggotaanCerah * 20 + keanggotaanBerawan * 25 + keanggotaanHujan * 30) /
(keanggotaanCerah + keanggotaanBerawan + keanggotaanHujan);
// Menentukan hasil prediksi berdasarkan nilai defuzzifikasi
String prediksiCuaca = "";
if (nilaiKeluaran >= 20 && nilaiKeluaran < 23) {
prediksiCuaca = "Cuaca: Cerah. Bersiaplah untuk hari yang cerah.";
} else if (nilaiKeluaran >= 23 && nilaiKeluaran < 28) {
prediksiCuaca = "Cuaca: Berawan. Kondisi cuaca nyaman.";
} else {
prediksiCuaca = "Cuaca: Hujan. Persiapkan payung atau mantel hujan.";
}
Serial.print("Suhu: ");
Serial.println(suhu);
Serial.print("Kelembaban: ");
Serial.println(kelembaban);
Serial.print("Kecepatan Angin: ");
Serial.println(kecepatanAngin);
Serial.print("Prediksi Cuaca: ");
Serial.println(prediksiCuaca);
// Tampilkan hasil di LCD
lcd.setCursor(0, 1); // Pindah ke baris kedua LCD
lcd.print("Cuaca: ");
lcd.print(prediksiCuaca);
// Mengontrol Buzzer
if (nilaiKeluaran >= 23) { // Menyesuaikan kondisi sesuai kebutuhan
tone(buzzer, 1000); // Aktifkan buzzer dengan frekuensi tertentu
} else {
noTone(buzzer); // Matikan buzzer jika tidak memenuhi kondisi
}
delay(1000);
}
float hitungKeanggotaan(float nilai, float batasBawah, float batasAtas) {
if (nilai <= batasBawah) {
return 1.0;
} else if (nilai > batasBawah && nilai <= batasAtas) {
return (batasAtas - nilai) / (batasAtas - batasBawah);
} else {
return 0.0;
}
}
float bacaKecepatanAngin() {
// Implementasikan fungsi baca kecepatan angin sesuai dengan perangkat keras yang digunakan
// Misalnya, menggunakan sensor kecepatan angin atau sumber data lainnya.
// Fungsi ini harus mengembalikan nilai kecepatan angin dalam satuan yang sesuai (misalnya, km/h).
return 10.0; // Contoh nilai, sesuaikan dengan kondisi sebenarnya.
}