Как добавить модуль RTC к Raspberry Pi?

Raspberry Pi и модуль RTC DS3231

В данном уроке мы разберёмся, как отслеживать дату и время на Raspberry Pi, а также научимся работать с модулем RTC.

В Raspberry Pi нет встроенных часов, которые продолжают работать при выключении платы. Вместо них применяется сетевой протокол времени (NTP), использующий подключение по Ethernet или Wi-Fi при каждом включении. Для отслеживания времени без обращения к Интернету при каждой загрузке Pi необходим модуль часов реального времени (RTC).

RTC представляет собой электронное устройство, отслеживающее текущую дату и время благодаря встроенной батарее, которая обеспечивает его работу даже при отключённом основном питании. Существует множество разновидностей модулей RTC, рассчитанных на различные задачи.

В данной статье мы рассмотрим, каким образом подключить модуль RTC DS3231 к Raspberry Pi и использовать его в качестве аппаратных часов при помощи соответствующей библиотеки.

Комплектующие

Для выполнения данного урока потребуется совсем немного компонентов — плата и часы реального времени:

  • Raspberry Pi Zero

  • DS3231

Программное обеспечение:

  • Raspbian

Подключаем Pi Zero к DS3231

Для начала необходимо соединить модуль RTC с Raspberry Pi Zero. Перед выполнением подключений убедитесь, что Raspberry Pi выключен либо отсоединён от источника питания. После этого выполняем соединения в соответствии с таблицей и схемой, представленными ниже.

Таблица подключения DS3231 к Raspberry Pi

DS3231 функционирует при напряжении 3,3 В, поэтому на вход VCC необходимо подать именно 3,3 В. Для обмена данными между модулем RTC и Raspberry Pi Zero мы используем протокол I2C.

Настройка модуля RTC

Для настройки модуля RTC необходимо активировать I2C на Raspberry Pi.

Откройте raspi-config через терминал:

sudo raspi-config

В меню конфигурации выберите пункт: Interfacing Option.

raspi-config Interfacing Options

Далее активируйте I2C, выбрав пункт P5 I2C.

Включение I2C в raspi-config

Активировав I2C, перезагрузите Pi командой:

sudo reboot

Проверка подключения модуля RTC

При включённом интерфейсе I2C можно убедиться, что соединение с модулем RTC функционирует корректно.

Прежде чем устанавливать что-либо на Pi, удостоверьтесь, что прошивка вашего Pi актуальна. Нередко ошибки при установке зависимостей возникают именно из-за устаревшей версии системы.

sudo apt-get update -y
sudo apt-get upgrade -y

Необходимо установить пакет python-smbus i2c-tools, чтобы удостовериться, что Raspberry Pi обнаружил I2C-соединение с модулем RTC.

Выполните в терминале:

sudo apt-get install python-smbus i2c-tools

Затем:

sudo i2cdetect -y 1

Для более ранних версий Pi 1 выполните:

sudo i2cdetect -y 0
Результат i2cdetect — адрес 0x68

0x68 — это типичный адрес для часов реального времени, в особенности для DS3231. Появление #68 в списке адресов говорит о том, что драйвер пока не задействовал данный адрес. Если отображается UU, значит адрес уже занят драйвером.

Использование модуля RTC и библиотеки

Попробуем поработать с RTC, используя библиотеку SDL DS3231 (также на нашем сайте доступна простая библиотека DS3231).

Для версии Raspberry Pi Zero Lite или Headless может потребоваться установить Python, прежде чем продолжить, поскольку в Raspbian Lite он не входит в предустановленные пакеты.

См. также

Как написать и запустить код Python на Raspberry Pi

Установите Python на Pi.

sudo apt-get install python-pip
sudo apt-get install python3-pip

После этого установите git для клонирования репозитория с библиотекой.

sudo apt install git-all

Теперь клонируем библиотеку и проверим, работает ли RTC с библиотекой RTC_SDL_DS3231.

Для этого выполните в терминале следующую команду:

sudo git clone https://github.com/switchdoclabs/RTC_SDL_DS3231.git

По завершении клонирования создайте Python-файл — RTCmodule.py. Вставьте в него приведённый ниже код и сохраните файл.

import time
import SDL_DS3231

ds3231 = SDL_DS3231.SDL_DS3231(1, 0x68)
ds3231.write_now()

