#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// กำหนดขนาดของ LCD (2004) โดยใช้ I2C address 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
// กำหนดขาและประเภทของเซนเซอร์ DHT22
#define DHTPIN 8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ฟังก์ชันแสดงวันของสัปดาห์
String daysOfTheWeek[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
void setup() {
// เริ่มต้นการทำงานของ LCD, RTC, และเซนเซอร์ DHT22
lcd.init();
lcd.backlight();
dht.begin(); // เริ่มต้นเซนเซอร์ DHT22
if (!rtc.begin()) {
lcd.setCursor(0, 0);
lcd.print("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
// บรรทัดบน: แสดง วันที่ (2 digit), เดือน (2 digit), ปี พ.ศ.
lcd.setCursor(0, 0);
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year() + 543); // ปี พ.ศ.
// บรรทัดที่ 2: แสดง ชั่วโมง นาที วินาที (โดยให้ ":" กระพริบ) และวันของสัปดาห์
lcd.setCursor(0, 1);
lcd.print(now.hour() < 10 ? "0" : "");
lcd.print(now.hour());
if (millis() % 1000 < 500) {
lcd.print(":");
} else {
lcd.print(" ");
}
lcd.print(now.minute() < 10 ? "0" : "");
lcd.print(now.minute());
lcd.print(" ");
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
// อ่านค่าจากเซนเซอร์ DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
// ตรวจสอบว่าอ่านค่าได้สำเร็จ
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 2);
lcd.print("Error reading DHT22");
} else {
// บรรทัดที่ 3: แสดงความชื้น
lcd.setCursor(0, 2);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
// บรรทัดที่ 4: แสดงอุณหภูมิ
lcd.setCursor(0, 3);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
}
delay(2000); // หน่วงเวลา 2 วินาทีก่อนการอ่านค่าครั้งถัดไป
}