246   222   68    

Как добавить модуль 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 В. Мы используем протокол связи I2C для связи модуля RTC с нашим Raspberry Pi Zero.

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

Чтобы настроить модуль RTC, нам нужно включить I2C на нашем Raspberry Pi.

Запустите raspi config на терминале:

$sudo raspi-config

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

Затем включите I2C, выбрав P5 I2C.

После включения I2C перезагрузите Pi с помощью:

$sudo reboot

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

С включенным интерфейсом I2C мы можем проверить, работает ли наше соединение с модулем RTC.

Перед установкой чего-либо на Pi убедитесь, что прошивка вашего 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 на Pi.

$sudo apt-get install python-pip

$sudo apt-get install python3-pip

Затем установите git, чтобы мы могли клонировать библиотеку в git.

$sudo apt install git-all

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

Для этого введите в терминал команду ниже:

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

Закончив клонирование, создайте Python файл - RTCmodule.py. Скопируйте код ниже и вставьте в пустой файл .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», который мешает реальному 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.

Ардуино+