https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=85683&start=25
https://cdn-learn.adafruit.com/downloads/pdf/adding-a-real-time-clock-to-raspberry-pi.pdf
http://electromost.com/news/raspberry_pi_dlja_domashnej_avtomatizacii_chasy_realnogo_vremeni/2015-09-13-135
http://www.avislab.com/blog/bme280_ru/
https://github.com/avislab/sensorstest
http://www.instructables.com/id/Arduino-Shower-Monitor-2/
Часов реального времени бывает три вида: самые дешевые PCF8523, самые популярные DS1307 и наиболее точные DS3231.
Если я правильно понял, интерфейс I2C зависит от питающего напряжения лишь в части подтягивающих резисторов, которые подтягивают обе линии к +Uпит . Поэтому, если надо к RPi с логикой 3.3 В подключить по I2C модуль с логикой 5 В, достаточно лишь проследить, чтобы все подтягивающие резисторы подключались только к напряжению 3.3 В. Такие резисторы уже есть на RPi, поэтому надо просто выпаять подтягивающие резисторы на модуле, если они подключены к 5 В.
Что касается логических уровней, то напряжения 3 В от RPi должно хватить для срабатывания логики на 5 В сторонних модулей.
Подключаем наш модуль часов к порту i2c-1, который выведен на основную клеммную колодку. Раньше я думал подключать к порту i2c-0, но его не удаётся включить на ранних этапах загрузки системы.
(sh) sudo apt-get update
(sh) sudo apt-get install i2c-tools
i2cdetect -y 1
- поиск адресов подключённых устройств. Здесь 1
- это номер I2C интерфейса. Вообще их два у RPi, по умолчанию доступен первый. Нулевой находится на нераспаянном разъёме и выключен.
i2cget -y 1 0x76 0xd0
- считать байт 0xD0 с устройства 0x76
- (sh) Сначала прописываем в файле
/boot/config.txt
одну из этих команд, в зависимости от типа модуля часов:
dtoverlay=i2c-rtc,ds1307
илиdtoverlay=i2c-rtc,pcf8523
илиdtoverlay=i2c-rtc,ds3231
- В файле
/lib/udev/hwclock-set
нужно закомментировать строкиа также закомментировать эти две строки:#if [ -e /run/systemd/system ] ; then # exit 0 #fi
/sbin/hwclock --rtc=$dev --systz --badyear
и
/sbin/hwclock --rtc=$dev --systz
Это, вообще-то, не самое верное решение. Но пока что единственное. - (Этот пункт передумал выполнять) Может это и лишнее, но я бы отключил скрипт
/etc/init.d/hwclock.sh
вот этой командой:
sudo update-rc.d hwclock.sh remove
- Удаление fake-hwclock.
Если RTC будет подключён постоянно, то лучше удалить fake-hwclock чтобы не путать ничего.sudo update-rc.d fake-hwclock remove sudo apt-get remove fake-hwclock sudo rm /etc/cron.hourly/fake-hwclock sudo rm /etc/init.d/fake-hwclock
- Презагрузка.
- Если сейчас выполнить команду
i2cdetect -y 1
, то вместо адреса часов68
будетUU
.
Можно посмотреть текущее время часов командойsudo hwclock -r
Если системное время синхронизировано с интернетом, то нужно записать его в часы:sudo hwclock -w
- Проверка наличия модуля RTC
Как было описано выше, попробуй выполнить командуi2cdetect -y 0
. В ответе будет видно число68
- адрес подключённого модуля часов. - Первый запуск, проверка и установка времени
Этот пункт можно и не выполнять. Это только единоразовая проверка.
Добавляем модуль часов в ядро Linux, затем запускаем консоль в root-режиме и добавляем новое устройство на порт i2c-0Если сейчас выполнить командуsudo modprobe rtc-ds1307 sudo bash echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device exit
i2cdetect -y 0
, то вместо адреса часов68
будетUU
.
Считываем текущее время с часов командойsudo hwclock -r
илиsudo hwclock -D -r
Если системное время синхронизировано с интернетом, то нужно записать его в часы:sudo hwclock -w
- Добавление модуля часов в ядро Linux
Чтобы модуль часов добавлялся в ядро Linux каждый раз при запуске, нужно прописать в файле/etc/modules
новую строкуrtc-ds1307
- Прописываем в автозапуск добавление устройства и синхронизацию времени
Для этого в файле/etc/rc.local
нужно прописать следующий код (после команды/bin/i2c0_remap
, естественно)echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device sudo hwclock -s
Принудительное обновление времени из интернета прямо сейчас:
sudo /etc/init.d/ntp stop
sudo ntpd -qg
sudo /etc/init.d/ntp start