#include <LiquidCrystal_I2C.h>
/* ================= PIN CONFIG ================= */
#define TRIG_PIN 5
#define ECHO_PIN 18
#define SSR_PIN 23
// A4988 DRIVER
#define STEP_PIN 19
#define DIR_PIN 21
#define EN_PIN 22 // Optional tapi disarankan
#define BUZZER_LED 2
/* ================= LCD ================= */
LiquidCrystal_I2C lcd(0x27, 16, 2);
/* ================= GLOBAL VAR ================= */
long duration;
float distance;
float setPoint = 0;
unsigned long startTime;
/* ================= ULTRASONIC ================= */
float readUltrasonic() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH, 30000); // timeout biar ga hang
if (duration == 0) return 0; // jika gagal baca
float dist = duration * 0.034 / 2;
return dist;
}
/* ================= STEPPER CONTROL ================= */
void stepMotor(int steps, bool dir, int delayMicros) {
digitalWrite(DIR_PIN, dir);
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(delayMicros);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delayMicros);
}
}
/* ================= FUZZY LOGIC ================= */
void fuzzyLogic(float jarak) {
if (jarak >= 15) {
setPoint = 40;
stepMotor(200, HIGH, 600); // Pelan
}
else if (jarak > 5 && jarak < 15) {
setPoint = 60;
stepMotor(200, HIGH, 1500); // Cepat
}
else if (jarak <= 5 && jarak > 0) {
setPoint = 75;
stepMotor(200, HIGH, 1500); // Cepat
}
}
/* ================= SETUP ================= */
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(SSR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
pinMode(BUZZER_LED, OUTPUT);
digitalWrite(EN_PIN, LOW); // Enable A4988 (LOW = aktif)
digitalWrite(SSR_PIN, HIGH); // Heater ON
lcd.init();
lcd.backlight();
startTime = millis();
}
/* ================= LOOP ================= */
void loop() {
unsigned long currentTime = millis();
// AUTO OFF 30 MENIT
if (currentTime - startTime >= 1800000) {
digitalWrite(SSR_PIN, LOW); // Heater OFF
digitalWrite(BUZZER_LED, HIGH); // Alarm ON
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Proses Selesai");
lcd.setCursor(0, 1);
lcd.print("Heater OFF");
while (true); // Stop sistem
}
distance = readUltrasonic();
fuzzyLogic(distance);
lcd.setCursor(0, 0);
lcd.print("Jarak: ");
lcd.print(distance, 1);
lcd.print(" cm ");
lcd.setCursor(0, 1);
lcd.print("SP Suhu: ");
lcd.print(setPoint);
lcd.print(" C ");
delay(200);
}