Как добавить модуль RTC к Raspberry Pi?
В данном уроке мы разберёмся, как отслеживать дату и время на 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 функционирует при напряжении 3,3 В, поэтому на вход VCC необходимо подать именно 3,3 В. Для обмена данными между модулем RTC и Raspberry Pi Zero мы используем протокол I2C.
Настройка модуля RTC
Для настройки модуля RTC необходимо активировать I2C на Raspberry Pi.
Откройте raspi-config через терминал:
sudo raspi-config
В меню конфигурации выберите пункт: Interfacing Option.
Далее активируйте I2C, выбрав пункт P5 I2C.
Активировав 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
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
Результат должен совпадать со скриншотом ниже:
Как сделать время на 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 изменились. Однако, поскольку цель проекта — использовать 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
Получаем:
Сохраните изменения и перезагрузите Pi для проверки состояния адреса 0x68.
sudo reboot
sudo i2cdetect -y 1
Теперь 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
#/sbin/hwclock --rtc=$dev --systz --badyear
#/sbin/hwclock --rtc=$dev --systz
Теперь всё готово для проверки корректности работы.
Как синхронизировать время от 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.