//konversi dari https://github.com/dithanrchy/Logika-Fuzzy-Metode-Tsukamoto-Python/blob/master/Logika%20Fuzzy%20-%20Metode%20Tsukamoto.ipynb
#include <Arduino.h>
// Fungsi untuk menghitung derajat keanggotaan naik
float naik(float b, float a, float x) {
if (x <= a) {
return 0.0;
} else if (x > a && x < b) {
return (x - a) / (b - a);
} else {
return 1.0;
}
}
// Fungsi untuk menghitung derajat keanggotaan turun
float turun(float b, float a, float x) {
if (x <= a) {
return 1.0;
} else if (x > a && x < b) {
return (b - x) / (b - a);
} else {
return 0.0;
}
}
// Fungsi untuk menghitung nilai agregasi turun
float agregasiTurun(float b, float a, float alfa) {
return b - (alfa * (b - a));
}
// Fungsi untuk menghitung nilai agregasi naik
float agregasiNaik(float b, float a, float alfa) {
return (alfa * (b - a)) + a;
}
void setup() {
Serial.begin(9600);
while (!Serial) {
; // Tunggu hingga Serial siap
}
Serial.println("Logika Fuzzy - Suhu");
}
void loop() {
// Input suhu (dummy variabel)
float suhu = 35.0; // Misalnya suhu saat ini adalah 35°C
// Rentang keanggotaan fuzzy (naik/turun)
float naikMin = 30.0, naikMax = 50.0; // Suhu naik
float turunMin = 10.0, turunMax = 30.0; // Suhu turun
// Hitung derajat keanggotaan
float derajatNaik = naik(naikMax, naikMin, suhu);
float derajatTurun = turun(turunMax, turunMin, suhu);
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" °C");
Serial.print("Derajat Naik: ");
Serial.println(derajatNaik);
Serial.print("Derajat Turun: ");
Serial.println(derajatTurun);
// Aturan fuzzy
float alfa1 = derajatNaik; // Aturan 1: Jika suhu naik
float alfa2 = derajatTurun; // Aturan 2: Jika suhu turun
// Nilai z (output fuzzy)
float z1 = agregasiNaik(100.0, 50.0, alfa1); // Output naik (misalnya 50-100)
float z2 = agregasiTurun(50.0, 0.0, alfa2); // Output turun (misalnya 0-50)
// Defuzifikasi
float defuzzifikasi = (alfa1 * z1 + alfa2 * z2) / (alfa1 + alfa2);
Serial.print("Output (Defuzzifikasi): ");
Serial.println(defuzzifikasi);
Serial.println("-------------------------");
delay(3000); // Delay 3 detik sebelum loop berikutnya
}