#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define DHTPIN 13
#define DHTTYPE DHT22
#define LEDPIN 10
#define LED_SYSTEM 11
#define SERVOPIN 12
#define BUTTON_MODE 9
#define BUTTON_ONOFF 8
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo servo;
bool isOn = true;
bool mode = 0; // 0 untuk suhu, 1 untuk kelembapan
const float maxTemp = 80.0;
const float maxHumidity = 100.0;
const int maxServoAngle = 180;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 300;
void setup() {
pinMode(LEDPIN, OUTPUT);
pinMode(LED_SYSTEM, OUTPUT);
pinMode(BUTTON_MODE, INPUT_PULLUP);
pinMode(BUTTON_ONOFF, INPUT_PULLUP);
servo.attach(SERVOPIN);
dht.begin();
lcd.init();
lcd.backlight();
lcd.print("Memulai sistem:");
delay(2000);
}
void loop() {
if (digitalRead(BUTTON_ONOFF) == LOW && millis() - lastDebounceTime > debounceDelay) {
isOn = !isOn;
lastDebounceTime = millis();
}
if (digitalRead(BUTTON_MODE) == LOW && millis() - lastDebounceTime > debounceDelay) {
mode = !mode;
lastDebounceTime = millis();
}
if (!isOn) {
lcd.setCursor(0, 0);
lcd.print("Sistem Mati ");
digitalWrite(LEDPIN, LOW);
digitalWrite(LED_SYSTEM, LOW);
servo.write(0);
return;
}
digitalWrite(LED_SYSTEM, HIGH);
// Membaca Data DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 0);
lcd.print("Sensor gagal! ");
delay(2000);
return;
}
int servoAngle = 0;
if (mode == 0) {
// Mode Suhu
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print("C ");
// Hitung sudut servo
servoAngle = constrain(temperature, 0, maxTemp) * (maxServoAngle / maxTemp);
lcd.setCursor(0, 1);
if (temperature > 40) {
lcd.print("Kategori: Panas ");
blinkLEDNonBlocking(LEDPIN, 1000);
} else if (temperature >= 29) {
lcd.print("Kategori: Hangat ");
digitalWrite(LEDPIN, HIGH);
} else {
lcd.print("Kategori: Dingin ");
blinkLEDNonBlocking(LEDPIN, 1000);
}
} else {
// Mode Kelembapan
lcd.setCursor(0, 0);
lcd.print("Kelembapan: ");
lcd.print(humidity);
lcd.print("% ");
// Hitung sudut servo
servoAngle = constrain(humidity, 0, maxHumidity) * (maxServoAngle / maxHumidity);
lcd.setCursor(0, 1);
if (humidity > 60) {
lcd.print("Kategori: Basah ");
blinkLEDNonBlocking(LEDPIN, 1000);
} else if (humidity >= 40) {
lcd.print("Kategori: Lembap ");
digitalWrite(LEDPIN, HIGH);
} else {
lcd.print("Kategori: Kering ");
blinkLEDNonBlocking(LEDPIN, 1000);
}
}
static int lastServoAngle = -1;
if (servoAngle != lastServoAngle) {
servo.write(servoAngle);
lastServoAngle = servoAngle;
}
lcd.setCursor(0, 2);
lcd.print("Servo: ");
lcd.print(servoAngle);
lcd.print(" derajat ");
}
void blinkLEDNonBlocking(int pin, int interval) {
static unsigned long previousMillis = 0;
static bool ledState = LOW;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(pin, ledState);
}
}
Tombol ON/OFF
Tombol ganti mode.
LED sistem ON/OFF.
LED indikator suhu/kelembapan