#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
// Inisialisasi LCD I2C (Alamat 0x27 atau 0x3F, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definisi Pin DHT
#define DHTPIN 4 // Pin digital yang terhubung ke DHT
#define DHTTYPE DHT22 // Menggunakan DHT22 (bisa diganti DHT11)
DHT dht(DHTPIN, DHTTYPE);
// Inisialisasi RTC
RTC_DS1307 rtc; // Atau gunakan RTC_DS3231 jika memakai DS3231
void setup() {
Serial.begin(115200);
// Inisialisasi perangkat
dht.begin();
lcd.init();
lcd.backlight();
// Cek koneksi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan!");
while (1);
}
// Jika RTC belum disetel waktu, set ke waktu kompilasi
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.setCursor(0, 0);
lcd.print("Sistem Siap");
delay(2000);
lcd.clear();
}
void loop() {
// Membaca suhu dari sensor DHT
float t = dht.readTemperature();
// Cek apakah pembacaan gagal
if (isnan(t)) {
Serial.println("Gagal membaca dari sensor DHT!");
return;
}
// Mengambil waktu dari RTC
DateTime now = rtc.now();
// Format tanggal dan waktu YYYY-MM-DD HH:MM:SS
char timestamp[25];
sprintf(timestamp, "%04d-%02d-%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(),
now.hour(), now.minute(), now.second());
// Variabel untuk menampung status teks
String statusSuhu = "";
// Logika sesuai ketentuan tugas
if (t >= -40 && t <= 20) {
statusSuhu = "Dingin ";
} else if (t >= 21 && t <= 80) {
statusSuhu = "Panas ";
} else {
statusSuhu = "Suhu Lain ";
}
// Tampilkan ke Serial Monitor
Serial.print(statusSuhu);
Serial.println(timestamp);
// Tampilkan ke LCD 16x2
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(statusSuhu);
lcd.setCursor(0, 1);
lcd.print(timestamp); // Menampilkan tanggal dan waktu di baris kedua
delay(2000); // Jeda 2 detik sebelum pembacaan berikutnya
}