Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

Содержание

Tiny RTC i2c Часы Реального Времени – HEXMIX – DIY электроника

Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

Tiny RTC i2c Часы Реального Времени DS1307 модуль дляArduino

Небольшой модуль, выполняющий функции часов реального времени. Выполнен на базе микросхемы DS1307ZN+. Непрерывный отсчет времени происходит благодаря автономному питанию от батареи, установленной в модуль.

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

На плате имеется место для монтажа цифрового датчика температуры DS18B20. В комплект поставки он не входит.

Основные технические характеристики:

• Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом високосного года вплоть до 2100 г.

• 56 байт энергонезависимого ОЗУ для хранения данных

• 2-х проводной последовательный интерфейс

• Программируемый генератор прямоугольных импульсов. Может выдавать 1 ГЦ, 4.096 кГЦ, 8,192 кГЦ и 32,768 кГц.

• Автоматическое определение отключения основного источника питания и подключение резервного

• 24-х часовой и 12-ти часовой режим

• Потребление не более 500 нA при питании от резервной батареи питания при температуре 25C° (батарея CR2032 в комплект не входит)

  • Напряжение питания 5 В
  • Размеры 27 х 28 х 8,4 мм

Документация на микросхему (datasheet)

Электрическая схема

Устройство обменивается данными с электроникой прибора с помощью сигналов SCL и SDA. Микросхема IC2 – часы реального времени. Конденсаторы С1 и С2 снижают уровень помех в линии питания VCC. Резисторы R2 и R3 обеспечивают надлежащий уровень сигналов SCL и SDA.

С вывода 7 микросхемы IC2 поступает сигнал SQ, состоящий из прямоугольных импульсов частотой 1 Гц. Он используется для проверки работоспособности МС IC2. Компоненты R4, R5, R6, VD1 обеспечивают подзарядку батареи BAT1. Для хранения данных модуль часов реального времени DS1307 содержит микросхему IC1 – долговременная память.

US1 – датчик температуры. Сигналы модуля и линии питания выведены на соединители JP1 и P1.

Информационная шина

I2C это стандартный последовательный интерфейс посредством двух сигнальных линий SCL, SDA и общего провода. Линии интерфейса образуют шину. К линиям интерфейса I2C можно подключить несколько микросхем, не только микросхемы модуля.

Для идентификации микросхемы на шине, а именно записи данных в требуюмую МС и определения от какой МС поступают данные.  Каждая микросхема имеет уникальный адрес для проложенной шины. DS1307 имеет Адрес 0x68. Он записан на заводе-изготовителе. Микросхема памяти имеет адрес 0x50.

В программное обеспечение Arduino входит программная библиотека, обеспечивающая поддержку I2C.

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

DS1307 обладает низким энергопотреблением, обменивается данными с другими устройствами через интерфейс I2C, содержит память 56 байт. Содержит часы и календарь до 2100 г. Микросхема часов реального времени обеспечивает другие устройства информацией о настоящем моменте: секунды, минуты, часы, день недели, дата.

Количество дней в каждом месяце учитывается автоматически. Есть функция компенсации для високосного года. Имеется флаг, чтобы определить, работают часы в 24-часовом режиме или 12-часовом режиме.

Для работы в режиме 12 часов микросхема имеет бит, откуда считываются данные для передачи о периоде времени: до или после обеда.

Микросхема долговременной памяти

ATHYC232 24C32N относится к классу памяти EEPROM серии AT24Cxx. Для этой МС часто применяется наименование AT24C32 или 24C32. Объем хранимых данных 32 Кбайт.

Производится компанией Microchip, известной своими микроконтроллерами PIC или не менее известной компанией Atmel. Передача и прием данных происходит по шине I2C.

Данные хранятся при отключенном питании на протяжении десятков лет. Количество циклов записи-стирания достигает сотен тысяч.

Батарея

В держатель на обратной стороне платы устанавливается литиевая дисковая батарея CR2032. Она выпускается множеством производителей, например изготовленная фирмой GP обеспечивает напряжение 3,6 В и ток разряда 210 мАч. Батарея подзаряжается во время включения питания, с таким режимом работы литиевой батареи мы сталкиваемся на материнской плате компьютера.

Подзарядка батареи

Восстановление заряда батареи происходит током сквозь компоненты: резистор R5 и диод D1. Резисторы R4 и R6 тоже участвуют в подзарядке. Кроме своей основной функции цепи вносят небольшие отрицательные свойства.

Дело в том, что при работе батареи в режиме питания модуля через R4 и R6 происходит паразитный разряд батареи. Если модуль будет работать в такой системе, где подзарядка отсутствует, то R4, R5, R6 и VD1 следует удалить.

Вместо R6 установить перемычку, как изображено на фото.

Программное обеспечение

Для работы модуля в составе Arduino вполне подойдет устаревшая библиотека с сайта Adafruit под названием RTCLib. Скетч называется DS1307.pde. Существует обновленная версия. Следует скачать архив, распаковать его, переименовать и скопировать библиотеку в свой каталог библиотек Arduino.

Подключение к Arduino Mega

Подключение к Arduino Uno

Необходимые библиотеки для Tiny RTC i2c Часы Реального Времени DS1307:

для работы с DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
для работы со временем: http://www.pjrc.com/teensy/td_libs_Time.html

