GitHub picture of ramblehead

Adding RTC Clock to Raspberry Pi 4

A short instruction of how to add a Real Time Clock to Raspberry Pi 4.

Setting up I2C

Enable I2C

Add or uncomment dtparam=i2c_arm=on line in /boot/config.txt.

Add i2c-dev line to /etc/modules.

Reboot Raspberry Pi.

Check if RTC Module is Connected to I2C

$ i2cdetect -y 1
Example of the correct "68" output

If, at this stage instead of 68, the I2C address is UU (Unbound/Unknown) then the I2C device has been detected but not working correctly.

Setup RTC Clock

Enable kernel module:

# modprobe rtc-ds1307

Run the following command to add I2C RTC device:

# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

After above command, i2cdetect -y 1 will no longer have access to I2C address and display UU instead of RTC Clock:

Example of the correct "UU" output

Check the time on the RTC device:

$ hwclock --show

Check the system clock time:

# date
# # or
# timedatectl

Write the system time to the RTC board:

# hwclock --systohc

Auto-setup RTC on every boot

Add the following line to the end of /etc/modules:

rtc-ds1307

Add the following lines to /etc/rc.local:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s
date

Setting system and RTC time

To test RTC, disable automatic system clock synchronisation:

# systemctl disable systemd-timesync

To manually set the system clock and time zone via timedatectl:

$ timedatectl set-time "<YYYY>-<MM>-<DD> <HH>:<MM>:<SS>"
$ set-timezone <TIMEZONE>

To list possible <TIMEZONE> values:

$ timedatectl list-timezones

To manually set the system clock time via date:

# date MMDDhhmm[[CC]YY][.ss]
# # Where:
# #   MM: Month (01 to 12)
# #   DD: Day (01 to 31)
# #   hh: Hour (00 to 23)
# #   mm: Minute (00 to 59)
# #   CC: Century (optional)
# #   YY: Year (00 to 99)
# #   .ss: Seconds (optional)

To manually run auto-set the system clock time from NTP:

# apt install ntpdate
# ntpdate pool.ntp.org

RTC debugging hints

Run the following command as root to remove I2C RTC device:

# echo 0x68 > /sys/class/i2c-adapter/i2c-1/delete_device

Check RTC module kernel messages:

$ dmesg | grep ds1307

References