В этом уроке мы научимся отслеживать дату и время на Raspberry Pi и разберемся как использовать модуль RTC.
Raspberry Pi не содержит встроенных часов, которые работают, когда плата выключена. Вместо этого он использует сетевой протокол времени (NTP), который использует соединение Ethernet или Wi-Fi при каждом включении. Чтобы отслеживать время, не используя Интернет для синхронизации каждый раз при загрузке Pi, необходим модуль часов реального времени (RTC).
RTC - это электронное устройство, которое отслеживает текущую дату и время, используя внутреннюю батарею, которая позволяет ему продолжать работу, даже когда основной источник питания выключен. Существуют различные типы модулей RTC для различных нужд.
В этой статье мы поговорим о том, как использовать модуль RTC DS3231 с Raspberry Pi в качестве аппаратных часов с использованием нужной библиотеки.
Содержание
- Комплектующие
- Подключаем Pi Zero к DS3231
- Настройка модуля RTC
- Проверка подключения модуля RTC
- Использование модуля RTC и библиотеки
- Разбираем код
- Как сделать время на DS3231 отличным от часов Pi
- Использование модуля RTC на Raspberry
- Делаем DS3231 главными часами
- Как синхронизировать время от Raspberry Pi к RTC
- Как синхронизировать время от RTC к 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.
22 января 2021 в 00:12
Добрый день.
Спасибо за статью.
Небольшое замечание.
Команды hwclock —systohc и hwclock -w устанавливают время на RTC, беря за основу время Pi, чтобы установить время на Pi, основываясь на RTC, нужно использовать команду hwclock —hctosys