#include "Wire.h"
#include <LiquidCrystal_I2C.h>
// Alamat memori modul RTC di 0x68
#define DS1307_ADDRESS 0x68
// Alamat memori modul LCD di 0x27
LiquidCrystal_I2C lcd(0x27, 5, 4);
uint8_t clear = 0x00;
void setup()
{
Wire.begin();
Serial.begin(9600);
lcd.begin (16,2);
lcd.backlight();
// Pengaturan tanggal dan waktu
// setDateTime(20, 16, 8, 1, 4, 1, 21);
}
void loop()
{
// Membaca nilai (date dan time) pada modul DS1307
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(clear);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 0x07);
uint8_t seconds = bcdToDec(Wire.read());
uint8_t minutes = bcdToDec(Wire.read());
uint8_t hours = bcdToDec(Wire.read() & 0xff);
uint8_t wday = bcdToDec(Wire.read());
uint8_t mday = bcdToDec(Wire.read());
uint8_t month = bcdToDec(Wire.read());
uint8_t year = bcdToDec(Wire.read());
// Menampilkan data pada display
lcd.setCursor(0,0);
lcd.print(" ");
// menambahkan nilai 0 (clear) jika jam kurang dari 10
if (hours < 10)
lcd.print("0");
lcd.print(hours);
if (seconds & 1)
lcd.print(":");
else
lcd.print(" ");
// menambahkan nilai 0 (clear) jika menit kurang dari 10
if (minutes < 10)
lcd.print("0");
lcd.print(minutes);
if (seconds & 1)
lcd.print(":");
else
lcd.print(" ");
if (seconds < 10)
lcd.print("0");
lcd.print(seconds);
lcd.setCursor(1,1);
// Menampilkan nama hari dalam seminggu
switch(wday)
{
case 1: lcd.print("Minggu");
break;
case 2: lcd.print("Senin");
break;
case 3: lcd.print("Selasa");
break;
case 4: lcd.print("Rabu");
break;
case 5: lcd.print("Kamis");
break;
case 6: lcd.print("Jumat");
break;
case 7: lcd.print("Sabtu");
}
lcd.setCursor(8,1);
// menambahkan nilai 0 (clear) jika hari kurang dari 10
if (mday < 10)
lcd.print("0");
lcd.print(mday);
lcd.print("/");
// menambahkan nilai 0 (clear) jika bulan kurang dari 10
if (month < 10)
lcd.print("0");
lcd.print(month);
lcd.print("/");
lcd.print(year);
}
// Mengatur tanggal dan waktu pada modul RTC DS1307
void setDateTime(uint8_t seconds, uint8_t minutes, uint8_t hours,
uint8_t wday, uint8_t mday, uint8_t month, uint8_t year)
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(clear); // Membersihkan data, sehingga dapat menerima data baru
// Menuliskan nilai tanggal dan waktu yang ditampung dalam variabel sebelumnya
Wire.write(decToBcd(seconds));
Wire.write(decToBcd(minutes));
Wire.write(decToBcd(hours));
Wire.write(decToBcd(wday));
Wire.write(decToBcd(mday));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(clear);
Wire.endTransmission();
}
uint8_t decToBcd(uint8_t value)
{
// Konversi dari desimal ke BCD
return ((value / 10 * 16) + (value % 10));
}
uint8_t bcdToDec(uint8_t value)
{
// Konversi dari BCD ke desimal
return ((value / 16 * 10) + (value % 16));
}