#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include "DHT.h"
#include <ESP32Servo.h>
// Pin definisi
#define DHTPIN 4
#define DHTTYPE DHT22
#define MQ2PIN 34
#define TRIGPIN 13
#define ECHOPIN 12
#define DT 19
#define SCK 18
#define SERVOPIN 14
#define LEDPIN 27
#define BUZZERPIN 26
// Objek sensor dan perangkat
DHT dht(DHTPIN, DHTTYPE);
HX711 scale;
Servo servo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel
bool lidOpen = false;
unsigned long lastOpen = 0;
void setup() {
Serial.begin(115200);
// Inisialisasi sensor dan perangkat
dht.begin();
lcd.init();
lcd.backlight();
servo.attach(SERVOPIN);
servo.write(0); // posisi tertutup
pinMode(MQ2PIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
pinMode(LEDPIN, OUTPUT);
pinMode(BUZZERPIN, OUTPUT);
// Load Cell
scale.begin(DT, SCK);
scale.set_scale(1); // Ganti nilai ini setelah kalibrasi!
scale.tare();
}
void loop() {
// --- Sensor DHT ---
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// --- Sensor MQ-2 ---
int gasValue = analogRead(MQ2PIN);
bool gasBahaya = gasValue > 1000;
// --- Sensor Berat (Load Cell) ---
float berat = scale.get_units();
Serial.print("Berat mentah: ");
Serial.println(scale.get_units());
// --- Sensor Ultrasonik ---
long duration;
float distance;
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
duration = pulseIn(ECHOPIN, HIGH);
distance = duration * 0.034 / 2;
// --- Kontrol Servo berdasarkan jarak ---
if (distance < 20 && !lidOpen) {
servo.write(0); // Buka tutup
lidOpen = true;
lastOpen = millis();
}
if (lidOpen && millis() - lastOpen > 5000) {
servo.write(90); // Tutup kembali setelah 5 detik
lidOpen = false;
}
// --- LCD Display ---
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("H:"); lcd.print(hum); lcd.print("% ");
lcd.print("W:"); lcd.print(berat, 1); lcd.print("kg");
lcd.setCursor(0, 1);
if (gasBahaya) {
lcd.print("GAS TERDETEKSI!");
tone(BUZZERPIN, 1000);
digitalWrite(LEDPIN, (millis() / 200) % 2); // LED berkedip
} else {
lcd.print(" GAS AMAN ");
noTone(BUZZERPIN);
digitalWrite(LEDPIN, LOW);
}
delay(500);
}