При использовании скетча можно синхронизировать часы реального времени с часами персонального компьютера.

Источник: https://hexmix.ru/shop/aktivnyie-komponentyi/datchiki/tiny-rtc-i2c-chasyi-realnogo-vremeni-modul-dlya-avr-arm-pic

Подключение часов реального времени DS1302 к Arduino и дисплея 1602 i2C – часы на ардуино !

Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

  • Отличительные особенности:
  • Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 2100 г.
  • Дополнительное ОЗУ 31 x 8 для хранения данных
  • Последовательный ввод – вывод информации для сокращения выводов микросхемы
  • Выполнение всех функций при напряжении питания 2.0-5.5 В    – выполнение всех функций при напряжении 2.0-5.5 В на дополнительном выводе питания
  • Потребление не более 300 нA при 2.5 В питания
  • Чтение и запись информации по одному байту или потоком
  • Исполнение в 8-ми выводном корпусе DIP, а также по заказу в 8-ми выводном SOIC корпусе для поверхностного монтажа
  • Простой 3-проводной интерфейс
  • Совместимость с TTL-микросхемами (Vcc= 5V)
  • Возможность поставки в промышленном диапазоне температур: от -40°C до+85°C
  • Совместимость с DS1202
  • Отличия от DS1202:    возможность подключения встроенной цепи подзарядки к выводу Vcc1    два вывода питания для подключения основного и резервного источника питания    увеличено ОЗУ на 7 байт

Описание выводов:

X1, X2подключение кварцевого резонатора 32.768 кГц
GNDобщий
RSTсброс
I/Oввод – вывод данных
SCLKсинхронизация последовательной связи
VCC1, VCC2выводы питания

Структурная схема DS1302:

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

Общее описание:

Микросхема DS1302 содержит часы реального времени с календарем и 31 байт статического ОЗУ. Она общается с микропроцессором через простой последовательный интерфейс. Информация о реальном времени и календаре представляется в секундах минутах, часах, дне, дате, месяце и годе.

Если текущий месяц содержит менее 31 дня, то микросхема автоматически определит количество дней в месяце с учетом высокосности текущего года. Часы работают или в 24-часовом или 12-часовом формате с индикатором AM/PM (до полудня/ после полудня).

Подключение DS1302 к микропроцессу упрощено за счет синхронной последовательной связи. Для этого требуется только 3 провода: (1) RST (сброс), (2) I/O (линия данных) и (3) SCLK (синхронизация последовательной связи). Данные могут передаваться по одному байту или последовательностью байтов до 31.

DS1302 разработан, чтобы потреблять малую мощность и сохранять данные и информацию часов при потреблении менее 1 мкВт. DS1302 – преемник DS1202.

В дополнение к основным функциям хранения времени DS1202, DS1302 имеет два вывода питания для подключения основного и резервного источника питания, возможность подключения программируемой цепи заряда к выводу VCC1 и семь дополнительных байтов ОЗУ.

Подключение:

Подключение DS1307 к Arduino:

RTC DS1307Arduino UNO
GNDGND
VCC+5V
SDAA4
SCLA5

Подключение DS1302 к Arduino:

RTC DS1302Arduino UNO
GNDGND
VCC+5V
RST6 (Можно изменить на другие в скетче)
CLK7 (Можно изменить на другие в скетче)
DAT8(Можно изменить на другие в скетче)

Подключение DS3231 к Arduino:

RTC DS3231Arduino UNO
GNDGND
VCC+5V
SDAA4
SCLA5

Модуль DS1302 часы реального времени на Алиэкспресс  http://ali.pub/1br52w

Код программы для модуля 1302 и дисплей 1602 I2C

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

Для DS1302

time.begin(RTC_DS1302,10,13,12);

#include

virtuabotixRTC myRTC(6, 7, 8); //CLK, DAT, RST

Программа

#include

#include

LiquidCrystal_I2C lcd(0x3F ,2,1,0,4,5,6,7,3, POSITIVE);

void setup() {

lcd.begin(16,2);

//myRTC.setDS1302Time(00,04, 12, 06, 18, 04, 2017);

}

void loop() {

myRTC.updateTime();

lcd.setCursor(0, 0);

lcd.print(“date: “);

lcd.print(myRTC.dayofmonth);

lcd.print(“/”);

lcd.print(myRTC.month);

lcd.print(“/”);

lcd.print(myRTC.year);

lcd.print(” “);

lcd.setCursor(0, 1);

lcd.print(“time: “);

lcd.print(myRTC.hours);

lcd.print(“:”);

lcd.print(myRTC.minutes);

lcd.print(“:”);

lcd.print(myRTC.seconds);

lcd.println(” “);

}

Так же не забываем о экономии при покупке товаров на Алиєкспресс с помощью кэшбэка 

Преимущества библиотеки:

– библиотека имеет внутренние функции аппаратной обработки протоколов передачи данных I2C и SPI, а следовательно не требует подключения дополнительных библиотек, но и не конфликтует с ними, если таковые всё же подключены.

– библиотека имеет внутренние функции программой обработки протокола передачи данных 3-Wire

– для инициализации модуля необходимо вызвать функцию begin с названием модуля.

– подключение модулей осуществляется к аппаратным выводам arduino используемой шины (за исключением 3-Wire)

– простота установки и чтения времени функциями settime и gettime