while True:
    print "Raspberry Pi=\t" + time.strftime(%Y-%m-%d %H:%M:%S")
    print "Ds3231=\t\t%s" % ds3231.read_datetime()
    time.sleep(10.0)

Разбираем код

В первую очередь импортируем модули, применяемые в проекте.

import time
import SDL_DS3231

Выполняем инициализацию часов.

ds3231 = SDL_DS3231.SDL_DS3231(1, 0x68)

Далее выводим время Raspberry Pi и модуля RTC.

print "Raspberry Pi=\t" + time.strftime(%Y-%m-%d %H:%M:%S")
print "Ds3231=\t\t%s" % ds3231.read_datetime()

Запускаем файл.

python RTCmodule.py

Результат должен совпадать со скриншотом ниже:

Результат работы скрипта RTCmodule.py

Как сделать время на DS3231 отличным от часов Pi

Чтобы аппаратные часы DS3231 отображали время, отличающееся от системных часов Pi, можно воспользоваться командой write_all().

ds3231.write_all(seconds, minutes, hours, day, date, month, year, save_as_24h = True)

Диапазон:

  • seconds [0,59], #секунды

  • minutes [0,59], #минуты

  • hours [0,23], #часы

  • day [0,7], #дни

  • date [1-31], #дата

  • month [1-12], #месяц

  • year [0-99] #год

Берём тот же код, что и ранее, но заменяем ds3231.now() на ds3231.write_all():

import time
import SDL_DS3231

ds3231 = SDL_DS3231.SDL_DS3231(1, 0x68)
ds3231.write_all(29,30,4,1,3,12,92,True)
while True:

    print "Raspberry Pi=\t" + time.strftime(%Y-%m-%d %H:%M:%S")
    print "Ds3231=\t\t%s" % ds3231.read_datetime()
    time.sleep(10.0)

Получаем:

Результат с измененным временем DS3231

Как видно, дата и время DS3231 изменились. Однако, поскольку цель проекта — использовать RTC непосредственно на Raspberry Pi, нам предстоит выполнить ещё несколько действий.

Использование модуля RTC на Raspberry

На следующем этапе необходимо настроить DS3231 для работы с Raspberry Pi. Для начала выполните все описанные выше шаги.

Нам понадобится адрес 0x68 модуля RTC. Требуется отредактировать файл config.txt и добавить наложение дерева устройств.

Выполните:

sudo nano /boot/config.txt

Далее отредактируйте конфигурацию Pi, добавив используемый вами чип RTC в конец файла:

dtoverlay=i2c-rtc,ds1307

или

dtoverlay=i2c-rtc,pcf8523

или

dtoverlay=i2c-rtc,ds3231

Получаем:

Добавление dtoverlay в config.txt

Сохраните изменения и перезагрузите Pi для проверки состояния адреса 0x68.

sudo reboot
sudo i2cdetect -y 1

Теперь 0x68 отображается как UU:

Адрес 0x68 показывает UU

Далее необходимо отключить «фиктивный hwclock», который препятствует работе реальных аппаратных часов RTC.

Для отключения фиктивного hwclock выполните в терминале следующие команды:

sudo apt-get -y remove fake-hwclock
sudo update-rc.d -f fake-hwclock remove
sudo systemctl disable fake-hwclock

Делаем DS3231 главными часами

Отключив фиктивный hwclock, мы можем назначить наши часы реального времени основными системными часами.

Выполните:

sudo nano /lib/udev/hwclock-set

и добавьте следующую строку:

#if [-e/run/systemd/system];then
#exit 0
#if
Редактирование hwclock-set — часть 1
#/sbin/hwclock --rtc=$dev --systz --badyear
#/sbin/hwclock --rtc=$dev --systz
Редактирование hwclock-set — часть 2

Теперь всё готово для проверки корректности работы.

Как синхронизировать время от Raspberry Pi к RTC

Изначально на RTC будет установлено неверное время. Необходимо скорректировать его, чтобы можно было использовать RTC в роли аппаратных часов.

Для проверки текущей даты RTC выполните:

sudo hwclock

Чтобы скорректировать время RTC, потребуется подключение по Ethernet или Wi-Fi для синхронизации правильного времени из Интернета с модулем RTC.

Для просмотра даты и времени введите в терминале:

date

Либо используйте:

date --date="Feb 2 2014 13:12:10"

Для ручной установки даты и времени. Учтите, что при наличии подключения к Интернету по Ethernet или Wi-Fi вручную заданное время будет автоматически скорректировано.

Как синхронизировать время от RTC к Pi

Кроме того, можно установить системное время Pi на основе показаний модуля RTC. Для этого введите:

sudo hwclock --systohc

или

sudo hwclock -w

Также имеется возможность задать дату и время в модуле RTC вручную, используя:

sudo hwclock --set --date "Sat Aug 10 08:31:24 PDT 2013"

или

sudo hwclock --set --date "8/11/2013 23:10:45"

Завершив синхронизацию времени, остаётся лишь вставить батарею в модуль RTC, чтобы он мог сохранять дату и время. При следующем включении Raspberry Pi дата и время будут автоматически синхронизированы с модуля RTC.