Interface ds3231 precision rtc module with arduino

Введение

Как микроконтроллеры отслеживают время и дату? Обычный микроконтроллер обладает функцией таймера, который стартует от нуля при подаче напряжения питания, а затем начинает считать. В мире Arduino мы можем использовать функцию , чтобы узнать, сколько прошло миллисекунд с того времени, когда было подано напряжение питания. Когда вы снимете и снова подадите питания, она начнет отсчет с самого начала. Это не очень удобно, когда дело доходит до работы с часами и датами.

Вот здесь и будет удобно использование микросхемы RTC (Real Time Clock, часов реального времени). Эта микросхема с батарейкой 3В или каким-либо другим источником питания следит за временем и датой. Часы/календарь обеспечивают информацию о секундах, минутах, часах, дне недели, дате, месяце и годе. Микросхема корректно работает с месяцами продолжительностью 30/31 день и с високосными годами. Связь осуществляется через шину I2C (шина I2C в данной статье не обсуждается).

Если напряжение на главной шине питания Vcc падает ниже напряжения на батарее Vbat, RTC автоматически переключается в режим низкого энергопотребления от резервной батареи. Резервная батарея – это обычно миниатюрная батарея (в виде «монетки», «таблетки») напряжением 3 вольта, подключенная между выводом 3 и корпусом. Таким образом, микросхема по-прежнему будет следить за временем и датой, и когда на основную схему будет подано питание, микроконтроллер получит текущие время и дату.

В этом проекте мы будем использовать DS1307. У этой микросхемы вывод 7 является выводом SQW/OUT (выходом прямоугольных импульсов). Вы можете использовать этот вывод для мигания светодиодом и оповещения микроконтроллера о необходимости фиксации времени. Мы будем делать и то, и другое. Ниже приведено объяснение работы с выводом SQW/OUT.

Для управления работой вывода SQW/OUT используется регистр управления DS1307.

Ригистр управления DS1307
Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
OUT SQWE RS1 RS0
Бит 7: управление выходом (OUT)
Этот бит управляет выходным уровнем вывода SQW/OUT, когда выход прямоугольных импульсов выключен. Если SQWE = 0, логический уровень на выводе SQW/OUT равен 1, если OUT = 1, и 0, если OUT = 0. Первоначально обычно этот бит равен 0.
Бит 4: включение прямоугольных импульсов (SQWE)
Этот бит, когда установлен в логическую 1, включает выходной генератор. Частота прямоугольных импульсов зависит от значений битов RS0 и RS1. Когда частота прямоугольных импульсов настроена на значение 1 Гц, часовые регистры обновляются во время спада прямоугольного импульса. Первоначально обычно этот бит равен 0.
Биты 1 и 0: выбор частоты (RS)
Эти биты управляют частотой выходных прямоугольных импульсов, когда выход прямоугольных импульсов включен. Следующая таблица перечисляет частоты прямоугольных импульсов, которые могут быть выбраны с помощью данных битов. Первоначально обычно эти биты равны 1.
Выбор частоты прямоугольных импульсов и уровня на выводе SQW/OUT микросхемы DS1307
RS1 RS0 Частота импульсов и уровень на выходе SQW/OUT SQWE OUT
1 Гц 1 x
1 4,096 кГц 1 x
1 8,192 кГц 1 x
1 1 32,768 кГц 1 x
x x
x x 1 1

 Данная таблица поможет вам с частотой:

Выбор частоты прямоугольных импульсов DS1307
Частота импульсов Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
1 Гц 1
4,096 кГц 1 1
8,192 кГц 1 1
32,768 кГц 1 1 1

Если вы подключили светодиод и резистор к выводу 7 и хотите, чтобы светодиод мигал с частотой 1 Гц, то должны записать в регистр управления значение 0b00010000. Если вам нужны импульсы 4,096 кГц, то вы должны записать 0b000100001. В этом случае, чтобы увидеть импульсы вам понадобится осциллограф, так как светодиод будет мигать так быстро, что будет казаться, что он светится постоянно. Мы будем использовать импульсы с частотой 1 Гц.

Шаг 2. Схема соединения

Принципиальная схема устройства будильника Arduino достаточно большая. Прежде всего, подключите OLED к Arduino. Соединения для OLED с Arduino следующие:

  • CS-выход OLED на пин 10 Arduino
  • DC-вывод OLED на пин 9 Arduino
  • RST вывод OLED на вывод 8 Arduino
  • D1 или CLK вывод OLED на вывод 11 Arduino
  • D0 или DIN-штырь OLED на вывод 13 Arduino