функция settime может устанавливать дату и время, как полностью, так и частично (например только минуты, или только день, и т.д.)

функция gettime работает как функция date в php, возвращая строку со временем, но если её вызвать без параметра, то функция ничего не вернёт, а время можно прочитать из переменных в виде чисел.

– библиотека расширяемая, то есть для того, чтоб она работала с новым модулем, нужно указать параметры этого модуля в уже существующих массивах файла RTC.h (тип шины, частота шины в кГц, режимы работы, адреса регистров и т.д.), как всё это сделать, описано в файле extension.txt

Таким образом добавив новый модуль в библиотеку, мы лишь увеличим область занимаемой динамической памяти на ~ 36 байт, при этом не затронув область памяти программ.

– при вызове функции begin, библиотека читает флаги регистров модуля и при необходимости устанавливает или сбрасывает их так, чтоб модуль мог работать от аккумуляторной батареи, а на программируемом выводе меандра (если таковой у модуля есть) установилась частота 1Гц, тогда этот вывод можно использовать в качестве внешнего посекундного прерывания.

– при работе с модулем DS1302 не нужны никакие резисторы на выводе GND (которые нужны для его работы с другими библиотеками этого модуля), это достигнуто тем, что для шины 3-Wire указана конкретная частота 10кГц, не зависимо от частоты CPU arduino.

– в библиотеке реализована еще одна не обязательная функция period, принимающая в качестве единственного аргумента – количество минут (от 1 до 255)

если в течении указанного времени была вызвана функция gettime несколько раз, то запрос к модулю по шине будет отправлено только в первый раз, а ответом на все остальные запросы будет сумма времени последнего ответа модуля и времени прошедшего с этого ответа.

Функцию period достаточно вызвать один раз.

Подробное описание:

}// ОПИСАНИЯ ПАРАМЕТРОВ ФУНКЦИЙ: // // Подключение библиотеки: // #include // iarduino_RTC time(название модуля [, вывод SS/RST [, вывод CLK [, вывод DAT]]]); // если модуль работает на шине I2C или SPI, то достаточно указать 1 параметр, например: iarduino_RTC time(RTC_DS3231); // если модуль работает на шине SPI, а аппаратный вывод SS занят, то номер назначенного вывода SS для модуля указывается вторым параметром, например: iarduino_RTC time(RTC_DS1305,22); // если модуль работает на трехпроводной шине, то указываются номера всех выводов, например: iarduino_RTC time(RTC_DS1302, 1, 2, 3); // RST, CLK, DAT // // Для работы с модулями, в библиотеке реализованы 5 функции: // инициировать модуль begin(); // указать время settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]); // получить время gettime(“строка с параметрами”); // мигать времем blinktime(0-не_мигать / 1-мигают_сек / 2-мигают_мин / 3-мигают_час / 4-мигают_дни / 5-мигают_мес / 6-мигает_год / 7-мигают_дни_недели / 8-мигает_полдень) // разгрузить шину period (минуты); // // Функция begin(): // функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д. // // Функция settime(секунды [, минуты [, часы [, день [, месяц [, год [, день недели]]]]]]): // записывает время в модуль // год указывается без учёта века, в формате 0-99 // часы указываются в 24-часовом формате, от 0 до 23 // день недели указывается в виде числа от 0-воскресенье до 6-суббота // если предыдущий параметр надо оставить без изменений, то можно указать отрицательное или заведомо большее значение // пример: settime(-1, 10); установит 10 минут, а секунды, часы и дату, оставит без изменений // пример: settime(0, 5, 13); установит 13 часов, 5 минут, 0 секунд, а дату оставит без изменений // пример: settime(-1, -1, -1, 1, 10, 15); установит дату 01.10.2015 , а время и день недели оставит без изменений // // Функция gettime(“строка с параметрами”): // функция получает и выводит строку заменяя описанные ниже символы на текущее время // пример: gettime(“d-m-Y, H:i:s, D”); ответит строкой “01-10-2015, 14:00:05, Thu” // пример: gettime(“s”); ответит строкой “05” // указанные символы идентичны символам для функции date() в PHP // s секунды от 00 до 59 (два знака) // i минуты от 00 до 59 (два знака) // h часы в 12-часовом формате от 01 до 12 (два знака) // H часы в 24-часовом формате от 00 до 23 (два знака) // d день месяца от 01 до 31 (два знака) // w день недели от 0 до 6 (один знак: 0-воскресенье, 6-суббота) // D день недели наименование от Mon до Sun (три знака: Mon Tue Wed Thu Fri Sat Sun) // m месяц от 01 до 12 (два знака) // M месяц наименование от Jan до Dec (три знака: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) // Y год от 2000 до 2099 (четыре знака) // y год от 00 до 99 (два знака) // a полдень am или pm (два знака, в нижнем регистре) // A полдень AM или PM (два знака, в верхнем регистре) // строка не должна превышать 50 символов // // если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных // seconds секунды 0-59 // minutes минуты 0-59 // hours часы 1-12 // Hours часы 0-23

Источник: http://www.electronica52.in.ua/proekty-arduino/podkluchenie-chasov-realnogo-vremeni-ds1302--k-arduino-i-displeya-1602-i2c---chasy-na-arduino--

Модуль RTC DS1307 подключение к Arduino

Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

