#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Konfigurasi DHT
#define DHTPIN 2 // Pin data DHT22
#define DHTTYPE DHT22 // Tipe DHT
// Konfigurasi LED
#define LED_RED 4 // LED merah untuk suhu over
#define LED_YELLOW 5 // LED kuning untuk suhu under
#define LED_GREEN 6 // LED hijau untuk suhu normal
#define LED_BLUE 3 // LED biru untuk relay ON
// Konfigurasi relay dan buzzer
#define RELAYPIN 3 // Pin relay
#define BUZZERPIN 9 // Pin buzzer
// Konfigurasi pushbutton
#define BUTTON_START 7 // Pin untuk tombol start
#define BUTTON_STOP 8 // Pin untuk tombol stop
// Inisialisasi sensor dan LCD
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C bisa disesuaikan (0x27 atau 0x3F biasanya)
// Batas suhu
const float TEMP_OVER = 70.0; // Batas suhu maksimum
const float TEMP_NORMAL_LOW = 25.0; // Batas suhu normal bawah
// Status program
bool isRunning = false;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.begin(16, 2); // Inisialisasi LCD dengan 16 kolom dan 2 baris
lcd.backlight();
// Konfigurasi pin
pinMode(RELAYPIN, OUTPUT);
pinMode(BUZZERPIN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(BUTTON_START, INPUT_PULLUP); // Tombol start dengan pull-up internal
pinMode(BUTTON_STOP, INPUT_PULLUP); // Tombol stop dengan pull-up internal
// Pastikan kondisi awal
digitalWrite(RELAYPIN, HIGH); // Relay OFF
digitalWrite(BUZZERPIN, LOW); // Buzzer OFF
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
}
void loop() {
// Cek tombol start
if (digitalRead(BUTTON_START) == LOW) {
isRunning = true; // Aktifkan program
delay(5); // Debounce
}
// Cek tombol stop
if (digitalRead(BUTTON_STOP) == LOW) {
isRunning = false; // Matikan program
// Pastikan semua output mati
digitalWrite(RELAYPIN, HIGH);
noTone(BUZZERPIN);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: Stopped ");
delay(200); // Debounce
}
// Jika program tidak aktif, lewati loop
if (!isRunning) {
return;
}
// Membaca suhu dari sensor
float suhu = dht.readTemperature();
// Validasi pembacaan sensor
if (isnan(suhu)) {
Serial.println("Gagal membaca data dari sensor DHT!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
delay(2000);
return;
}
// Menampilkan suhu pada serial monitor dan LCD
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" *C");
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(suhu);
lcd.print(" C ");
// Logika LED, buzzer, dan relay
if (suhu > TEMP_OVER) {
// Suhu terlalu tinggi
digitalWrite(RELAYPIN, HIGH); // Matikan relay
tone(BUZZERPIN, 1000); // Nyalakan buzzer dengan frekuensi 1000 Hz
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: Overheat");
} else {
// Semua kondisi lain (normal atau low)
digitalWrite(RELAYPIN, LOW); // Nyalakan relay
noTone(BUZZERPIN); // Matikan buzzer
if (suhu < TEMP_NORMAL_LOW) {
// Suhu terlalu rendah
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: Too Low ");
} else {
// Suhu normal
digitalWrite(LED_RED, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
lcd.setCursor(0, 1);
lcd.print("Status: Normal ");
}
}
delay(5); // Kurangi delay untuk respons lebih cepat
}