#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int potentiometerPin = 1;
int trigPin = 5;
int echoPin = 4;
NewPing jarak(trigPin, echoPin);
void setup() {
Serial.begin(9600);
lcd.begin(20,4);
lcd.init();
lcd.backlight();
}
void loop() {
Serial.println("\nINPUT");
//Jarak Tangan[X]
double dekat = 15; // cm
double jauh = 70; // cm
double x = jarak.ping_cm();
Serial.println("Jarak Tangan[X]:" + String(x, 0) + " cm");
//Kelembapan Tangan[Y]
double kering = 15; // %
double basah = 60; // %
double potentiometer = analogRead(potentiometerPin);
double y = map(potentiometer, 0, 1023, 0, 100);
Serial.println("Kelembapan Tangan[Y]:" + String(y, 0) + " %");
//Jumlah Air Sabun[Z]
double sedikit = 30; // ml/s
double banyak = 50; // ml/s
Serial.println("\nFUZZIFIKASI");
double Jarak_Dekat;
if (x >= jauh) {
Jarak_Dekat = 0;
Serial.println("μJarak_Dekat [X]: " + String(Jarak_Dekat, 0));
} else if (dekat < x && x < jauh) {
Jarak_Dekat = (jauh - x) / (jauh - dekat);
Serial.println("μJarak_Dekat [X]: " + String(Jarak_Dekat, 4));
} else if (x <= dekat) {
Jarak_Dekat = 1;
Serial.println("μJarak_Dekat [X]: " + String(Jarak_Dekat, 0));
}
double Jarak_Jauh;
if (x <= dekat) {
Jarak_Jauh = 0;
Serial.println("μJarak_Jauh [X]: " + String(Jarak_Jauh, 0));
} else if (x > dekat && x < jauh) {
Jarak_Jauh = (x - dekat) / (jauh - dekat);
Serial.println("μJarak_Jauh [X]: " + String(Jarak_Jauh, 4));
} else if (x >= jauh) {
Jarak_Jauh = 1;
Serial.println("μJarak_Jauh [X]: " + String(Jarak_Jauh, 0));
}
double Kelembapan_Kering;
if (y >= basah) {
Kelembapan_Kering = 0;
Serial.println("μKelembapan_Kering [Y]: " + String(Kelembapan_Kering, 0));
} else if (kering < y && y < basah) {
Kelembapan_Kering = (basah - y) / (basah - kering);
Serial.println("Kelembapan_Kering [Y]: " + String(Kelembapan_Kering, 4));
} else if (y <= kering) {
Kelembapan_Kering = 1;
Serial.println("Kelembapan_Kering [Y]: " + String(Kelembapan_Kering, 0));
}
double Kelembapan_Basah;
if (y <= kering) {
Kelembapan_Basah = 0;
Serial.println("μKelembapan_Basah [Y]: " + String(Kelembapan_Basah, 0));
} else if (y >= basah) {
Kelembapan_Basah = 1;
Serial.println("μKelembapan_Basah [Y]: " + String(Kelembapan_Basah, 0));
} else {
Kelembapan_Basah = (y - kering) / (basah - kering);
Serial.println("μKelembapan_Basah [Y]: " + String(Kelembapan_Basah, 4));
}
Serial.println("\nINFERENSI");
// [R1] JARAK DEKAT & KELEMBAPAN KERING = KELUAR UDARA PELAN
double a1 = min(Jarak_Dekat, Kelembapan_Kering);
Serial.println("a1: " + String(a1, 4));
double Z1 = banyak - a1 * (banyak - sedikit);
Serial.println("z1: " + String(Z1, 4));
// [R2] JARAK JAUH & KELEMBAPAN KERING = KELUAR UDARA PELAN
double a2 = min(Jarak_Jauh, Kelembapan_Kering);
Serial.println("a2: " + String(a2, 4));
double Z2 = banyak - a2 * (banyak - sedikit);
Serial.println("z2: " + String(Z2, 4));
// [R3 JARAK DEKAT & KELEMBAPAN BASAH = KELUAR UDARA KENCANG
double a3 = min(Jarak_Dekat, Kelembapan_Basah);
Serial.println("a3: " + String(a3, 4));
double Z3 = a3 * (banyak - sedikit) + sedikit;
Serial.println("z3: " + String(Z3, 4));
// [R4] JARAK JAUH & KELEMBAPAN BASAH = KELUAR UDARA KENCANG
double a4 = min(Jarak_Jauh, Kelembapan_Basah);
Serial.println("a4: " + String(a4, 4));
double Z4 = a4 * (banyak - sedikit) + sedikit;
Serial.println("z4: " + String(Z4, 4));
Serial.println("\nDEFUZZIFIKASI");
double z = (a1 * Z1 + a2 * Z2 + a3 * Z3 + a4 * Z4) /
(a1 + a2 + a3 + a4);
lcd.setCursor(0,0);
lcd.print("Jarak Tangan:");
lcd.setCursor(0,1);
lcd.print(int(x));
lcd.print(" cm");
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Kelembapan Tangan:");
lcd.setCursor(0,1);
lcd.print(int(y));
lcd.print(" %");
delay(1500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jumlah:");
lcd.setCursor(0, 1);
lcd.print(z, 4);
lcd.print(" ml/s");
delay(1500);
lcd.clear();
if (z <= 40) {
lcd.setCursor(0, 0);
lcd.print("Sedikit");
} else {
lcd.setCursor(0, 0);
lcd.print("Banyak");
}
delay(1500);
lcd.clear();
Serial.println("Jumlah Air Sabun [Z]: " + String(z, 4) + " ml/s");
delay(1000);
}