#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#define DHTPIN 32
#define DHTTYPE DHT22
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc; // Pastikan DS3231 jika Anda pakai modul DS3231, atau gunakan DS1307 untuk modul lain
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0;
bool showTempHumidity = false; // Memulai dengan menampilkan tanggal dan waktu
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NTP configuration
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 28800, 60000); // Sesuaikan zona waktu Anda (25200 untuk GMT+7)
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
dht.begin();
// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
// Start NTP client
timeClient.begin();
timeClient.update();
if (!rtc.begin()) {
lcd.print("RTC tidak ditemukan!");
while (1);
}
// Set RTC with NTP time
if (!rtc.isrunning()) {
timeClient.update();
rtc.adjust(DateTime(timeClient.getEpochTime())); // Sinkronkan waktu awal dari NTP
}
}
void loop() {
DateTime now = rtc.now();
unsigned long currentMillis = millis();
// Cek apakah sudah 5 detik berlalu
if (currentMillis - previousMillis >= 5000) {
previousMillis = currentMillis;
showTempHumidity = !showTempHumidity; // Bergantian antara tanggal dan suhu/kelembapan
}
if (showTempHumidity) {
// Tampilkan Suhu dan Kelembapan
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
lcd.setCursor(0, 0);
if (isnan(temperature) || isnan(humidity)) {
lcd.print("Error membaca DHT");
} else {
lcd.print("Suhu: ");
lcd.print(temperature, 0);
lcd.print((char)223); // Simbol derajat
lcd.print("C ");
lcd.print(humidity, 0);
lcd.print("% ");
}
} else {
// Tampilkan Tanggal
lcd.setCursor(0, 0);
lcd.print("Tgl: ");
lcd.print(now.day());
lcd.print("/");
lcd.print(now.month());
lcd.print("/");
lcd.print(now.year());
lcd.print(" "); // Kosongkan sisa karakter
}
// Tampilkan waktu di baris kedua (konstan)
lcd.setCursor(0, 1);
lcd.print("Waktu: ");
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());
delay(1000); // Perbarui setiap detik
}