#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Deklarasi Konstanta
const int BTN_UP = 2;
const int BTN_DOWN = 7;
const int LED_PANAS = 5;
const int LED_DINGIN = 6;
const int LED_NORMAL = 11;
const int BUZZER = 3;
const int POT = A3;
// Variabel
LiquidCrystal_I2C lcd(0x27, 16, 2);
float setpoint = 25.0;
float suhu = 0;
void setup() {
// Inisialisasi
lcd.init();
lcd.backlight();
pinMode(BTN_UP, INPUT);
pinMode(BTN_DOWN, INPUT);
pinMode(LED_PANAS, OUTPUT);
pinMode(LED_DINGIN, OUTPUT);
pinMode(LED_NORMAL, OUTPUT);
pinMode(BUZZER, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("SISTEM GREENHOUSE");
delay(2000);
lcd.clear();
}
float bacaSuhu() {
int nilai = analogRead(POT);
return (nilai * 25.0 / 1023.0) + 15.0;
}
void updateSetpoint() {
static bool lastUp = HIGH, lastDown = HIGH;
bool upState = digitalRead(BTN_UP);
bool downState = digitalRead(BTN_DOWN);
if (lastUp == HIGH && upState == LOW) {
setpoint += 0.5;
if (setpoint > 30) setpoint = 30;
}
if (lastDown == HIGH && downState == LOW) {
setpoint -= 0.5;
if (setpoint < 15) setpoint = 15;
}
lastUp = upState;
lastDown = downState;
}
void kontrolSuhu() {
// Matikan semua LED dulu
digitalWrite(LED_PANAS, LOW);
digitalWrite(LED_DINGIN, LOW);
digitalWrite(LED_NORMAL, LOW);
if (suhu < setpoint - 1) {
digitalWrite(LED_PANAS, HIGH);
} else if (suhu > setpoint + 1) {
digitalWrite(LED_DINGIN, HIGH);
} else {
digitalWrite(LED_NORMAL, HIGH);
}
// Alarm suhu tinggi
if (suhu > 35) {
tone(BUZZER, 1000);
} else {
noTone(BUZZER);
}
}
void tampilkanLCD() {
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu, 1);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Set: ");
lcd.print(setpoint, 1);
lcd.print("C ");
// Tampilkan status
lcd.setCursor(13, 1);
if (suhu < setpoint) lcd.print("P");
else if (suhu > setpoint) lcd.print("D");
else lcd.print("N");
}
void loop() {
suhu = bacaSuhu();
updateSetpoint();
kontrolSuhu();
tampilkanLCD();
delay(200);
}SD
SU
SR
SL
ENTER
POT1
D3
LED1 LED2 LED3 LED4 LED5 LED6