0
0
Iot-protocolsHow-ToBeginner · 4 min read

How to Use Real Time Clock with Raspberry Pi: Setup and Code

To use a real time clock (RTC) with Raspberry Pi, connect the RTC module via I2C pins, enable I2C interface, and configure the device using raspi-config. Then install necessary tools and use Python or system commands to read and set the time from the RTC module.
📐

Syntax

Using a real time clock (RTC) with Raspberry Pi involves these main steps:

  • Connect RTC module: Attach the RTC to Raspberry Pi's I2C pins (SDA, SCL, 3.3V, GND).
  • Enable I2C interface: Use sudo raspi-config to enable I2C communication.
  • Load RTC kernel module: Use sudo modprobe rtc-ds1307 (example for DS1307 RTC chip).
  • Detect RTC device: Check with i2cdetect -y 1 to find RTC address.
  • Register RTC device: Use sudo bash -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device' to add RTC.
  • Read/Set time: Use hwclock commands or Python libraries to interact with RTC time.
bash
sudo raspi-config
# Enable I2C interface
sudo apt-get install i2c-tools python3-smbus
sudo modprobe rtc-ds1307
sudo i2cdetect -y 1
sudo bash -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'
sudo hwclock -r
💻

Example

This example shows how to read the time from a DS1307 RTC module using Python on Raspberry Pi.

python
import smbus
import time

# I2C bus (1 for Raspberry Pi 3 and later)
bus = smbus.SMBus(1)

# DS1307 RTC I2C address
RTC_ADDRESS = 0x68

# Function to convert BCD to decimal

def bcd_to_dec(bcd):
    return (bcd >> 4) * 10 + (bcd & 0x0F)

# Read seconds, minutes, hours from RTC
seconds = bcd_to_dec(bus.read_byte_data(RTC_ADDRESS, 0x00) & 0x7F)
minutes = bcd_to_dec(bus.read_byte_data(RTC_ADDRESS, 0x01))
hours = bcd_to_dec(bus.read_byte_data(RTC_ADDRESS, 0x02))

print(f"RTC Time: {hours:02d}:{minutes:02d}:{seconds:02d}")
Output
RTC Time: 14:35:27
⚠️

Common Pitfalls

Common mistakes when using RTC with Raspberry Pi include:

  • Not enabling the I2C interface in raspi-config, causing communication failure.
  • Using wrong I2C bus number; Raspberry Pi 3+ uses bus 1, older models use bus 0.
  • Forgetting to load the correct RTC kernel module for your RTC chip.
  • Not registering the RTC device properly, so hwclock commands fail.
  • Trying to use RTC without a backup battery, so time resets on power loss.

Wrong way example: Trying to read RTC without enabling I2C:

bash
sudo hwclock -r
# Output: hwclock: Cannot access the Hardware Clock via any known method.
Output
hwclock: Cannot access the Hardware Clock via any known method.
📊

Quick Reference

Summary tips for using RTC with Raspberry Pi:

  • Always enable I2C interface via raspi-config.
  • Use i2cdetect -y 1 to confirm RTC presence.
  • Load correct RTC module (e.g., rtc-ds1307 for DS1307 chip).
  • Register RTC device with correct I2C address.
  • Use hwclock to read and set system time from RTC.
  • Use Python smbus library for custom RTC interaction.

Key Takeaways

Enable I2C interface on Raspberry Pi before connecting RTC module.
Use correct I2C bus and RTC kernel module for your hardware.
Register the RTC device properly to use system commands like hwclock.
Use Python smbus library to read RTC time programmatically.
Ensure RTC has a backup battery to keep time when power is off.