#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int potentiometerPin = A1;
const float BETA = 3950;
void setup() {
Serial.begin(115200);
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
}
void loop() {
//Variabel Input1 = Suhu CPU
double rendah = 30;
double tinggi = 80;
//Variabel Input2 = Beban Kerja Aplikasi
double ringan = 20;
double berat = 80;
//Variabel Output = Beban Kerja Aplikasi
double lambat = 600;
double cepat = 3000;
int analogValue = analogRead(A0);
int x = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
double potValue2 = analogRead(potentiometerPin);
double y = map(potValue2, 0, 1023, 0, 100);
Serial.println("\n");
double Suhu_Rendah;
if (x >= tinggi) {
Suhu_Rendah = 0;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
} else if (rendah < x && x < tinggi) {
Suhu_Rendah = (tinggi - x) / (tinggi - rendah);
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 4));
} else if (x <= rendah) {
Suhu_Rendah = 1;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
}
double Suhu_Tinggi;
if (x <= rendah) {
Suhu_Tinggi = 0;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
} else if (x > rendah && x < tinggi) {
Suhu_Tinggi = (x - rendah) / (tinggi - rendah);
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 4));
} else if (x >= tinggi) {
Suhu_Tinggi = 1;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
}
double Beban_Ringan;
if (y >= berat) {
Beban_Ringan = 0;
Serial.println("μBeban_Ringan [Y]: " + String(Beban_Ringan, 0));
} else if (ringan < y && y < berat) {
Beban_Ringan = (berat - y) / (berat - ringan);
Serial.println("μBeban_Ringan [Y]: " + String(Beban_Ringan, 4));
} else if (y <= ringan) {
Beban_Ringan = 1;
Serial.println("μBeban_Ringan [Y]: " + String(Beban_Ringan, 0));
}
double Beban_Berat;
if (y <= ringan) {
Beban_Berat = 0;
Serial.println("μBeban_Berat [Y]: " + String(Beban_Berat, 0));
} else if (y > ringan && y < berat) {
Beban_Berat = (y - ringan) / (berat - ringan);
Serial.println("μBeban_Berat [Y]: " + String(Beban_Berat, 4));
} else if (y >= berat) {
Beban_Berat = 1;
Serial.println("μBeban_Berat [Y]: " + String(Beban_Berat, 0));
}
Serial.println("\n");
// [R1] IF SUHU RENDAH AND BEBAN KERJA RINGAN THEN KECEPATAN LAMBAT
double a1 = min(Suhu_Rendah, Beban_Ringan);
Serial.println("a1: " + String(a1, 4));
double Z1 = cepat - a1 * (cepat - lambat);
Serial.println("z1: " + String(Z1, 4));
// [R2] IF SUHU RENDAH AND BEBAN KERJA BERAT THEN KECEPATAN LAMBAT
double a2 = min(Suhu_Rendah, Beban_Berat);
Serial.println("a2: " + String(a2, 4));
double Z2 = cepat - a2 * (cepat - lambat);
Serial.println("z2: " + String(Z2, 4));
// [R3] IF SUHU TINGGI AND BEBAN KERJA RINGAN THEN KECEPATAN CEPAT
double a3 = min(Suhu_Tinggi, Beban_Ringan);
Serial.println("a3: " + String(a3, 4));
double Z3 = a3 * (cepat - lambat) + lambat;
Serial.println("z3: " + String(Z3, 4));
// [R4] IF SUHU TINGGI AND BEBAN KERJA BERAT THEN KECEPATAN CEPAT
double a4 = min(Suhu_Tinggi, Beban_Berat);
Serial.println("a4: " + String(a4, 4));
double Z4 = a4 * (cepat - lambat) + lambat;
Serial.println("z4: " + String(Z4, 4));
Serial.println("\nHasil Fuzzy");
double z = (a1 * Z1 + a2 * Z2 + a3 * Z3 + a4 * Z4) /
(a1 + a2 + a3 + a4);
lcd.setCursor(0,0);
lcd.print("Suhu CPU: ");
// lcd.setCursor(0,1);
lcd.print(int(x));
lcd.print(" c");
lcd.setCursor(0,2);
lcd.print("Beban Kerja: ");
// lcd.setCursor(0,1);
lcd.print(int(y));
lcd.print(" %");
delay(1000);
lcd.clear();
Serial.println("Z: " + String(z, 4));
lcd.setCursor(0, 0);
lcd.print("Kecepatan Kipas: ");
lcd.setCursor(0, 1);
lcd.print(z, 4);
lcd.print(" Rpm");
delay(1000);
lcd.clear();
}