#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Definisi Pin
#define RELAY_PIN 2
#define NTC_PIN A0
#define UP_BUTTON_PIN 3
#define DOWN_BUTTON_PIN 4
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel Global
float currentTemp = 0.0;
int setTemp = 25; // Suhu setting awal
const int MIN_TEMP = 20;
const int MAX_TEMP = 90;
long lastUpPress = 0;
long lastDownPress = 0;
// Konstanta Sensor NTC (sesuaikan jika perlu)
const float B_VALUE = 3950;
const float R_NOMINAL = 10000;
const float T_NOMINAL = 25;
//--- Prototipe Fungsi ---
void cek_tombol();
void baca_suhu();
void tampilkan_suhu();
void proses_relay();
void setup() {
Serial.begin(9600);
// Konfigurasi pin
pinMode(RELAY_PIN, OUTPUT);
pinMode(UP_BUTTON_PIN, INPUT_PULLUP);
pinMode(DOWN_BUTTON_PIN, INPUT_PULLUP);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
}
void loop() {
cek_tombol();
baca_suhu();
tampilkan_suhu();
proses_relay();
}
//--- Implementasi Fungsi ---
void cek_tombol() {
// Anti-bouncing dengan delay 200ms
if (digitalRead(UP_BUTTON_PIN) == LOW && (millis() - lastUpPress > 200)) {
lastUpPress = millis();
setTemp++;
if (setTemp > MAX_TEMP) {
setTemp = MAX_TEMP;
}
Serial.println("Tombol UP ditekan. Suhu setting: " + String(setTemp));
tampilkan_suhu(); // Update tampilan segera
}
if (digitalRead(DOWN_BUTTON_PIN) == LOW && (millis() - lastDownPress > 200)) {
lastDownPress = millis();
setTemp--;
if (setTemp < MIN_TEMP) {
setTemp = MIN_TEMP;
}
Serial.println("Tombol DOWN ditekan. Suhu setting: " + String(setTemp));
tampilkan_suhu(); // Update tampilan segera
}
}
void baca_suhu() {
int analogValue = analogRead(NTC_PIN);
float resistance = 10000.0 * (1023.0 / analogValue - 1.0);
float steinhart;
steinhart = resistance / R_NOMINAL;
steinhart = log(steinhart);
steinhart /= B_VALUE;
steinhart += 1.0 / (T_NOMINAL + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
currentTemp = steinhart;
}
void tampilkan_suhu() {
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(currentTemp, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(setTemp);
lcd.print(" C");
lcd.print(" "); // Hapus sisa karakter
}
void proses_relay() {
if (currentTemp > setTemp) {
digitalWrite(RELAY_PIN, HIGH); // Nyalakan kipas
} else {
digitalWrite(RELAY_PIN, LOW); // Matikan kipas
}
}