#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#define DHTPIN 13 // กำหนดขา DHT22 เป็นขา 13
#define DHTTYPE DHT22 // กำหนดประเภท DHT
#define SWITCH_INTERVAL 5000 // ระยะเวลาในการสลับหน้าจอ (5 วินาที)
// กำหนด address ของ LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0;
bool showDateTime = true; // ตัวแปรควบคุมการสลับหน้าจอ
void setup() {
// เริ่มต้น LCD
lcd.init();
lcd.backlight();
// เริ่มต้น RTC
if (!rtc.begin()) {
lcd.print("RTC Error!");
while(1);
}
// เริ่มต้น DHT
dht.begin();
// ตั้งเวลาถ้า RTC ยังไม่เคยตั้ง
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void displayDateTime() {
DateTime now = rtc.now();
// แสดงวันที่บรรทัดบน
lcd.setCursor(0, 0);
lcd.print("Date: ");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
// แสดงเวลาบรรทัดล่าง
lcd.setCursor(0, 1);
lcd.print("Time: ");
if(now.hour() < 10) lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if(now.minute() < 10) lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(':');
if(now.second() < 10) lcd.print('0');
lcd.print(now.second(), DEC);
}
void displayTempHum() {
float h = dht.readHumidity();
float t = dht.readTemperature();
// ตรวจสอบการอ่านค่าผิดพลาด
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.print("DHT Error!");
return;
}
// แสดงอุณหภูมิบรรทัดบน
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t, 1);
lcd.print((char)223); // สัญลักษณ์องศา
lcd.print("C ");
// แสดงความชื้นบรรทัดล่าง
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(h, 1);
lcd.print("% ");
}
void loop() {
unsigned long currentMillis = millis();
// ตรวจสอบเวลาเพื่อสลับการแสดงผล
if (currentMillis - previousMillis >= SWITCH_INTERVAL) {
previousMillis = currentMillis;
showDateTime = !showDateTime; // สลับสถานะการแสดงผล
lcd.clear(); // เคลียร์หน้าจอก่อนแสดงผลใหม่
}
// แสดงผลตามสถานะ
if (showDateTime) {
displayDateTime();
} else {
displayTempHum();
}
delay(100); // หน่วงเวลาเล็กน้อยเพื่อลดการกระพริบของจอ
}