#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดค่าเริ่มต้น
#define BUTTON_PIN 12
#define DHT_PIN 13
#define DHT_TYPE DHT22
// สร้าง object
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
DHT dht(DHT_PIN, DHT_TYPE);
// ตัวแปรสำหรับเก็บสถานะ
int displayMode = 1;
int buttonState; // สถานะปุ่มปัจจุบัน
int lastButtonState = HIGH; // สถานะปุ่มครั้งก่อน
bool buttonPressed = false; // เพิ่มตัวแปรตรวจสอบการกดปุ่ม
unsigned long lastDebounceTime = 0;
unsigned long lastUpdateTime = 0;
unsigned long lastDHTReadTime = 0;
const unsigned long debounceDelay = 50;
const unsigned long updateInterval = 1000;
const unsigned long dhtInterval = 2000;
// ตัวแปรเก็บค่า DHT
float humidity = 0;
float temperature = 0;
bool dhtError = false;
void setup() {
Wire.begin();
lcd.init();
lcd.backlight();
rtc.begin();
dht.begin();
pinMode(BUTTON_PIN, INPUT_PULLUP);
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
unsigned long currentMillis = millis();
// จัดการปุ่มกด
handleButton();
// อ่านค่า DHT ทุก 2 วินาที
if (currentMillis - lastDHTReadTime >= dhtInterval) {
readDHT();
lastDHTReadTime = currentMillis;
}
// อัพเดทจอ LCD ทุก 1 วินาที
if (currentMillis - lastUpdateTime >= updateInterval) {
updateDisplay();
lastUpdateTime = currentMillis;
}
}
void handleButton() {
int reading = digitalRead(BUTTON_PIN);
unsigned long currentMillis = millis();
if (reading != lastButtonState) {
lastDebounceTime = currentMillis;
}
if ((currentMillis - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
// เมื่อปุ่มถูกปล่อย (เปลี่ยนจาก LOW เป็น HIGH)
if (buttonState == HIGH && buttonPressed) {
displayMode = (displayMode == 1) ? 2 : 1;
lcd.clear();
updateDisplay();
buttonPressed = false;
}
// เมื่อปุ่มถูกกด (เปลี่ยนจาก HIGH เป็น LOW)
else if (buttonState == LOW) {
buttonPressed = true;
}
}
}
lastButtonState = reading;
}
void readDHT() {
float newHumidity = dht.readHumidity();
float newTemperature = dht.readTemperature();
if (isnan(newHumidity) || isnan(newTemperature)) {
dhtError = true;
} else {
humidity = newHumidity;
temperature = newTemperature;
dhtError = false;
}
}
void updateDisplay() {
if (displayMode == 1) {
displayDateTime();
} else {
displayTempHumid();
}
}
void displayDateTime() {
DateTime now = rtc.now();
// บรรทัดแรก: แสดง "Date" และวันที่
lcd.setCursor(0, 0);
lcd.print("Date ");
if (now.day() < 10) lcd.print("0");
lcd.print(now.day());
lcd.print("/");
if (now.month() < 10) lcd.print("0");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year() % 100);
// บรรทัดที่สอง: แสดง "Time" และเวลา
lcd.setCursor(0, 1);
lcd.print("Time ");
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second());
}
void displayTempHumid() {
if (dhtError) {
lcd.setCursor(0, 0);
lcd.print("DHT Error!");
return;
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity, 1);
lcd.print("%");
}