Затем подключите модуль DS3231 к Arduino. Соединения следующие:

  • Подключите GND DS3231 к GND Arduino.
  • Подключите VCC DS3231 к 5V Arduino.
  • Подключите SDA DS3231 к A4 Arduino.
  • Подключите SCL DS3231 к A5 Arduino.

После этого подключите клавиатуру 4X4 к Arduino. Подключите первые 4 контакта клавиатуры, строка A0, A1, A2, A3 и последние четыре, которые относятся к контактам столбца к 6, 5, 4 и 3.

Подключите положительный контакт зуммера к контакту 7 Arduino и отрицательный сигнал зуммера к GND Arduino.

В конце, подключите положительный провод батареи к одному концу переключателя, а другой конец переключателя — к Vin Arduino.

Затем подключите отрицательный провод батареи к заземлению Arduino.

Functions for reading and writing RTC registers or static RAM (SRAM) for the DS3232

The DS3232RTC.h file defines symbolic names for the timekeeping, alarm, status and control registers. These can be used for the addr argument in the functions below.

writeRTC(byte addr, byte *values, byte nBytes)

Write one or more bytes to RTC memory.

Parameters

addr: First SRAM address to write (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
values: An array of values to write (*byte)nBytes: Number of bytes to write (byte). Must be between 1 and 31 (Wire library limitation) but is not checked by the library.

I2C status (byte). Returns zero if successful.

//write 1, 2, ..., 8 to the first eight DS3232 SRAM locations
byte buf = {1, 2, 3, 4, 5, 6, 7, 8};
RTC.sramWrite(0x14, buf, 8);

writeRTC(byte addr, byte value)

Write a single byte to RTC memory.

Parameters

addr: SRAM address to write (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
value: Value to write (byte)

I2C status (byte). Returns zero if successful.

RTC.writeRTC(3, 14);   //write the value 14 to SRAM address 3

readRTC(byte addr, byte *values, byte nBytes)

Read one or more bytes from RTC RAM.

Parameters

addr: First SRAM address to read (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
values: An array to receive the values read (*byte)nBytes: Number of bytes to read (byte). Must be between 1 and 32 (Wire library limitation) but is not checked by the library.

I2C status (byte). Returns zero if successful.

//read the last eight locations of SRAM into buf
byte buf;
RTC.sramRead(248, buf, 8);
Parameters

addr: SRAM address to read (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.

Режимы электропитания

Напряжение питания микросхемы может находиться в пределах 2,3…5,5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

Комбинации уровней напряжения Активная линия питания
Vcc < Vpf, Vcc < Vbat Vbat
Vcc < Vpf, Vcc > Vbat Vcc
Vcc > Vpf, Vcc < Vbat Vcc
Vcc > Vpf, Vcc > Vbat Vcc

Точность хода часов поддерживается за счет отслеживания  температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 64 секунды.

В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 – 01 – 00/00/00 (день/месяц/год/ – день недели – час/минуты/секунды).

Ток потребления при питании от батареи напряжением 3,63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5,5В, и высокой скорости передачи данных I2C.

Onboard 24C32 EEPROM

DS3231 RTC module also comes with a 32 bytes 24C32 EEPROM chip from Atmel having unlimited read-write cycles. It can be used to save settings or really anything.

The 24C32 EEPROM uses I2C interface for communication and shares the same I2C bus as DS3231.

The I2C address of the EEPROM can be changed easily with the three A0, A1 and A2 solder jumpers at the back. Each one of these is used to hardcode in the address. If a jumper is shorted with solder, that sets the address.

As per the 24C32’s datasheet, these 3 bits are placed at the end of the 7-bit I2C address, just before the Read/Write bit.

As there are 3 address inputs, which can take 2 states, either HIGH/LOW, we can therefore create 8 (23) different combinations(addresses).

TIP

By default, all the 3 address inputs are pulled HIGH using onboard pullups, giving 24C32 a default I2C address of 1010111Binary or 0x57Hex.

By shorting the solder jumpers, the address inputs are puled LOW. It allows you to set the I2C address according to below table.

Code for reading/writing onboard 24C32 EEPROM is given at the .

Режимы электропитания

Напряжение питания микросхемы может находиться в пределах 2.3…5.5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

Комбинации уровней напряжения Активная линия питания
Vcc < Vpf, Vcc < Vbat Vbat
Vcc < Vpf, Vcc > Vbat Vcc
Vcc > Vpf, Vcc < Vbat Vcc
Vcc > Vpf, Vcc > Vbat Vcc

Точность хода часов поддерживается за счет отслеживания температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 64 секунды.

В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 — 01 — 00/00/00 (день/месяц/год/ — день недели — час/минуты/секунды).

Ток потребления при питании от батареи напряжением 3.63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5.5В, и высокой скорости передачи данных I2C.

DS3231 RTC chip

At the heart of the module is a low-cost, extremely accurate RTC chip from Maxim – DS3231. It manages all timekeeping functions and features a simple two-wire I2C interface which can be easily interfaced with any microcontroller of your choice.

The chip maintains seconds, minutes, hours, day, date, month, and year information. The date at the end of the month is automatically adjusted for months with fewer than 31 days, including corrections for leap year (valid up to 2100).

The clock operates in either the 24-hour or 12-hour format with an AM/PM indicator. It also provides two programmable time-of-day alarms.

The other cool feature of this board comes with SQW pin, which outputs a nice square wave at either 1Hz, 4kHz, 8kHz or 32kHz and can be handled programmatically. This can further be used as an interrupt due to alarm condition in many time-based applications.

Other functions

temperature(void)

Description

Returns the RTC temperature.

Parameters

None.

RTC temperature as degrees Celsius times four. (int)

int t = RTC.temperature();
float celsius = t / 4.0;
float fahrenheit = celsius * 9.0 / 5.0 + 32.0;

squareWave(SQWAVE_FREQS_t freq)

Description

Enables or disables the square wave output.

Parameters

freq: a value from the SQWAVE_FREQS_t enumeration above. (SQWAVE_FREQS_t)

None.

RTC.squareWave(SQWAVE_1_HZ);	//1 Hz square wave
RTC.squareWave(SQWAVE_NONE);	//no square wave
Description

Returns the value of the oscillator stop flag (OSF) bit in the control/status register which indicates that the oscillator is or was stopped, and that the timekeeping data may be invalid. Optionally clears the OSF bit depending on the argument passed. If the argument is omitted, the OSF bit is cleared by default. Calls to and also clear the OSF bit.

Parameters

clearOSF: an optional true or false value to indicate whether the OSF bit should be cleared (reset). If not supplied, a default value of true is used, resetting the OSF bit. (bool)

Использование модуля 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, чтобы мы могли клонировать библиотеку в 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)

Микросхема часов реального времени DS3231.

Микросхема DS3231 выполнена в виде полностью законченного устройства, содержащего все необходимые элементы. На кристалле размещены непосредственно часы реального времени, генератор тактовой частоты и схема температурной компенсации. Такое решение позволило отказаться от дополнительных внешних радиодеталей, за исключением необходимых для реализации интерфейса I2C.

Генератор частоты в разных модификациях микросхем отличается по принципу работы. В корпусе DS3231 упакован классический кварцевый резонатор. Модификация DS3231M использует более продвинутую технологию MEMS-резонатора. Размещение генератора в корпусе прибора упростило конструирование пользовательских устройств, а благодаря температурной компенсации обеспечивается высокая точность хода. Модуль термокомпенсатора включает в себя термодатчик и управляемый температурой делитель частоты. Нестабильность хода часов DS3231 не превышает примерно 2 секунд за год в обычных условиях. При работе в области высоких или низких температур нестабильность оказывается в полтора раза выше. Для DS3231M нестабильность уменьшена примерно до 0.5 секунды за год. Также в схеме предусмотрена компенсация смещения частоты, вызываемого старением устройства.

Типовая схема включения DS3231

Часы DS3231 поддерживают работу с секундами, минутами, часами, днями, месяцами и годами. Максимальное значение года не может превышать 2100. Формат данных использует двоично-десятичное представление числа. Часы можно отображать в 12 или 24-часовом формате. В DS3231 реализовано две уставки сигнализации. Формат задания ограничен значением даты. Управление конкретным способом срабатывания ведется через значения старших битов регистра уставок.

Результаты измерения температуры доступны для пользователя. Точность термометра заявлена производителем на уровне 3 градусов. Результат измерений температуры представляется 10-битным числом с учетом знака. Период определения температуры составляет 64 секунды. Пользователь также может запросить преобразование в любой момент времени.

Расположение выводов DS3231 и DS3231M

DS3231 собрана в корпусе SO-16, размер которого больше других аналогичных устройств. Очевидно это дань реализованному резонатору. Для общения с внешними устройствами используется шина I2C, дополненная выводами 32KHzи Reset. Электрические параметры этих линий совпадают с требованиями стандарта I2CАдрес микросхемы на шине 11010000 в двичном формате.Более современный вариант DS3231MZ получил корпус SO-8. При этом его распиновка позволяет применять эту микросхемe вместо ее более крупных моделей.

В серии DS323xвыпускаются еще две микросхемы:DS3232 и DS3234. Первая оснащена встроенной памятью SRAM емкостью 236 байт. Среди других особенностей более сложная система управления микросхемой и ограничение нижней частоты работы интерфейса. В DS3234 емкость памяти увеличена до 256 байт, а интерфейс заменен на SPI.

Описание выводов DS3231 и DS3231MZ

Номер вывода

Обозначение

Описание

SO-16

SO-8

1

1

32kHz

Выход частоты 32768Гц. Открытый сток. Требует подключения через внешний резистор к шине питания. Может оставаться не подключенным.

2

2

Vcc

Вход напряжения питания. Открытый сток. Должен быть подключен к земле, если не используется.

3

3

INT/SQW

Выход прерывания/частоты. Открытый сток. Требует подключения через внешний резистор к шине питания. Может оставаться не подключенным. В режиме прерывания активное состояние – низкое.

4

4

RST

Вход сброса. Активное состояние – низкое.

5-12

NC

Не используются

13

5

GND

Земля

14

6

Vbat

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

15

7

SDA

Информационный вход шины I2C. Требует подключения через внешний резистор к шине питания.

16

8

SCL

тактовый вход шины I2C. Требует подключения через внешний резистор к шине питания.

Расположение выводов DS3231

Имя Функция
1 32kHz Выход частоты 32768 Гц. Это выход с открытым стоком, который требует наличия внешнего верхнего подтягивающего резистора (pullup). Выход работает от любого имеющегося источника питания. Если не используется, то может оставаться не подключенным.
2 VCC Основной источник питания. Этот вывод должен иметь подключенный развязывающий конденсатор емкостью 0.1..1.0 мкф. Если не используется, то подключается к земле (GND).
3 ~INT/SQW Сигнал прерывания с активным низким уровнем, или выход частоты прямоугольного сигнала. Это выход с открытым стоком, который требует наличия внешнего верхнего подтягивающего резистора (pullup), подключенного к напряжению питания 5.5V или меньше. Режим работы этой ножки определяется битом INTCN регистра управления (Control Register, адрес 0Eh), и выводимая частота зависит от битов RS2 и RS1. Если вывод ~INT/SQW не используется, то может оставаться не подключенным.
4 ~RST Сброс с активным уровнем лог. 0. Этот вывод имеет открытый сток, и работает как вход и как выход. Уровень показывает соответствие напряжения питания VCC допустимому пределу VPF. Как только VCC упадет ниже VPF, на выводе ~RST появится лог. 0. Когда VCC превысит VPF, то через интервал tRST на выводе ~RST с помощью pullup резистора появится уровень лог. 1. С активным уровнем лог. 0 выход с открытым стоком скомбинирован с функцией входа, подавляющей дребезг контактов кнопки. Этот вывод может быть активирован запросом сброса, выданным с помощью внешней кнопки. Вывод ~RST имеет внутренний pullup резистор номиналом 50 кОм, подключенный к VCC. Внешний подтягивающий резистор подключаться не должен. Если генератор запрещен, то интервал времени tREC пропускается, и уровень ~RST немедленно перейдет к лог. 1.
5..12 N.C. Нет соединения. Эти выводы должны быть подключены к земле (GND).
13 GND Земля, общий провод для напряжений питания и всех сигналов.
14 VBAT Вход для подключения резервного источника питания (обычно это литиевая батарейка на 3V). Если вывод VBAT используется как основной источник питания, то он должен иметь подключенный развязывающий конденсатор емкостью 0.1..1.0 мкф, имеющий малый ток утечки. Когда в VBAT используется как резервный источник питания, то этот конденсатор не нужен. Если VBAT не используется, то подключите его к земле (GND).
15 SDA Данные интерфейса I2C. Выход вывода имеет открытый сток, поэтому необходим внешний верхний подтягивающий резистор (pullup). Подтягивающее напряжение может иметь уровень до 5.5V, независимо от уровня напряжения питания VCC.
16 SCL Такты интерфейса I2C. Напряжение на входе SCL может иметь уровень до 5.5V, независимо от уровня напряжения питания VCC.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector