#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Ganti ke DHT11
#define DHTPIN 2
#define DHTTYPE DHT11
#define POT_SUHU A0
#define LED_HEATER1 9
#define LED_HEATER2 10
// LED indikator tambahan yang selalu menyala
#define LED_IND1 11
#define LED_IND2 12
#define LED_IND3 13
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
bool heaterOn = false;
unsigned long lastDhtMs = 0;
unsigned long lastLcdMs = 0;
const unsigned long dhtInterval = 1000;
const unsigned long lcdInterval = 250;
float suhuAsli = NAN, humidityAsli = NAN;
float suhu = NAN, kelembapan = NAN;
void setup() {
pinMode(LED_HEATER1, OUTPUT);
pinMode(LED_HEATER2, OUTPUT);
pinMode(LED_IND1, OUTPUT);
pinMode(LED_IND2, OUTPUT);
pinMode(LED_IND3, OUTPUT);
lcd.begin(20, 4);
lcd.backlight();
dht.begin();
// Nyalakan LED indikator sistem
digitalWrite(LED_IND1, HIGH);
digitalWrite(LED_IND2, HIGH);
digitalWrite(LED_IND3, HIGH);
lcd.clear();
lcd.setCursor(0, 1); lcd.print(" SISTEM PENGERINGAN ");
lcd.setCursor(0, 2); lcd.print(" BIJI KOPI CASCARA ");
delay(1000);
lcd.clear();
}
void readSensors() {
unsigned long now = millis();
if (now - lastDhtMs >= dhtInterval) {
lastDhtMs = now;
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t)) suhuAsli = t;
if (!isnan(h)) humidityAsli = h;
int potSuhu = analogRead(POT_SUHU);
float offsetSuhu = map(potSuhu, 0, 1023, -10, 10); // ubah offset sesuai kebutuhan
suhu = constrain(suhuAsli + offsetSuhu, -20, 100);
kelembapan = constrain(humidityAsli, 0, 100);
}
}
void controlLogic() {
if (isnan(suhu)) return;
// Logika heater: MATI di atas/sama dengan 45°C, NYALA di bawah 45°C
if (suhu >= 40) {
heaterOn = false;
} else {
heaterOn = true;
}
digitalWrite(LED_HEATER1, heaterOn ? HIGH : LOW);
digitalWrite(LED_HEATER2, heaterOn ? HIGH : LOW);
}
void updateLCD() {
unsigned long now = millis();
if (now - lastLcdMs < lcdInterval) return;
lastLcdMs = now;
lcd.setCursor(0, 0);
lcd.print("T:");
if (!isnan(suhu)) {
lcd.print(suhu, 1);
} else {
lcd.print("--.-");
}
lcd.write(byte(223));
lcd.print("C H:");
if (!isnan(kelembapan)) {
lcd.print(kelembapan, 1);
} else {
lcd.print("--.-");
}
lcd.print("% ");
lcd.setCursor(0, 1);
lcd.print("Mode: AUTO ");
lcd.setCursor(0, 2);
lcd.print("Heater: ");
lcd.print(heaterOn ? "ON " : "OFF");
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Offset:");
int potVal = analogRead(POT_SUHU);
float offsetSuhu = map(potVal, 0, 1023, 20, 40);
lcd.print(offsetSuhu, 0);
lcd.print("C ");
}
void loop() {
readSensors();
controlLogic();
updateLCD();
}