#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define RELAY_PIN 7
#define LED_AC_PIN 13
#define UV_LED_PIN 8
#define LDR_PIN A0
#define RGB_PIN_R 3
#define RGB_PIN_G 5
#define RGB_PIN_B 6
#define TRIG_PIN 9
#define ECHO_PIN 10
#define SERVO_PIN 11
#define BUZZER_PIN 12
#define BUTTON_PIN 4
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo myservo;
bool servoOpened = false; // Status apakah servo terbuka
bool lastButtonState = HIGH; // Status terakhir dari tombol
void setup() {
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_AC_PIN, OUTPUT);
pinMode(UV_LED_PIN, OUTPUT);
pinMode(RGB_PIN_R, OUTPUT);
pinMode(RGB_PIN_G, OUTPUT);
pinMode(RGB_PIN_B, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Pushbutton dengan pullup
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_AC_PIN, LOW);
digitalWrite(UV_LED_PIN, LOW);
lcd.begin(20, 4);
lcd.backlight();
dht.begin();
myservo.attach(SERVO_PIN);
myservo.write(0); // Awal posisi servo (pintu tertutup)
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
int lightLevel = analogRead(LDR_PIN);
// Pengukuran jarak dengan sensor ultrasonik
long duration;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
long distance = (duration / 2) / 29.1;
// Menampilkan data di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Kelembapan: ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0, 2);
lcd.print("Cahaya: ");
lcd.print(lightLevel);
lcd.setCursor(0, 3);
lcd.print("Jarak: ");
lcd.print(distance);
lcd.print(" cm");
// Kontrol LED untuk AC
if (t > 30 || h < 20) {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_AC_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_AC_PIN, LOW);
}
// Kontrol RGB LED berdasarkan suhu
if (t > 25) {
analogWrite(RGB_PIN_R, 255); // Merah untuk suhu tinggi
analogWrite(RGB_PIN_G, 0);
analogWrite(RGB_PIN_B, 0);
} else if (t >= 20 && t <= 25) {
analogWrite(RGB_PIN_R, 0);
analogWrite(RGB_PIN_G, 255); // Hijau untuk suhu normal
analogWrite(RGB_PIN_B, 0);
} else {
analogWrite(RGB_PIN_R, 0);
analogWrite(RGB_PIN_G, 0);
analogWrite(RGB_PIN_B, 255); // Biru untuk suhu rendah
}
// Kontrol LED untuk Lampu Rumah
if (lightLevel < 400) {
digitalWrite(UV_LED_PIN, HIGH); // Menyalakan lampu
} else {
digitalWrite(UV_LED_PIN, LOW); // Mematikan lampu
}
// Kontrol Buzzer
if (distance <= 10) { // Jika jarak <= 3 cm
digitalWrite(BUZZER_PIN, HIGH); // Buzzer menyala
} else {
digitalWrite(BUZZER_PIN, LOW); // Buzzer mati
}
// Membaca status tombol
bool buttonState = digitalRead(BUTTON_PIN);
// Deteksi perubahan status tombol (ditekan dan dilepas)
if (buttonState == LOW && lastButtonState == HIGH) {
delay(50);
// Toggle status servo
if (servoOpened) {
myservo.write(0); // Tutup servo
servoOpened = false;
} else {
myservo.write(90); // Buka servo
servoOpened = true;
}
delay(200); // Debounce untuk menghindari pembacaan tombol yang tidak akurat
}
lastButtonState = buttonState;
delay(2000);
}