04.07.2013 12:20:00

Модуль рассматриваемый в статье содержит в себе сразу две микросхемы: DS1307 (часы реального временис I2C- интерфейсом) и AT24C32 (микросхема памяти EEPROM на 32K bit).

В данной статье рассмотрим работу только микросхемы часов реального времени DS1307.

Компоненты для повторения (купить в Китае):

Arduino UNO, либо Arduino Nano, либо Arduino Mega

Модуль часов DS1307

Модуль часов DS3231

Соединительные провода (перемычки)

Основные технические характеристики:

• Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 2100 г.

• 56 байт энергонезависимого ОЗУ для хранения данных

• 2-х проводной последовательный интерфейс

• Программируемый генератор прямоугольных импульсов. Может выдавать 1 ГЦ, 4.096 кГЦ, 8,192 кГЦ и 32,768 кГц.

• Автоматическое определение отключения основного источника питания и подключение резервного

• 24-х часовой и 12-ти часовой режим

• Потребление не более 500 нA при питании от резервной батареи питания при температуре 25C°

Микросхема выпускается в восьмипиновых DIP и SOIC корпусах. Распиновка для всех одинакова. Далее приведу строки из даташита для полноты картины.

Документация на микросхему (datasheet)

Назначение выводов:

X1, X2 –  Служат для подключения 32.768 кГц кварцевого резонатора

Vbat – Вход для любой стандартной трёхвольтовой литиевой батареи или другого источника энергии. Для нормальной работы DS1307 необходимо, чтобы напряжение батареи было в диапазоне 2.0 … 3.5 В. Литиевая батарея с ёмкостью 48 мА/ч или более при отсутствии питания будет поддерживать DS1307 в
течение более 10 лет при температуре 25°C.

GND – общий минус

Vcc – Это вход +5 В. Когда питающее напряжение выше 1.25 * VBAT, устройство полностью,доступно, и можно выполнять чтение и запись данных.

Когда к устройству подключена батарея на 3 В, и Vcc ниже, чем 1.25 * VBAT, чтение и запись запрещены, однако функция отсчёта времени продолжает работать.

Как только Vcc падает ниже VBAT, ОЗУ и RTC переключаются на батарейное питание VBAT.

SQW/OUT – Выходной сигнал с прямоугольными импульсами.

SCL – (Serial Clock Input – вход последовательных синхроимпульсов) – используется для синхронизации данных по последовательному интерфейсу.

SDA – (Serial Data Input/Output – вход/выход последовательных данных) – вывод входа/выхода для двухпроводного последовательного интерфейса. 

Работа с выводом SQW/OUT

Для начала рассмотрим структуру регистров DS1307.

Структура регистров микросхемы DS1307

Нас интересует “Управляющий регистр” находящийся по адресу 0x7, т.к. он определяет работу вывода SQW/OUT.

Если бит SQWE = 1. то начинается формирование прямоугольных импульсов, если SQWE = 0, то на выходе вывода будет значение бита OUT.

За частоту импульсов отвечают биты RS0 и RS1, а именно:

     RS0           RS1           Частота     
     0     0     1 Гц
     0     1     4.096 кГц
     1     0     8.192 кГц
     1     1     32.768 кГц

Приведем пример:

Если нам нужно начать формирование прямоугольных импульсов с частотой 1  Гц, то необходимо в 0x7 регистр микросхемы, которая имеет адрес 0x68 отправить байт 00010000 или 0x10 в шестнадцатиричной системе счисления.

При помощи библиотеки Wire.h, это можно сделать следующим образом:

Wire.beginTransmission(0x68);Wire.write(0x7);Wire.write(0x10);Wire.endTransmission();

Подключение к Arduino:

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся.

 RTC модуль На базе ATmega 328 Leonardo MEGA, ADK, DUE
 SCL A5 D3 D21
SDA A4 D2 D20
 VCC +5V +5V +5V
 GND GND GND GND

Необходимые библиотеки:

для работы с DS1307: http://www.pjrc.com/teensy/td_libs_DS1307RTC.html
для работы со временем: http://www.pjrc.com/teensy/td_libs_Time.html

• Вручную в коде

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

#include #include  void setup() {  Serial.begin(9600);  while (!Serial) ; // Только для платы Leonardo  setSyncProvider(RTC.get); // получаем время с RTC  if (timeStatus() != timeSet)    Serial.println(“Unable to sync with the RTC”); //синхронизация не удаласть  else    Serial.println(“RTC has set the system time”);  //установим вручную 16.02.2016 12:53  TimeElements te;  te.Second = 0; //секунды  te.Minute = 53; //минуты  te.Hour = 12; //часы  te.Day = 16; //день  te.Month = 2; // месяц  te.Year = 2016 – 1970; //год в библиотеке отсчитывается с 1970  time_t timeVal = makeTime(te);  RTC.set(timeVal);  setTime(timeVal);} void loop(){  digitalClockDisplay(); //вывод времени  delay(1000);} void digitalClockDisplay() {  Serial.print(hour());  printDigits(minute());  printDigits(second());  Serial.print(” “);  Serial.print(day());  Serial.print(” “);  Serial.print(month());  Serial.print(” “);  Serial.print(year());  Serial.println();} void printDigits(int digits) {  //выводим время через “:”  Serial.print(“:”);  if (digits < 10)    Serial.print('0');  Serial.print(digits);}

