#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <ESP32Servo.h>
#define DHT_PIN 15
#define DHT_TYPE DHT22
#define TRIG_PIN 4
#define ECHO_PIN 2
#define PIR_PIN 35
#define SERVO_PIN 26
#define RED_LED 13
#define GREEN_LED 12
#define BLUE_LED 14
#define YELLOW_LED 27
#define BUZZER_PIN 34
#define DOUT 18
#define CLK 5
HX711 scale;
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servoMotor;
void setup()
{
lcd.init();
lcd.clear();
lcd.backlight();
servoMotor.attach(SERVO_PIN);
servoMotor.write(0);
Serial.begin(115200);
scale.begin(DOUT, CLK);
scale.set_scale();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
dht.begin();
}
void loop() {
// Baca suhu dan kelembaban dari sensor DHT22
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Temp :");
lcd.setCursor(0, 1);
lcd.print(suhu);
lcd.print("°C");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humid :");
lcd.setCursor(0, 1);
lcd.print(kelembaban);
lcd.print("%");
delay(1000);
lcd.clear();
// Baca water level
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float durasi = pulseIn(ECHO_PIN, HIGH);
float air = durasi * 0.03408 / 2;
lcd.setCursor(0, 0);
lcd.print("Water :");
lcd.setCursor(0, 1);
lcd.print(air);
lcd.print("cm");
delay(1000);
lcd.clear();
scale.set_scale();
float berat = scale.get_units(10) / 420.00;
lcd.setCursor(0, 0);
lcd.print("Weight :");
lcd.setCursor(0, 1);
lcd.print(berat);
lcd.print("kg");
delay(1000);
lcd.clear();
int gerakan = digitalRead(PIR_PIN);
int statusPIR = LOW;
if (suhu < 25 || suhu > 28) {
digitalWrite(RED_LED, HIGH);
} else {
digitalWrite(RED_LED, LOW);
}
if (kelembaban < 60 || kelembaban > 70) {
digitalWrite(GREEN_LED, HIGH);
} else {
digitalWrite(GREEN_LED, LOW);
}
if (air < 12) {
digitalWrite(BLUE_LED, HIGH);
servoMotor.write(45);
delay(5000);
servoMotor.write(0);
} else {
digitalWrite(BLUE_LED, LOW);
}
if (gerakan == HIGH) {
Serial.println("Gerakan Terdeteksi!");
lcd.setCursor(0, 0);
lcd.print("Gerakan Terdeteksi");
delay(1000);
lcd.clear();
digitalWrite(BUZZER_PIN, LOW);
} else {
Serial.println("Gerakan Tidak Terdeteksi");
lcd.setCursor(0, 0);
lcd.print("Gerakan Tidak Terdeteksi");
delay(1000);
lcd.clear();
digitalWrite(BUZZER_PIN, HIGH);
}
if (berat < 5) {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(YELLOW_LED, HIGH);
tone(8, 262, 250);
servoMotor.write(90);
delay(5000);
servoMotor.write(0);
} else {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(YELLOW_LED, LOW);
noTone(8);
}
delay(5000); // delay antar siklus pembacaan
}