//library
#include <DHT.h>
#include <Fuzzy.h>
//sensor dht22
#define DHTPIN 33
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//sensor kelembapan tanah
int sensorPin = 34;
int kelTanah;
float hum_u;
float last_hum_u;
//sensor suhu udara
const int err_pin = 12;
float t;
float last_t;
//pompa dan kipas
const int pompa = 13;
const int kipas = 14;
//setpoint suhu dan humidity
byte spsuhu;
byte sphum;
//waktu
long current_time;
long last_time;
long waktu;
byte mode1;
byte state;
// Fuzzy
Fuzzy *fuzzy = Fuzzy();
// FuzzyInput Kelembapan Tanah
FuzzySet *negatif_hum = FuzzySet(-1000, -50, -30, 0);
FuzzySet *netral_hum = FuzzySet(-30, 0, 0, 25);
FuzzySet *positif_hum = FuzzySet(0, 30, 100, 100);
// FuzzyInput Suhu Udara
FuzzySet *negatif_suhu = FuzzySet(-100, -50, -25, 0);
FuzzySet *netral_suhu = FuzzySet(-25, 0, 0, 25);
FuzzySet *positif_suhu = FuzzySet(0, 25, 100, 100);
// FuzzyOutput Pompa
FuzzySet *pendek1 = FuzzySet(0, 0, 1, 3);
FuzzySet *cukup1 = FuzzySet(1, 3, 3, 5);
FuzzySet *lama1 = FuzzySet(3, 5, 8, 20);
// FuzzyOutput Kipas
FuzzySet *pendek2 = FuzzySet(0, 0, 1, 3);
FuzzySet *cukup2 = FuzzySet(1, 3, 3, 5);
FuzzySet *lama2 = FuzzySet(3, 5, 10, 20);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(50);
dht.begin();
//error pin
last_t = 27;
last_hum_u = 40;
pinMode(err_pin, OUTPUT);
digitalWrite(err_pin, LOW);
//pompa
pinMode(pompa, OUTPUT);
digitalWrite(pompa, LOW);
//kipas
pinMode(kipas, OUTPUT);
digitalWrite(kipas, LOW);
setupFuzzy();
waktu = 5000;
sphum = 50;
spsuhu = 27;
mode1 = 0;
delay(2000);
state = 0; //kondisi awal
}
void loop() {
// put your main code here, to run repeatedly:
current_time = millis();
switch (state) {
case 0:
bacaSensor();
//waktu
if (current_time - last_time >= waktu){
penyiraman();
last_time = current_time;
}
break;
}
}
// function pembacaan sensor suhu dan kelembapan
void bacaSensor() {
t = dht.readTemperature();
hum_u = dht.readHumidity();
//deklarasi error suhu
if (isnan(t)){
// jika error nilai pembacaan suhu akan default 27 maka led nyala
t = last_t;
digitalWrite(err_pin, HIGH);
} else {
// jika tidak error nilai pembacaan suhu berdasarkan sensor maka led mati
last_t = t;
digitalWrite(err_pin, LOW);
}
//deklarasi error humidity
if (isnan(hum_u)){
// jika error nilai pembacaan humidity akan default 27
hum_u = last_hum_u;
} else {
// jika tidak error nilai pembacaan humidity berdasarkan sensor
last_hum_u = hum_u;
}
//perhitungan sensor kelembapan
int nilaiSensor = analogRead(sensorPin);
kelTanah = (100-((nilaiSensor/4095.00)*100));
//menampilkan suhu aktual pada serial monitor
Serial.print("Suhu saat ini : ");
Serial.print(t);
Serial.println(" *C");
//menampilkan kelembapan aktual pada serial monitor
Serial.print("Kelembapan Tanah : ");
Serial.print(kelTanah);
Serial.println(" %");
}
//function durasi penyiraman dan durasi kipas
void penyiraman(){
int nilaiSensor = analogRead(sensorPin);
kelTanah = (100-((nilaiSensor/4095.00)*100));
if (isnan(hum_u)){
hum_u = last_hum_u;
} else {
last_hum_u = hum_u;
}
t = dht.readTemperature();
hum_u = dht.readHumidity();
if (isnan(t)){
t = last_t;
} else {
last_t = t;
}
//fuzzy menggunakan rumus delta
int delta_hum = kelTanah - sphum; // delta humidity = kelembapan aktual - setpoint humidity
int delta_suhu = t - spsuhu; // delta suhu = suhu aktual - setpoint suhu
//fungsi keanggotaan untuk input kelembapan
fuzzy->setInput(1, delta_hum);
fuzzy->setInput(2, delta_suhu);
//memanggil fungsi fuzzy
fuzzy->fuzzify();
//menampilkan nilai fuzzyfikasi
Serial.println("\nInput : ");
Serial.println("Delta Humidity : " + String(delta_hum));
Serial.println("Delta Suhu : " + String(delta_suhu));
Serial.println("Fuzzyfikasi Humidity : ");
fuzzy->debug();
//defuzzyfikasi
int output1 = fuzzy->defuzzify(1);
int output2 = fuzzy->defuzzify(2);
//menampilkan nilai defuzzyfikasi
Serial.println("\nOutput : ");
Serial.println("Output 1 (Pompa) : " + String(output1));
Serial.println("Output 2 (Kipas) : " + String(output2));
//mengendalikan pompa dan kipas berdasarkan output fuzzy
kontrolPompa(output1);
kontrolKipas(output2);
}
//fungsi kontrol pompa
void kontrolPompa(int output) {
if (output == 1){
analogWrite(pompa, 255);
Serial.println("Durasi penyiraman pendek");
delay(3000);
analogWrite(pompa, 0);
} else if (output == 2) {
analogWrite(pompa, 255);
Serial.println("Durasi penyiraman cukup");
delay(6000);
analogWrite(pompa, 0);
} else if (output == 3) {
analogWrite(pompa, 255);
Serial.println("Durasi penyiraman lama");
delay(9000);
analogWrite(pompa, 0);
} else {
analogWrite(pompa, 0);
Serial.println("Tidak ada penyiraman");
}
}
//fungsi kontrol kipas
void kontrolKipas(int output) {
if (output == 1){
analogWrite(kipas, 255);
Serial.println("Durasi kipas pendek");
delay(3000);
analogWrite(kipas, 0);
} else if (output == 2) {
analogWrite(kipas, 255);
Serial.println("Durasi kipas cukup");
delay(6000);
analogWrite(kipas, 0);
} else if (output == 3) {
analogWrite(kipas, 255);
Serial.println("Durasi kipas lama");
delay(9000);
analogWrite(kipas, 0);
} else {
analogWrite(kipas, 0);
Serial.println("Tidak ada penggunaan kipas");
}
}
//fungsi setup fuzzy
void setupFuzzy() {
// FuzzyInput Humidity
fuzzy->addFuzzyInput(&negatif_hum);
fuzzy->addFuzzyInput(&netral_hum);
fuzzy->addFuzzyInput(&positif_hum);
// FuzzyInput Suhu
fuzzy->addFuzzyInput(&negatif_suhu);
fuzzy->addFuzzyInput(&netral_suhu);
fuzzy->addFuzzyInput(&positif_suhu);
// FuzzyOutput Pompa
fuzzy->addFuzzyOutput(&pendek1);
fuzzy->addFuzzyOutput(&cukup1);
fuzzy->addFuzzyOutput(&lama1);
// FuzzyOutput Kipas
fuzzy->addFuzzyOutput(&pendek2);
fuzzy->addFuzzyOutput(&cukup2);
fuzzy->addFuzzyOutput(&lama2);
// Rules
fuzzy->addRule(negatif_hum, negatif_suhu, pendek1);
fuzzy->addRule(negatif_hum, netral_suhu, pendek1);
fuzzy->addRule(negatif_hum, positif_suhu, pendek2);
fuzzy->addRule(netral_hum, negatif_suhu, cukup1);
fuzzy->addRule(netral_hum, netral_suhu, cukup1);
fuzzy->addRule(netral_hum, positif_suhu, cukup2);
fuzzy->addRule(positif_hum, negatif_suhu, lama1);
fuzzy->addRule(positif_hum, netral_suhu, lama2);
fuzzy->addRule(positif_hum, positif_suhu, lama2);
}