• Установкой из  “Монитора порта”

Более точный вариант установки времени. Время задается через “монитор порта” по ходу работы контроллера.

Открываем монитор, вводим данные в нужном формате, смотрим на эталонные часы, подлавливаем момент и шелкаем “отправить”.

//формат указания текущего времени “ДД.ММ.ГГ чч:мм:сс”//где ДД – день, ММ – месяц, ГГ – год, чч – часы, мм – минуты, сс – секунлы//ГГ – от 00 до 99 для 2000-2099 годов #include #include  bool isTimeSet = false; //флаг, указывающий на то, была ли уже задана дата void setup() {  Serial.begin(9600);  while (!Serial) ; // Только для платы Leonardo  setSyncProvider(RTC.get); // получаем время с RTC  if (timeStatus() != timeSet)    Serial.println(“Unable to sync with the RTC”); //синхронизация не удаласть  else    Serial.println(“RTC has set the system time”);} void loop(){  if (Serial.available()) { //поступила команда с временем      setTimeFromFormatString(Serial.readStringUntil(''));      isTimeSet = true; //дата была задана  }  if (isTimeSet) //если была задана дата  {    digitalClockDisplay(); //вывод времени  }  delay(1000);} void digitalClockDisplay() {  Serial.print(hour());  printDigits(minute());  printDigits(second());  Serial.print(” “);  Serial.print(day());  Serial.print(” “);  Serial.print(month());  Serial.print(” “);  Serial.print(year());  Serial.println();} void printDigits(int digits) {  //выводим время через “:”  Serial.print(“:”);  if (digits < 10)    Serial.print('0');  Serial.print(digits);} void setTimeFromFormatString(String time){  //ДД.ММ.ГГ чч:мм:сс  int day = time.substring(0, 2).toInt();  int month = time.substring(3, 5).toInt();  int year = time.substring(6, 8).toInt();  int hours = time.substring(9, 11).toInt();  int minutes = time.substring(12, 14).toInt();  int seconds = time.substring(15, 17).toInt();  TimeElements te;  te.Second = seconds;  te.Minute = minutes;  te.Hour = hours;  te.Day = day;  te.Month = month;  te.Year = year + 30; //год в библиотеке отсчитывается с 1970. Мы хотим с 2000  time_t timeVal = makeTime(te);  RTC.set(timeVal);  setTime(timeVal);}

Статьи в похожей тематике:

• Модуль часов реального времени на микросхеме DS1307 своими руками

Купить в России  Модуль RTC (DS1307) + EEPROM (AT24C32)

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

Источник: http://zelectro.cc/RTC_DS1307_arduino

Часы реального времени DS1307 и Arduino

Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

В статье вы познакомитесь с отличным модулем часов реального времени на батарейке.

С помощью этого модуля можно отслеживать время в ваших проектах на Arduino даже в случае перепрограммирования или отключения питания.

Это один из необходимых элементов для проектов будильников, сигнализаций, снятия показаний с датчиков в режиме реального времени. Одна из самых популярных моделей модуля часов реального времени – DS1307.

Именно на нем мы и остановимся. Модуль отлично сочетается с микроконтроллерами Arduino, на которых питание логики равно 5 В.

Особенности модуля от компании-производителя Adafruit (китайцы предлагают аналогичные варианты раза в три-четыре дешевле):

  • Все включено: чип, обвязка, батарейка;
  • Легко собирается и прост в использовании;
  • Устанавливается на любую макетную плату или подключается напрямую с помощью проводов;
  • Есть отличные библиотеки и скетчи-примеры;
  • Два отверстия для монтажа;
  • Продолжительность работы – около пяти лет!

Модуль часов реального времени может быть уже распаянным, а может продаваться в виде отдельных комплектующих, пайка которых займет около 15-ти минут, не более.

Что такое часы реального времени?

Часы реально времени – это… часы. Модуль работает от автономного питания – батарейки и продолжает вести отсчет времени, даже если на вашем проекте на Arduino пропало питание. Используя модуль реального времени, вы можете отслеживать время, даже если вы захотите внести изменения в ваш скетч и перепрограммировать микроконтроллер.

На большинстве микроконтроллеров, в том числе и Arduino, есть встроенный счетчик временни, который называется millis(). Есть и встроенные в чип таймеры, которые могут отслеживать более длительные промежутки времени (минуты или дни).

Так зачем же вам отдельным модуль часов? Основная проблема в том, что millis() отслеживает время только с момента подачи питания на Arduino. То есть, как только вы отключили плату, таймер сбрасывается в 0. Вша Arduino не знает, что сейчас, например, четверг или 8-е марта.

Все, чего вы можете добиться от встроенного счетчика – это “Прошло 14000 миллисекунд с момента последнего включения”.

Например вы создали программу и хотите вести отсчет времени с этого момента. Если вы отключите питание микроконтроллера, счетчик времени собьется. Примерно так, как это происходит с дешевыми китайскими часами: когда садится батарейка, они начинают мигать с показанием 12:00.

В некоторых проектах Arduino вам понадобится надежный контроль времени без прерываний. Именно в таких случаях используется внешний модуль часов реального времени.

