#include <DHT.h>
#define DHTPIN 15 // Pin data sensor DHT
#define DHTTYPE DHT22 // Ganti dengan DHT22 jika pakai DHT22
DHT dht(DHTPIN, DHTTYPE);
const int ledPin = 2;
const int buttonPin = 4;
unsigned long previousMillis = 0;
const unsigned long interval = 10000; // 10 detik
const unsigned long ledOnTime = 2000; // 2 detik
bool ledAutoState = false;
bool ledManualState = false;
unsigned long ledOnStartTime = 0;
float humidity = 0;
const float humidityThreshold = 80.0; // ambang batas kelembapan tinggi
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Tombol aktif LOW
dht.begin();
digitalWrite(ledPin, LOW);
}
void loop() {
unsigned long currentMillis = millis();
// Baca kelembapan setiap loop (atau bisa dibuat interval baca sendiri)
humidity = dht.readHumidity();
// Validasi pembacaan sensor
if (isnan(humidity)) {
Serial.println("Gagal membaca dari sensor DHT!");
return;
}
Serial.print("Kelembapan: ");
Serial.print(humidity);
Serial.println(" %");
bool kelembapanTinggi = humidity > humidityThreshold;
// === TIMER OTOMATIS LED ===
if (!ledAutoState && (currentMillis - previousMillis >= interval)) {
previousMillis = currentMillis;
if (!kelembapanTinggi) {
digitalWrite(ledPin, HIGH);
ledAutoState = true;
ledOnStartTime = currentMillis;
} else {
Serial.println("Kelembapan tinggi - LED otomatis tidak menyala.");
}
}
if (ledAutoState && (currentMillis - ledOnStartTime >= ledOnTime)) {
digitalWrite(ledPin, LOW);
ledAutoState = false;
}
// === TOMBOL MANUAL LED ===
if (digitalRead(buttonPin) == LOW && !ledManualState) {
if (!kelembapanTinggi) {
digitalWrite(ledPin, HIGH);
ledManualState = true;
ledOnStartTime = currentMillis;
} else {
Serial.println("Kelembapan tinggi - LED manual tidak menyala.");
}
}
if (ledManualState && (currentMillis - ledOnStartTime >= ledOnTime)) {
digitalWrite(ledPin, LOW);
ledManualState = false;
}
delay(100); // Hindari pembacaan terlalu cepat
}