#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
const uint8_t btns[] = {26, 27};
const uint8_t leds[] = {4, 16, 17, 5};
byte button_states[2];
byte last_btn_state[2];
unsigned long last_debounce_time[2];
const unsigned long debounce_delay = 50;
byte press_count[2] = {0, 0};
unsigned long last_catch_time;
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
for (const uint8_t& btn : btns) pinMode(btn, INPUT_PULLUP);
for (const uint8_t& led : leds) pinMode(led, OUTPUT);
Serial.println("Mulai");
}
void tampilkan_kondisi(const uint8_t* data, size_t ukuran, float param, const char* teks) {
for (const uint8_t& led : leds) digitalWrite(led, LOW);
for (uint8_t i = 0; i < ukuran; i++) digitalWrite(leds[data[i]], HIGH);
lcd.setCursor(0, 0);
lcd.print("Suhu : ");
lcd.println(param);
lcd.setCursor(0, 1);
lcd.println(teks);
press_count[0] = 0;
press_count[1] = 0;
}
void loop() {
delay(10); // this speeds up the simulation
uint8_t readings[2];
for (uint8_t i = 0; i < 2; i++) {
readings[i] = digitalRead(btns[i]);
// Debounce tombol
if (readings[i] != last_btn_state[i])
last_debounce_time[i] = millis();
if ((millis() - last_debounce_time[i]) <= debounce_delay) {
last_btn_state[i] = readings[i];
continue;
}
if (readings[i] == button_states[i]) continue;
button_states[i] = readings[i];
if (button_states[i] != LOW) continue;
press_count[i]++;
last_catch_time = millis();
}
if ((millis() - last_catch_time) <= 500) return;
if (press_count[0] == 0 && press_count[1] == 0) return;
if (press_count[1] == 4) {
for (const uint8_t& led : leds) digitalWrite(led, LOW);
lcd.clear();
lcd.noBacklight();
return;
}
lcd.backlight();
float kelembaban = dht.readHumidity();
float temperatur = dht.readTemperature();
if (isnan(kelembaban) || isnan(temperatur)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
if (press_count[0] == 2 && temperatur > 30) {
const uint8_t pins[] = {0, 1, 2, 3};
tampilkan_kondisi(pins, 4, temperatur, "Ruangan sangat lembab");
}
else if (press_count[0] == 1 && temperatur > -10 && temperatur < 30) {
const uint8_t pins[] = {0, 1};
tampilkan_kondisi(pins, 2, temperatur, "Ruangan kering");
}
else if (press_count[1] == 3 && (temperatur >= 20 && temperatur <= 30)) {
const uint8_t pins[] = {2, 3};
tampilkan_kondisi(pins, 2, temperatur, "Ruangan lembab");
}
}
Tombol 1
Tombol 2