#include <Fuzzy.h>
#include <DHT.h>
// Inisialisasi sensor DHT11 untuk suhu dan kelembaban udara
#define DHTPIN 2 // Pin data DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pin untuk sensor kelembaban tanah dan relay pompa air
int soilMoisturePin = A0; // Sensor kelembaban tanah
int relayPin = 7; // Pin untuk relay
int i;
// Inisialisasi Fuzzy
Fuzzy *fuzzy = new Fuzzy();
void setup()
{
Serial.begin(9600);
dht.begin();
digitalWrite(relayPin, LOW);
//==============Fuzzifikasi variabel input "Kelembaban Tanah"==================
FuzzySet *kering = new FuzzySet(0, 200, 200, 400);
FuzzySet *sedang_kelembaban = new FuzzySet(300, 500, 500, 700);
FuzzySet *basah = new FuzzySet(600, 800, 800, 1023);
// Fuzzy Input Kelembaban Tanah
FuzzyInput *kelembabanTanah = new FuzzyInput(1);
kelembabanTanah->addFuzzySet(kering);
kelembabanTanah->addFuzzySet(sedang_kelembaban);
kelembabanTanah->addFuzzySet(basah);
fuzzy->addFuzzyInput(kelembabanTanah);
//==============Fuzzifikasi variabel input "Suhu Udara"========================
FuzzySet *rendah = new FuzzySet(0, 15, 15, 25);
FuzzySet *sedang_suhu = new FuzzySet(20, 30, 30, 40);
FuzzySet *tinggi = new FuzzySet(35, 45, 45, 60);
// Fuzzy Input Suhu Udara
FuzzyInput *suhuUdara = new FuzzyInput(2);
suhuUdara->addFuzzySet(rendah);
suhuUdara->addFuzzySet(sedang_suhu);
suhuUdara->addFuzzySet(tinggi);
fuzzy->addFuzzyInput(suhuUdara);
//==============Fuzzifikasi variabel output "Durasi Penyiraman"=================
FuzzySet *sebentar = new FuzzySet(0, 2, 2, 4); // Durasi 2 detik
FuzzySet *sedang_durasi = new FuzzySet(3, 5, 5, 7); // Durasi 5 detik
FuzzySet *lama = new FuzzySet(6, 10, 10, 15); // Durasi 10 detik
// Fuzzy output
FuzzyOutput *durasiPenyiraman = new FuzzyOutput(1);
durasiPenyiraman->addFuzzySet(sebentar);
durasiPenyiraman->addFuzzySet(sedang_durasi);
durasiPenyiraman->addFuzzySet(lama);
fuzzy->addFuzzyOutput(durasiPenyiraman);
//====================== Membuat aturan inferensi ============================
//Rules 1 (KERING DAN TINGGI)
FuzzyRuleAntecedent *jikaKeringDanTinggi = new FuzzyRuleAntecedent();
jikaKeringDanTinggi->joinWithAND(kering, tinggi);
FuzzyRuleConsequent *makaLama = new FuzzyRuleConsequent();
makaLama->addOutput(lama);
FuzzyRule *rule1 = new FuzzyRule(1, jikaKeringDanTinggi, makaLama);
fuzzy->addFuzzyRule(rule1);
//Rules 2 (SUHU SEDANG DAN KELEMBABAN SEDANG)
FuzzyRuleAntecedent *jikaSedangDanSedang = new FuzzyRuleAntecedent();
jikaSedangDanSedang->joinWithAND(sedang_kelembaban, sedang_suhu);
FuzzyRuleConsequent *makaSedang = new FuzzyRuleConsequent();
makaSedang->addOutput(sedang_durasi);
FuzzyRule *rule2 = new FuzzyRule(2, jikaSedangDanSedang, makaSedang);
fuzzy->addFuzzyRule(rule2);
//Rules 3 (BASAH DAN RENDAH)
FuzzyRuleAntecedent *jikaBasahDanRendah = new FuzzyRuleAntecedent();
jikaBasahDanRendah->joinWithAND(basah, rendah);
FuzzyRuleConsequent *makaSebentar = new FuzzyRuleConsequent();
makaSebentar->addOutput(sebentar);
FuzzyRule *rule3 = new FuzzyRule(3, jikaBasahDanRendah, makaSebentar);
fuzzy->addFuzzyRule(rule3);
//Rules 4 (KERING DAN RENDAH)
FuzzyRuleAntecedent *jikaKeringDanRendah = new FuzzyRuleAntecedent();
jikaKeringDanRendah->joinWithAND(kering, rendah);
FuzzyRuleConsequent *makaSedang1 = new FuzzyRuleConsequent();
makaSedang1->addOutput(sedang_durasi);
FuzzyRule *rule4 = new FuzzyRule(4, jikaKeringDanRendah, makaSedang1);
fuzzy->addFuzzyRule(rule4);
//Rules 5 (BASAH DAN TINGGI)
FuzzyRuleAntecedent *jikaBasahDanTinggi = new FuzzyRuleAntecedent();
jikaBasahDanTinggi->joinWithAND(basah, tinggi);
FuzzyRuleConsequent *makaSebentar1 = new FuzzyRuleConsequent();
makaSebentar1->addOutput(sebentar);
FuzzyRule *rule5 = new FuzzyRule(5, jikaBasahDanTinggi, makaSebentar1);
fuzzy->addFuzzyRule(rule5);
//Rules 6 (BASAH DAN SEDANG SUHU)
FuzzyRuleAntecedent *jikaBasahDanSedang = new FuzzyRuleAntecedent();
jikaBasahDanSedang->joinWithAND(basah, sedang_suhu);
FuzzyRuleConsequent *makaSebentarSedang = new FuzzyRuleConsequent();
makaSebentarSedang->addOutput(sebentar);
FuzzyRule *rule6 = new FuzzyRule(6, jikaBasahDanSedang, makaSebentarSedang);
fuzzy->addFuzzyRule(rule6);
//Rules 7 (KERING DAN SEDANG SUHU)
FuzzyRuleAntecedent *jikaKeringDanSedang = new FuzzyRuleAntecedent();
jikaKeringDanSedang->joinWithAND(kering, sedang_suhu);
FuzzyRuleConsequent *makaSedangKering = new FuzzyRuleConsequent();
makaSedangKering->addOutput(sedang_durasi);
FuzzyRule *rule7 = new FuzzyRule(7, jikaKeringDanSedang, makaSedangKering);
fuzzy->addFuzzyRule(rule7);
//Rules 8 (TINGGI DAN SEDANG KELEMBABAN)
FuzzyRuleAntecedent *jikaTinggiDanSedang = new FuzzyRuleAntecedent();
jikaTinggiDanSedang->joinWithAND(tinggi, sedang_kelembaban);
FuzzyRuleConsequent *makaSedangTinggi = new FuzzyRuleConsequent();
makaSedangTinggi->addOutput(sedang_durasi);
FuzzyRule *rule8 = new FuzzyRule(8, jikaTinggiDanSedang, makaSedangTinggi);
fuzzy->addFuzzyRule(rule8);
}
void loop()
{
digitalWrite(relayPin, LOW);
// Membaca sensor kelembaban tanah dan Temperature
int kelembabanBaca = analogRead(soilMoisturePin);
float suhuBaca = dht.readTemperature();
// Masukkan input ke sistem fuzzy
fuzzy->setInput(1, kelembabanBaca);
fuzzy->setInput(2, suhuBaca);
// Hitung fuzzy logic
fuzzy->fuzzify();
// Ambil output
float durasi = fuzzy->defuzzify(1);
// Tampilkan hasil
Serial.print("Kelembaban Tanah: "); Serial.print(kelembabanBaca);
Serial.print(" , Suhu: "); Serial.print(suhuBaca);
Serial.print(" , Durasi Penyiraman: "); Serial.print(durasi); Serial.println(" detik");
for (i = durasi; i>=0; i--)
{
Serial.print("Hitungan mundur"); Serial.println(i);
digitalWrite(relayPin, HIGH); // Nyalakan pompa air
if (i<=1 || i<=0)
{
digitalWrite(relayPin, LOW); // Matikan pompa air
}
delay(1000);
}
digitalWrite(relayPin, LOW); // Matikan pompa air
delay(10000); // Tunggu 10 detik sebelum pembacaan berikutnya
}