#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include "time.h"
#include <OneWire.h>
#include <DallasTemperature.h>
// LCD setup (20x4 LCD, common I2C address 0x27 or 0x3F)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NTP Server & Timezone (India = GMT+5:30)
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 19800; // GMT+5:30 in seconds
const int daylightOffset_sec = 0;
// Days of the week
const char* daysOfTheWeek[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// DS18B20 setup
#define ONE_WIRE_BUS 4 // GPIO4 (D4) on ESP32
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
// Initialize LCD
lcd.init();
lcd.backlight();
// Connect Wi-Fi
WiFi.begin(ssid, password);
lcd.setCursor(0,0);
lcd.print("Connecting WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WiFi Connected!");
// Init NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// Init DS18B20
sensors.begin();
}
void loop() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Time Error!");
return;
}
// Read temperature
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
lcd.clear();
// Line 1: Date
lcd.setCursor(0,0);
lcd.printf("Date: %02d/%02d/%04d", timeinfo.tm_mday, timeinfo.tm_mon+1, timeinfo.tm_year+1900);
// Line 2: Time
lcd.setCursor(0,1);
lcd.printf("Time: %02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Line 3: Day
lcd.setCursor(0,2);
lcd.printf("Day : %s", daysOfTheWeek[timeinfo.tm_wday]);
// Line 4: Temperature
lcd.setCursor(0,3);
if (temperatureC == DEVICE_DISCONNECTED_C) {
lcd.print("Temp: Sensor Error");
} else {
lcd.printf("Temp: %.2f%cC", temperatureC, 223);
}
delay(1000);
}