#include <OneWire.h>
#include <DallasTemperature.h>
#define SENSOR_PIN 2
#define LAMPU_1_PIN 9
#define LAMPU_2_PIN 8
#define LAMPU_3_PIN 7
#define KIPAS_PIN 11
const int MAX_RPM = 3800; // Kecepatan maksimal kipas dalam RPM
const int MAX_PWM = 255; // Nilai PWM maksimal untuk mencapai kecepatan maksimal
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
pinMode(LAMPU_1_PIN, OUTPUT);
pinMode(LAMPU_2_PIN, OUTPUT);
pinMode(LAMPU_3_PIN, OUTPUT);
pinMode(KIPAS_PIN, OUTPUT);
// Set status awal output
digitalWrite(LAMPU_1_PIN, LOW);
digitalWrite(LAMPU_2_PIN, LOW);
digitalWrite(LAMPU_3_PIN, LOW);
analogWrite(KIPAS_PIN, 0);
sensors.begin();
}
// Fungsi keanggotaan untuk suhu
float dingin(float x) {
return max(0, 1 - abs((x - 36) / 36));
}
float normal(float x) {
return max(0, 1 - abs((x - 37.5) / 1.5));
}
float set_point(float x) {
return max(0, 1 - abs((x - 39.5) / 0.5));
}
float panas(float x) {
return max(0, 1 - abs((x - 41.5) / 1.5));
}
float sangat_panas(float x) {
return max(0, 1 - abs((x - 43) / 2));
}
// Fungsi inferensi
int fuzzyInference(float suhu) {
if (suhu < 36) {
return 3;
} else if (suhu >= 36 && suhu < 39) {
return 2;
} else if (suhu >= 39 && suhu < 39) {
return 1;
} else if (suhu >= 39 && suhu <= 40) {
return 1;
} else if (suhu > 40 && suhu <= 43) {
return 0;
} else if (suhu > 43) {
return 0;
}
return 0;
}
void loop() {
sensors.requestTemperatures();
float suhu = sensors.getTempCByIndex(0);
// Fuzzy Inference
int lampuOutput = fuzzyInference(suhu);
int kipasSpeedPWM = 0;
if (suhu >= 39.15 && suhu < 40) {
kipasSpeedPWM = 50 + (suhu - 30) * 3; // Meningkatkan kecepatan secara bertahap
kipasSpeedPWM = constrain(kipasSpeedPWM, 50, 255);
}
if (suhu > 39.15) {
kipasSpeedPWM = 50 + (39 - 30) * 3 + (suhu - 39.1) * 25; // Kecepatan maksimum ketika suhu lebih dari 39
kipasSpeedPWM = constrain(kipasSpeedPWM, 50, 255);
}
// Konversi nilai PWM menjadi RPM
int kipasSpeedRPM = map(kipasSpeedPWM, 0, MAX_PWM, 0, MAX_RPM);
// Output Defuzzifikasi (mengatur tingkat kecerahan lampu)
digitalWrite(LAMPU_1_PIN, lampuOutput >= 1 ? HIGH : LOW);
digitalWrite(LAMPU_2_PIN, lampuOutput >= 2 ? HIGH : LOW);
digitalWrite(LAMPU_3_PIN, lampuOutput == 3 ? HIGH : LOW);
// Output Defuzzifikasi (mengatur kecepatan kipas)
analogWrite(KIPAS_PIN, kipasSpeedPWM);
// Kirim nilai suhu, kecepatan PWM, dan kecepatan RPM ke Serial Monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print("°C | Nyala Lampu: ");
Serial.print(lampuOutput);
Serial.print(" | Kecepatan Kipas (PWM): ");
Serial.print(kipasSpeedPWM);
Serial.print(" | Kecepatan Kipas (RPM): ");
Serial.println(kipasSpeedRPM);
delay(1000);
}