#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#define DHTPIN 8 // DHT22 sensor pin
#define DHTTYPE DHT22 // DHT22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor
RTC_DS1307 rtc; // Initialize RTC
LiquidCrystal_I2C lcd(0x27, 20, 4); // Set LCD address to 0x27 for a 20x4 LCD
void setup() {
lcd.init(); // Initialize LCD
lcd.backlight(); // Turn on the backlight
dht.begin(); // Initialize DHT sensor
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__))); // Set RTC to compile time
}
}
void loop() {
DateTime now = rtc.now(); // Get current time
float temperature = dht.readTemperature(); // Read temperature
float humidity = dht.readHumidity(); // Read humidity
// Display date: dd/mm/yyyy in Thai Buddhist year
lcd.setCursor(0, 0);
lcd.print(now.day() < 10 ? "0" : ""); lcd.print(now.day());
lcd.print("/");
lcd.print(now.month() < 10 ? "0" : ""); lcd.print(now.month());
lcd.print("/");
lcd.print(now.year() + 543); // Convert to Thai Buddhist year
// Display time: hh:mm with blinking colon and day of the week
lcd.setCursor(0, 1);
lcd.print(now.hour() < 10 ? "0" : ""); lcd.print(now.hour());
lcd.print((millis() / 1000) % 2 == 0 ? ":" : " "); // Blinking colon
lcd.print(now.minute() < 10 ? "0" : ""); lcd.print(now.minute());
lcd.setCursor(14, 1);
lcd.print(dayOfTheWeek(now.dayOfTheWeek())); // Display day of the week
// Display temperature and humidity
lcd.setCursor(0, 2);
lcd.print("Temp: ");
lcd.print(isnan(temperature) ? "Error" : String(temperature) + " C");
lcd.setCursor(0, 3);
lcd.print("Humidity: ");
lcd.print(isnan(humidity) ? "Error" : String(humidity) + " %");
delay(1000);
}
String dayOfTheWeek(uint8_t day) {
switch (day) {
case 0: return "Sun";
case 1: return "Mon";
case 2: return "Tue";
case 3: return "Wed";
case 4: return "Thu";
case 5: return "Fri";
case 6: return "Sat";
default: return "";
}
}