Чип, который используется в подобных часах, отслеживает года и даже знает сколько дней в месяце (единственно, что обычно не учитывается – это переход на летнее и зимнее время, так как подобные переводы разные в разных частях мира).

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

Мы рассмотрим пример использования часов реального времени DS1307. Это дешевый, легкий в использовании модуль, который работает несколько лет от небольшой батарейки.

Пока батарейка в самом модуле не исчерпает свой заряд, DS1307 будет вести отсчет времени, даже если Arduino отключен от питания или перепрограммируется.

Сборка модуля часов реального времени

Сборка часов реального времени DS1307 компании Adafruit

Фото Пояснения
Подготовьтесь к сборке. Проверьте наличие всех необходимых деталей и инструментов. Установите монтажную плату в тисках.
Нанесите немного припоя на отрицательный контакт батареи.
Установите два резистора 2.2 КОм и керамический конденсатор. Как именно вы их расположите – неважно. Полярность не имеет значения. После этого установите кристалл (также симметрично), держатель (холдер) для батарейки и чип часов реального времени. Чип модуля реального времени надо установить таким образом, чтобы отметка (паз) на чипе располагалась в соответствии с обозначением на монтажной плате. Внимательно посмотрите на фото слева, там чип установлен верно.
Чтобы холдер для батарейки не выпадал, лучше его припаять сверху. После этого переверните плату и и припаяйте оставшиеся контакты.
Удалите остатки контактов от резисторов, кристалла и конденсатора.
Если вы хотите использовать контакты для установки модуля на беспаечную монтажную плату, установите рельсу контактов на макетку, модуль часов реального времени сверху и припаяйте контакты.
Установите батарейку. Плоская часть батареи должна быть сверху. В среднем батарейка будет служить около 5 лет. Даже если батарейка села, не оставляйте слот для нее пустым.

Библиотека Arduino для работы с DS1307

DS1307 легко подключается к любому микроконтроллеру с питанием логики 5 В и возможностью I2C подключения. Мы рассмотрим подключение и использование этого модуля с Arduino.

Будем использовать библиотеку RTClib для получения и настройки показаний с DS1307. Если у вас есть вопросы по учтановке дополнительных библиотек Arduino – ознакомьтесь с этой инструкцией.

Подключение DS1307 к Arduino

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

Ссылки для заказа оборудования, которое использовалось в проекте из Китая

На часах реального премени 5 пинов: 5V, GND, SCL, SDA и SQW.

  • 5V используется для питания чипа модуля часов реального времени, когда вы делаете к нему запрос для получения данных о времени. Если сигнал 5 В не поступает, чип переходит в “спящий” режим.
  • GND – общая земля. Обязательно подключается в схему.
  • SCL – контакт i2c часов – необходим для обмена данными с часами реального времени.
  • SDA – контакт, по которому через i2c передаются данные с часов реального времени.
  • SQW дает возможность настроить вывод данных в виде square-wave. В большинстве случаев этот контакт не используется.

Если вы настроили аналоговый пин 3 (цифровой 17) в режим OUTPUT и HIGH, а аналоговый пин 2 (цифровой 16) в режим OUTPUT и LOW, вы можете запитывать часы реального времени непосредственно от этих контактов!

Подключите аналоговый пин 4 на Arduino к SDA. Аналоговый пин 5 на Arduino подключите к SCL.

Проверка часов реального времени

Первый скетч, который стоит запустить – это программа, которая будет считывать данные с модуля часов реального времени раз в секунду.

Для начала давайте посмотрим, что произойдет, если мы извлечем батарейку и заменим ее на другую, пока Arduino не подключен к USB. Подождите 3 секунды и извлеките батарейку. В результате чип на часах реального времени перезагрузится. После этого вставьте код, который приведен ниже (код также можно выгрузить в меню Examples→RTClib→ds1307 в Arduino IDE) и загрузите его на Arduino.

Вам также понадобится библиотека OneWire.h, скачть ее можно здесь

.

// функции даты и времени с использованием часов реального времени DS1307, подключенные по I2C. В скетче используется библиотека Wire lib

#include

#include “RTClib.h”

RTC_DS1307 RTC;

void setup () {

Serial.begin(57600);

Wire.begin();

RTC.begin();

if (! RTC.isrunning()) {

Serial.println(“RTC is NOT running!”);

// строка ниже используется для настройки даты и времени часов

// RTC.adjust(DateTime(__DATE__, __TIME__));

}

}

void loop () {

DateTime now = RTC.now();

Serial.print(now.year(), DEC);

Serial.print('/');

Serial.print(now.month(), DEC);

Serial.print('/');

Serial.print(now.day(), DEC);

Serial.print(' ');

Serial.print(now.hour(), DEC);

Serial.print(':');

Serial.print(now.minute(), DEC);

Serial.print(':');

Serial.print(now.second(), DEC);

Serial.println();

Serial.print(” since 1970 = “);

Serial.print(now.unixtime());

Serial.print(“s = “);

Serial.print(now.unixtime() / 86400L);

Serial.println(“d”);

// рассчитываем дату: 7 дней и 30 секунд

DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(” now + 7d + 30s: “);

Serial.print(future.year(), DEC);

Serial.print('/');

Serial.print(future.month(), DEC);

Serial.print('/');

Serial.print(future.day(), DEC);

Serial.print(' ');

Serial.print(future.hour(), DEC);

Serial.print(':');

Serial.print(future.minute(), DEC);

Serial.print(':');

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

delay(3000);

}

