#include <Wire.h>
#include <LiquidCrystal.h>
#include <DHT.h>
// Pin untuk DHT11 dan jenis sensor
#define DHTPIN 3
#define DHTTYPE DHT22
// Pin untuk LED
#define LED_RED 31
#define LED_GREEN 33
#define LED_YELLOW 35
#define motor 4
#define servo 9
// Pin untuk tombol
#define BUTTON_START 47
#define BUTTON_STOP 49
#define BUTTON_INCREASE 51
#define BUTTON_DECREASE 53
// Inisialisasi LCD
LiquidCrystal lcd(36, 34, 32, 30, 28, 26);
// Inisialisasi sensor DHT
DHT dht(DHTPIN, DHTTYPE);
// Variabel untuk batas suhu
int lowerLimit = 20; // Batas bawah default
int upperLimit = 25; // Batas atas default
//posisi servo
int initial = 90;
// Mode operasi
bool isSettingMode = false; // Default mode operasi
void setup() {
// Inisialisasi komunikasi serial
Serial.begin(9600);
// Inisialisasi sensor DHT
dht.begin();
// Inisialisasi LCD
lcd.begin(16, 2); // LCD ukuran 16 kolom, 2 baris
// Inisialisasi LED sebagai output
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(motor, OUTPUT);
// Inisialisasi tombol sebagai input
pinMode(BUTTON_START, INPUT_PULLUP);
pinMode(BUTTON_STOP, INPUT_PULLUP);
pinMode(BUTTON_INCREASE, INPUT_PULLUP);
pinMode(BUTTON_DECREASE, INPUT_PULLUP);
// Menampilkan pesan awal
lcd.setCursor(0, 0);
lcd.print("Setting Mode");
lcd.setCursor(0, 1);
lcd.print("Press START...");
delay(2000); // Tunggu 2 detik
}
void loop() {
// Membaca tombol START dan STOP
if (digitalRead(BUTTON_START) == LOW) {
isSettingMode = false; // Beralih ke mode operasi
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Operation Mode");
delay(300);
}
if (digitalRead(BUTTON_STOP) == LOW) {
isSettingMode = true; // Beralih ke mode pengaturan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setting Mode");
delay(300);
}
if (isSettingMode) {
// Mode Setting: Mengatur rentang suhu
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Adjust Temp:");
lcd.setCursor(0, 1);
lcd.print("Low:");
lcd.print(lowerLimit);
lcd.print(" High:");
lcd.print(upperLimit);
// Tombol untuk menambah batas atas
if (digitalRead(BUTTON_INCREASE) == LOW) {
if (upperLimit < 40) {
upperLimit++; // Tambah nilai batas atas
} else {
upperLimit = 26; // Reset ke nilai awal jika mencapai maksimum
}
delay(300); // Debounce tombol
}
// Tombol untuk mengurangi batas bawah
if (digitalRead(BUTTON_DECREASE) == LOW) {
if (lowerLimit > 0) {
lowerLimit--; // Kurangi nilai batas bawah
} else {
lowerLimit = 30; // Reset ke nilai maksimum jika mencapai minimum
}
delay(300); // Debounce tombol
}
// Validasi rentang: Lower tidak boleh >= Upper
if (lowerLimit >= upperLimit) {
lowerLimit = upperLimit - 1;
}
delay(200); // Tunda untuk refresh
}
else {
// Mode Operasi: Membaca sensor dan mengontrol LED
float h = dht.readHumidity(); // Membaca kelembapan
float t = dht.readTemperature(); // Membaca suhu
//float temp = analogRead(sensorsuhu)*0.488;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
// Logika untuk menyalakan LED berdasarkan suhu
if (t < lowerLimit) {
// Suhu di bawah batas bawah
digitalWrite(LED_RED, LOW); // LED merah menyala
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
digitalWrite(motor, LOW);
} else if (t > upperLimit) {
// Suhu di atas batas atas
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW); // LED kuning menyala
digitalWrite(motor, HIGH);
} else {
// Suhu dalam rentang
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH); // LED hijau menyala
digitalWrite(LED_YELLOW, LOW);
digitalWrite(motor, LOW);
}
delay(1000); // Tunda pembaruan
}
}