Теперь откройте окно серийного монитора и убедитесь, что скорость передачи данных установлена корректно: на 57600 bps.

В результате вы должны увидеть в окне серийного монитора примерно следующее:

Если в часах реального времени пропадет питание, отобразится 0:0:0. Секунды отсчитываться перестанут. После настройки времени, пойдет новый отсчет. Именно по этой причине извлекать батарейку во время работы модуля часов реального времени нельзя.

Настройка времени на модуле часов

В этом же скетче раскомментируйте строку, которая начинается с RTC.adjust:

// строка ниже используется для настройки даты и времени часов

RTC.adjust(DateTime(__DATE__, __TIME__));

Процесс настройки даты и времени реализован очень элегантно. В эту строку попадают данные с вашего счетчика на персональном компьютере (в момент компилляции кода). Эти данные используются для прошивки вашего модуля часов реального времени. То есть, если время на вашем ПК настроено неверно, рекомендуем сначала исправить этот баг, а потом переходить к прошивке модуля часов для Arduino.

После настройки, откройте серийный монитор и убедитесь, что часы настроены корректно:

Все. С этого момента и на протяжении ближайших нескольких лет настраивать DS1307 не придется.

Считывание показаний времени с DS1307

После настройки часов реального времени DS1307, может отправлять к ним запросы. Давайте рассмотрим часть скетча, в которой реализованы эти запросы.

void loop () {

DateTime now = RTC.now();

Serial.print(now.year(), DEC);

Serial.print('/');

Serial.print(now.month(), DEC);

Serial.print('/');

Serial.print(now.day(), DEC);

Serial.print(' ');

Serial.print(now.hour(), DEC);

Serial.print(':');

Serial.print(now.minute(), DEC);

Serial.print(':');

Serial.print(now.second(), DEC);

Serial.println();

По сути существует один вариант для получения времени с использованием часов реального времени. Для этого используется функция now(), которая возвращает объект DateTime. В этом объекте содержаться данные про год, месяц, день, час, минуту и секунду.

https://www.youtube.com/watch?v=-LaPIpin0xw

Есть ряд библиотек для часов реального времени, в которых предусмотрены функции вроде RTC.year() и RTC.hour(). Эти функции вытягивают отдельно год и час.

Но их использование сопряжено с рядом проблем: если вы сделаете запрос на вывод минут в момент времени, например, 3:14:59, то есть, прямо перед тем как показания минут должны приравняться к “15” (3:15:00), полученные данные будут равны 3:14:00 – то есть, вы потеряете одну минуту.

В общем, использование отдельных функций для вызова часа или года обосновано только в том случае, когда точность контроля времени с разбросом в одну минуту/года для вашего проекта не критична (как правило, это в тех случаях, когда показания снимаются редко – раз в сутки, раз в неделю). В любом случае, если вы хотите избежать погрешностей в показаниях, используйте now(), а уже из полученных данных тяните необходимые вам показания (минуты, года и т.п.).

Есть еще один формат данных, которые мы можем подучить – количество секунд от полуночи, 1-го января 1970 года. Для этого используется функция unixtime ():

Serial.print(” since 1970 = “);

Serial.print(now.unixtime());

Serial.print(“s = “);

Serial.print(now.unixtime() / 86400L);

Serial.println(“d”);

Так как в одном дне 60*60*24 = 86400 секунд, можно перевести полученное значение в дни и года. Очень удобный вариант, если вам надо отследить, сколько времени прошло с момента последнего запроса. Например, если прошло 5 минут с момента последнего последнего обращения Arduino к часам реального времени DS1307, значение, которое вернет функция unixtime() будет больше на 300.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Источник: http://arduino-diy.com/arduino-chasy-realnogo-vremeni-DS1307

Урок 18. Подключение RTC часы реального времени с кнопками

Tiny RTC I2C Modules – часы, точный генератор, микросхема памяти

В этом уроке мы научимся не только выводить, но и устанавливать время RTC модуля при помощи трёх кнопок.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.

Схема подключения:

Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.

RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 Arduino Uno
GNDGND
Vcc+5V
SDA (Serial DAta)A4
SCL (Serial CLock)A5

подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.

Код программы:

При подключении библиотеки «iarduino_RTC» нужно указать, с каким модулем ей работать, в данном случае это модуль Trema на базе чипа DS1307:

#include // подключаем библиотеку для работы с RTC модулемiarduino_RTC time(RTC_DS1307); // объявляем переменную time для работы с библиотекой, указывая название модуля RTC_DS1307void setup() { time.begin(); // инициируем RTC модуль}

Аналогичный алгоритм действий при подключении библиотеки «LiquidCrystal_I2C» для работы с LCD дисплеем LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный):

#include // подключаем библиотеку для работы с шиной I2C#include // подключаем библиотеку для работы с LCD дисплеемLiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную lcd для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)void setup() { lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея} Осталось подключить 3 кнопки: «SET», «UP» и «DOWN». Для этого им нужно назначить номера выводов и указать, что эти выводы работают как вход:
const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SETconst uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UPconst uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWNvoid setup() { pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как “вход” pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как “вход” pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как “вход”}

В библиотеке «iarduino_RTC», для работы с датой и временем реализованы две функции: settime() – установка и gettime() – получение времени.

https://www.youtube.com/watch?v=oTJzyrdiquM

Установка времени:

time.settime(0,1,2,3,4,5,6); // установить время: 00 сек, 01 мин, 02 часа, 03 день, 04 месяц, 05 год, 06 день недели – суббота// Если указать отрицательное значение, то соответствующий параметр останется без изменений.// Например: time.settime(10,20,-1,-1,-1,-1,-1); приведёт к изменению секунд и минут, а часы и дата останутся без изменений

Получение времени:

time.gettime(“d-m-Y, H:i:s, D”); // получить время в виде строки. Получим: “03-04-2005, 02:01:00, Sat”// Функция получает строку с символами, заменяет символы на дату и время, и возвращает строку// Какие символы на что заменяются можно посмотреть в файле iarduino_RTC.h

В библиотеке «iarduino_RTC» доступны 9 числовых переменных: seconds, minutes, hours, Hours, midday, day, weekday, month и year, значения которых обновляются после каждого вызова функции gettime(). Эти переменные мы будим использовать для изменения даты и времени.

int i = time.month; // если в часах установлен месяц май, то i будет равно 5 (пятый месяц)

Еще одна функция библиотеки «iarduino_RTC», которая нам понадобится, это blinktime(), она заставляет функцию gettime(), мигать одним из параметров времени (0 – не мигать, 1 – мигать секундами, 2 – мигать минутами, 3 – мигать часами, 4 – мигать днями и т.д.).

time.blinktime(4); // функция gettime() будет выводить строки с “мигающими” днями

И последнее, о чем надо позаботиться перед созданием кода программы – это алгоритм работы кнопок и определение переменных

Алгоритм работы кнопок следующий:

  • В режиме вывода даты или времени (обычный режим):
    • Кратковременное нажатие на кнопку SET переключает вывод даты и вывод времени
    • Удержание кнопки SET переводит часы в режим установки даты или времени (зависит от того, что было на дисплее, дата или время)
    • Кнопки UP и DOWN неактивны.

  • В режиме установки даты или времени:
    • Кратковременное нажатие на кнопку SET – переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.

      )

    • Удержание кнопки SET выводит часы из режима установки
    • Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
    • Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени

Исходя из алгоритма, нам понадобятся две переменные, назовем их: VAR_mode_SHOW и VAR_mode_SET. Первая будет указывать режим вывода (1-выводим_время, 2-выводим_дату). Вторая, будет указывать режим установки времени (0-нет, 1-сек, 2-мин, 3-час, 4-день, 5-мес, 6-год, 7-д.н.).

Теперь всё готово для создания полного кода:

// Подключаем библиотеки:#include // подключаем библиотеку для работы с шиной I2C#include // подключаем библиотеку для работы с LCD дисплеем#include // подключаем библиотеку для работы с RTC модулемLiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля// Объявляем переменные и константы:const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SETconst uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UPconst uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_неделиvoid setup() { pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода кнопки, как “вход” pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода кнопки, как “вход” pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода кнопки, как “вход” delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея}void loop(){ if(millis()%1000==0){ // если прошла 1 секунда lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(“iArduino.ru”); // выводим текст “iArduino.ru” lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SHOW==1){ // если установлен режим вывода времени lcd.print(time.gettime(“H:i:s”)); // выводим время } if(VAR_mode_SHOW==2){ // если установлен режим вывода даты lcd.print(time.gettime(“d-m-Y D”)); // выводим дату } delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } Func_buttons_control(); // передаём управление кнопкам}// Функция управления кнопками:void Func_buttons_control(){ uint8_t i=0; time.blinktime(VAR_mode_SET); // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)//Если часы находятся в режиме установки даты/времени if(VAR_mode_SET){// Если нажата кнопка UP if(digitalRead(PIN_button_UP )){ while(digitalRead(PIN_button_UP)){delay(50);} // ждём пока мы не отпустим кнопку UP switch (VAR_mode_SET){ // инкремент (увеличение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break; } }// Если нажата кнопка DOWN if(digitalRead(PIN_button_DOWN)){ while(digitalRead(PIN_button_DOWN)){delay(50);} // ждём пока мы её не отпустим switch (VAR_mode_SET){ // декремент (уменьшение) устанавливаемого значения /* сек */ case 1: time.settime(0, -1, -1, -1, -1, -1, -1); break; /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break; /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1), -1, -1, -1, -1); break; /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1), -1, -1, -1); break; /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1), -1, -1); break; /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1), -1); break; /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break; } }// Если нажата кнопка SET if(digitalRead(PIN_button_SET)){ while(digitalRead(PIN_button_SET)){ // ждём пока мы её не отпустим delay(10); if(i7){VAR_mode_SET=4;} // возвращаемся к первому устанавливаемому параметру }else{ // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени VAR_mode_SET=0; // выходим из режима установки даты/времени } }//Если часы находятся в режиме вывода даты/времени }else{// Если нажата кнопка SET if(digitalRead(PIN_button_SET)){ while(digitalRead(PIN_button_SET)){delay(10); // ждём пока мы её не отпустим if(i

Источник: https://lesson.iarduino.ru/page/urok-17-podklyuchenie-rtc-chasy-realnogo-vremeni-s-knopkami/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.