Войти
Все секреты компьютера для новичка и профессионала
  • Современные галереи. Галерея King’s Gallery
  • Топ‑9 настольных игр для компаний Зачем нужны такие игры
  • Скачать протанки модпак расширенная версия для wot Нужные моды в бою
  • Промокоды папа джонс на сентябрь
  • Технопоинт мобильный. О компании. Есть у торговой сети и недостатки
  • Взлом Лига Ангелов (League of Angels) на Ресурсы для Android и iOS
  • Синхронизируем время на модуле DS3231 с компьютером. Схема подключения часов реального времени DS3231 и простейшая программа

    Синхронизируем время на модуле DS3231 с компьютером. Схема подключения часов реального времени DS3231 и простейшая программа

    «. Знакомимся с модулем часов реального времени DS3231. В статье видео-инструкция, листинги программ, назначение и способы подключения к Arduino модулей из семейства DS.

    Модуль часов реального времени DS3231

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

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

    Модуль DS3231 по сути представляет из себя обыкновенные часы. В платах Arduino уже есть встроенный датчик времени Millis , однако он работает только при поданном питании на плату. При отключении и дальнейшем включении Arduino отсчет времени Millis сбросится до нуля. А DS3231 имеет на борту батарейку, которая даже при отключенной плате Arduino продолжает «питать» модуль, позволяя ему измерять время.

    Модуль можно использовать в качестве часов или будильника, построенных на базе плат Arduino. Или же в качестве оповещения для различных систем, к примеру в «Умном доме».

    Технические характеристики DS3231:

    • модуль производит подсчет часов, минут, секунд, дат, месяцев, лет (високосные года учитываются до 2100 года);
    • для подключения к различным устройствам, часы подключаются по I2C интерфейсу.

    32К — Выход, предназначенный для подачи внешнего питания >12В.

    SQW — Программируемый выход Square-Wave сигнала.

    SCL – Через этот пин по интерфейсу I2C происходит обмен данными с часами.

    SDA – Через этот пин передаются данные с часов.

    VCC – Питание часов реального времени, нужно 5 вольт. Если на этот пин не поступает напряжение, часы переходят в спящий режим.

    GND — Земля.

    Схема подключения часов реального времени DS3231 и простейшая программа

    Пины SDA и SCL на разных платах Arduino:

    SDA SCL
    UNO A4 A5
    Mini A4 A5
    Nano A4 A5
    Mega2560 20 21
    Leonardo 2 3

    Подключим модуль часов реального времени к Arduino UNO. SDA — пин A4, SCL — пин A5.

    Для работы модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):

    #include

    void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    }
    void loop(){



    }
    }

    В данном скетче просто идет отсчет времени.

    В первую очередь в сктече подключение библиотеки iarduino_RTC.h.

    Там же укажите точное название своего модуля для корректной работы с ним.

    В итоге получаем вывод времени с модуля DS3231 в монитор порта. Идет вывод часов, минут, секунд.

    В следующем скетче добавим функцию settime , позволяющую установить начальное время отсчета.

    #include
    iarduino_RTC time(RTC_DS3231);
    void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
    time.settime(0,0,18,24,04,17,1); // 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник
    }
    void loop(){
    if(millis()%1000==0){ // если прошла 1 секунда
    Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
    delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    }
    }

    В примере время начинает отсчитываться с 0 сек, 0 мин, 18 час, 24, апреля, 2017 года, понедельник.

    Посты по урокам:

    1. Первый урок: .
    2. Второй урок: .
    3. Третий урок: .
    4. Четвертый урок: .
    5. Пятый урок: .
    6. Шестой урок: .
    7. Седьмой урок: .
    8. Восьмой урок: .
    9. Девятый урок:

    Описание

    Модуль часов реального времени с независимым питанием. Контроллеры Arduino/Genuino не имеют встроенных часов реального времени. Для работы со временем есть функция millis(). Однако, для проектов где требуется время и дата, возможностей данной функции недостаточно и на помощь приходят часы реального времени.

    Модуль DS3231 - это недорогие, точные, с работой по протоколу I2C часы реального времени, с температурной компенсацией TCXO. Устройство содержит разъём для батареи типа CR2032 и поддерживает точный отсчет времени когда питание устройства прерывается. Часы поддерживают информацию о секундах, минутах, часах, дне, месяце и годе. Дата на конец месяца автоматически корректируется, для месяцев, содержащих менее чем 31 день, включая коррекцию по високосному году. Работают в одном из режимов: 24- или 12-часовом формате (с AM/PM индикатором). Имеют два программируемых будильника.

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

      Часы реального времени с подсчетом секунд, минут, часов, дня, месяца и года (с корректировкой дат в т.ч. по високосному году до 2100 года)

      Погрешность хода: ±2 минуты в год

      Температурный датчик с погрешностью ±3°С

      Два будильника

    Технические характеристики

      Рабочая температура: -40°С - +85°С

      Напряжение питания: 2,3 - 5,5 В

      Напряжение питания батареи: 2,3 - 5,5 В

      Максимальное потребление тока: 650 нА

    Физические размеры

      Модуль (Д х Ш х В): 45 х 23 х 15 мм

    Плюсы использования

      Высокая точность хода часов

      Имеется два будильника с функцией прерывания

      Широкий диапазон рабочей температуры

    Минусы использования

      Дороже некоторых аналогов

    Библиотека для работы с модулем

    Примеры подключения и использования

    Пример 1: В примере иллюстрируется подключение модуля часов к контроллеру, установка времени и даты на часах, вывод времени, даты и дня недели в монитор Serial-порта, а также получение температуры с текущего модуля. (Примеры тестировались на контроллере Smart UNO)

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

    Скетч для загрузки:

    //Подключение библиотек #include #include "DS3231.h" DS3231 RTC; //Создание объекта DS3231 char weekDay [ 4 ] = { "Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" } ; //Создание массива дней недели //Создание переменной типа DateTime для задания даты в формате: //год, месяц, день, час, минута, секунда и день недели (от 0 - воскресенье до 6 - суббота) DateTime dt(2016 , 8 , 22 , 16 , 10 , 0 , 1 ) ; void setup () { Serial .begin (9600 ) ; //инициализация Serial-порта Wire.begin () ; //инициализация библиотеки Wire RTC.begin () ; //инициализация часов RTC.adjust (dt) ; //Задание даты-времени так как она задана в переменной dt } void loop () { DateTime now = RTC.now () ; //получение текущей даты и времени //вывод полученного года Serial .print (now.year () , DEC) ; Serial .print ("/" ) ; //вывод месяца Serial .print (now.month () , DEC) ; Serial .print ("/" ) ; //дня Serial .print (now.date () , 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 (weekDay[ now.dayOfWeek () ] ) ; Serial .println () ; delay (1000 ) ; //задержка на 1 сек RTC.convertTemperature () ; //конвертация текущей температуры в регистрах Serial .print (RTC.getTemperature () ) ; //чтение регистров и вывод полученной температуры Serial .println (" C" ) ; delay (1000 ) ; //задержка на 1 сек }

    Сегодня мы продолжим поиски идеальной микросхемы часов реального времени (RTC). Часы будем изготавливать на основе . Индикация будет использоваться более удобная для разработки - LCD дисплей, на котором будет отображаться вся информация сразу кроме настроек. В таком виде часы удобно использовать как настольный вариант.

    Итак, рассмотрим саму микросхему DS3231. DS3231 - это часы реального времени с экстремально точным ходом (подобрали же производители словечко) благодаря встроенному кварцевому резонатору с температурной компенсацией. Интерфейс передачи данных - I 2 C. В этой микросхеме есть также вход для напряжения резервной батареи, при отключении основного питания микросхема автоматически переключается на работу от резервной батареи, точность хода от резервной батареи не нарушается. Весьма радует, не правда ли? В DS3231 поддерживается подсчет секунд, минут, часов, дней месяца (даты), дней недели, месяцев и лет (с учетом високосного года для месяцев). Поддерживается работа в 12 и 24 часовом формате. Имеется 2 будильника с возможностью их настройки и отслеживания состояния. Подстройка точности температурной компенсации. А также два выхода - на 32 кГц (выход составляет 32.768 кГц) и программируемый выход от 1 Гц до 8.192 кГц. Имеется также вывод сброса - RST. микросхема часов реального времени выпускается в корпусе SO-16. Корпус достаточно крупный, но если учитывать что внутри уже имеется кварц, да еще и температурно компенсируемый, то мне кажется, с размерами тут все отлично. У DS3231 есть близнец в виде DS3232, у которого, правда, на 2 ножки больше. Все это очень напоминает продукцию компании NXP - микросхемы часов PCA2129 и PCF2129. Аналогично температурно компенсируемый встроенных кварцевый резонатор, оба такие же близнецы только с разным количеством n.c. выводов и схожими функциями относительно DS3231 помимо хронометрожа времени.

    RTC DS3231 имеются в продаже в виде модулей с необходимой обвязкой, а также до комплекта микросхемой EEPROM, которая чаще всего и даром не нужно, только веса добавляет:

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

    Что важно знать при работе с такой микросхемой часов реального времени, так это как же извлечь из нее данные или записать их туда. Часы имеют интерфейс I 2 C. Для того чтобы осуществить запись данных (а это нужно и для того чтобы прочитать данные) нужно передать условие старта (эти команды осуществляются по средствам аппаратного или программного I 2 C для микроконтроллера), далее передать адрес микросхемы с битом записи, далее передать адрес регистра к которому будем обращаться и далее передать в этот регистр байт данных, если следом передать еще байт данных, он запишется в следующий регистр и так далее. По окончании нужно передать условие остановки. Графическое изображение выше сказанного на рисунке:

    Запись данных необходима для первоначальной настройки, а также для настройки текущего времени. Далее нам нужно постоянно получать данные о текущем времени и даты. Для этого необходимо осуществлять чтение из регистров хранения этой информации. Чтение состоит из двух процедур - установить указатель на нужный регистр и прочитать его. Чтобы установить указатель на нужный регистр, нужно передать условие старта, потом передать адрес микросхемы с битом записи и байт с адресом регистра. Далее либо условие остановки и следом условие старта, либо просто рестарт. Теперь вторая процедура - непосредственно чтение из регистров. Старт передан, далее нужно отправить адрес микросхемы с битом чтения и далее считывать регистры в необходимом количестве, по окончании передать условие остановки. Если информация из регистра была прочитана, то указатель автоматически переходит на следующий за ним регистр без лишних действий со стороны микроконтроллера (мастер устройства). На рисунке проиллюстрировано все выше сказанное относительно чтения регистров по средствам I 2 C интерфейса:

    Адрес микросхемы:

    • для записи - 0b11010000
    • для чтения - 0b11010001

    Программно код на языке Си будет выглядеть следующим образом:

    // функции с часами ======================================================================================================= // инициализация начальных установок void RTC_init(void){ i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи i2c_send_byte(0x0E); // передача адреса памяти i2c_send_byte(0b00100000); // запустить преобразование температуры и выход на 1 Гц i2c_send_byte(0b00001000); // разрешить выход 32 кГц i2c_stop_cond(); // остановка i2c } // получение времени и даты void RTC_read_time(void){ i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи i2c_send_byte(0x00); // передача адреса памяти i2c_stop_cond(); // остановка i2c i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения sec = bcd(i2c_get_byte(0)); // чтение секунд, ACK min = bcd(i2c_get_byte(0)); // чтение минут, ACK hour = bcd(i2c_get_byte(0)); // чтение часов, ACK wday = bcd(i2c_get_byte(0)); // чтение день недели, ACK day = bcd(i2c_get_byte(0)); // чтение число, ACK month = bcd(i2c_get_byte(0)); // чтение месяц, ACK year = bcd(i2c_get_byte(1)); // чтение год, NACK i2c_stop_cond(); // остановка i2c } // установка времени void RTC_write_time(unsigned char hour1,unsigned char min1, unsigned char sec1){ i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи i2c_send_byte(0x00); // передача адреса памяти i2c_send_byte(bin(sec1)); // 0x00 секунды (целесообразно ли задавать еще и секунды?) i2c_send_byte(bin(min1)); // 0x01 минуты i2c_send_byte(bin(hour1)); // 0x02 часы i2c_stop_cond(); // остановка i2c } // установка даты void RTC_write_date(unsigned char wday, unsigned char day, unsigned char month, unsigned char year){ i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи i2c_send_byte(0x03); // передача адреса памяти i2c_send_byte(bin(wday)); // 0x03 день недели (воскресенье - 1, пн 2, вт 3, ср 4, чт 5, пт 6, сб 7) i2c_send_byte(bin(day)); // 0x04 день месяц i2c_send_byte(bin(month)); // 0x05 месяц i2c_send_byte(bin(year)); // 0x06 год i2c_stop_cond(); // остановка i2c } // чтение температуры void RTC_read_temper(void){ i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи i2c_send_byte(0x11); // передача адреса памяти i2c_stop_cond(); // остановка i2c i2c_start_cond(); // запуск i2c i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения t1 = i2c_get_byte(0); // чтение MSB температуры t2 = i2c_get_byte(1); // чтение LSB температуры i2c_stop_cond(); // остановка i2c t2=(t2/128); // сдвигаем на 6 - точность 0,25 (2 бита) // сдвигаем на 7 - точность 0,5 (1 бит) t2=t2*5; }

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

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

    Схема же всего устройства часов выглядит так:

    Микроконтроллер был выбран Atmega8 за свою широкую распространенность и небольшую цену. Данный микроконтроллер можно использовать как в корпусе DIP-28, так и в SMD исполнении в корпусе TQFP-32. Резистор R3 необходим для предотвращения самопроизвольного перезапуска микроконтроллера в случае появления случайных помех на выводе PC6. Резистор R3 подтягивает плюс питания к этому выводу, надежно создавая потенциал на нем. Для индикации используется жидко кристаллический (ЖК или LCD) дисплей. Мною использовался дисплей 2004А - 4 строки по 20 символов больше для красоты, поэтому можно применять дисплей более привычный - 2 строки по 16 символов. ЖК дисплей подключается к микроконтроллеру по четырех битной системе. Переменный резистор R2 необходим для регулировки контраста символов на дисплее. Вращением движка этого резистора добиваемся наиболее четких для нас показаний на экране. Подсветка ЖК дисплея организована через вывод "А" и "К" на плате дисплея. Подсветка включается через резистор, ограничивающий ток - R1. Чем больше номинал, тем более тускло будет подсвечиваться дисплей. Однако пренебрегать этим резистором не стоит во избежание порчи подсветки. Кнопки S1 - S4 управляют настройками часов. Светодиод сигнализирует о том, что будильник сработал. Светодиод можно заменить на какую-либо звуковую схему. Резисторы R5 - R8 являются подтягивающими (pull-up) и необходимы для формирования прямоугольных импульсов на выводах микросхемы часов. Также это необходимо для правильной работы протокола I2C. Для питания схемы используется микросхема линейного стабилизатора L7805, ее можно заменить на отечественный аналог пяти вольтового линейного стабилизатора КР142ЕН5А, либо применить другу микросхему стабилизатора напряжения в соответствии с подключением ее в схеме (например LM317 или импульсные стабилизаторы LM2576, LM2596, MC34063 и так далее). Далее 5 вольт стабилизируются другой микросхемой - AMS1117 в исполнении, дающей на выходе 3,3 вольта. Микросхема часов, в соответствии с даташитом, питается от напряжения 3,3 вольта. Однако максимальное напряжение составляет 5,5 вольта. Поэтому Данный стабилизатор можно использовать, а можно и нет, на ваше усмотрение. Стабилизатор напряжения AMS1117 можно также заменить на исполнение ADJ (AMS1117ADJ) - то есть регулируемый вариант, задать необходимое напряжение при таком выборе необходимо будет при помощи двух резисторов, подключаемых к микросхеме в соответствии с даташитом на нее.

    Схема была собрана и отлажена с применением отладочной макетной платы для микроконтроллера ATmega8:

    Назначение кнопок:

    • S1 - отключает сигнал будильника, либо выходит в главное меню из любого меню настроек
    • S2 - сброс микроконтроллера
    • S3 - изменяет время или дату в меню настроек
    • S4 - вход в меню настроек и перелистывание меню

    Вывод 32 кГц может использоваться для контроля частоты кварцевого резонатора. Подключаем к этому выводу частотомер или осциллограф и контролируем частоту:

    Как видно из скриншота осциллограммы, частота примерно соответствует 32,768 кГц (примерно в силу ограничения разрешения измерения частоты, а "на глаз" настолько точно трудно определить).

    В итоге получились часы со следующими характеристиками:

    • индикация времени
    • индикация даты
    • индикация дня недели
    • индикация активности будильника
    • 1 будильник с выходом сигнала от микроконтроллера
    • индикация температуры окружающей среды (программно реализована только положительная температура, отрицательная, думаю, нам ни к чему)
    • настройки будильника
    • настройки времени
    • настройки даты
    • LCD-дисплей с подсветкой
    • сохранение настроек и продолжение хода часов при отключении основного питания

    Подытожим . Микросхема часов реального времени DS3231 является отличным решением. Точность хода сравнительно c какой-нибудь DS1307 или выше, а вот PCA/PCF2129 еще могут потягаться с ней. Среди рассмотренных мною микросхем часов реального времени данный экземпляр на сегодняшний день занимает первое место по функционалу и точности.

    Для программирования микроконтроллера Atmega8 необходимо знать конфигурацию фьюз битов (скриншот сделан в программе ):

    К статье прилагается прошивка для микроконтроллера Atmega8, проект схемы в программе , а также видео работы часов (в самом начале сработает будильник - загорится светодиод).

    Список радиоэлементов

    Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
    IC1 МК AVR 8-бит

    ATmega8

    1 В блокнот
    IC2 Часы реального времени (RTC)

    DS3231

    1 В блокнот
    VR1 Линейный регулятор

    L7805AB

    1 В блокнот
    VR2 Линейный регулятор

    AMS1117-3.3

    1 В блокнот
    VD1 Выпрямительный диод

    1N4148

    1 В блокнот
    C1 470 мкФ 1 В блокнот
    C2, C3, C5, C7 Конденсатор 100 нФ 4 В блокнот
    C4 Электролитический конденсатор 220 мкФ 1 В блокнот
    C6, C8 Электролитический конденсатор 10 мкФ 2 В блокнот
    R1 Резистор

    22 Ом

    1 В блокнот
    R2 Подстроечный резистор 10 кОм 1 3296W-1-103LF

    Микросхема DS3231 представляет собой высокоточные часы реального времени RTC, которая обладает встроенным кварцевым генератором с температурной компенсацией, благодаря чему уход времени составляет всего ±2 минуты за год. Дополнительно реализована функция будильника, также имеется выход прерываний. Часы можно приобрести в виде готового модуля под Arduino с элементами обвязки и отсеком для батареи.

    Я заказывал модуль здесь . Схема представлена на картинке ниже:


    Микросхема использует широко распространенный . Поддерживается стандартная (100 кГц) и высокая (400 кГц) скорость передачи данных. Адрес микросхемы (7 бит) на шине I2C равен 1101000. Дополнительно на модуле установлена память I2C (24C32), на схеме не изображена.

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

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

    Точность хода часов поддерживается за счет отслеживания температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 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.

    Функция внешнего сброса

    Линия RST может использоваться для внешнего сброса, а также обладает функцией оповещения о низком уровне напряжения. Линия подтянута к высокому логическому уровню через внутренний резистор, внешняя подтяжка не требуется. Для использования функции внешнего сброса, между линией RST и общим проводом можно подключить кнопку, в микросхеме реализована защита от дребезга контактов. Функция оповещения активируется при снижении напряжения питания Vcc ниже порогового значения Vpf, при этом на линии RST устанавливается низкий логический уровень.

    Описание регистров DS3231

    Ниже в таблице представлен перечень регистров часов реального времени:

    Адрес D7 D6 D5 D4 D3 D2 D1 D0 Функция Пределы
    0x00 0 10 секунд Секунды Секунды 00-59
    0x01 0 10 минут Минуты Минуты 00-59
    0x02 0 12/24 AM/PM 10 часов Час Часы 1-12 + AM/PM или 00-23
    10 часов
    0x03 0 0 0 0 0 День День недели 1-7
    0x04 0 0 10 число Число Дата 01-31
    0x05 Century 0 0 10 месяц Месяц Месяцы/век 01-12 + Век
    0x06 10 лет Год Годы 00-99
    0x07 A1M1 10 секунд Секунды Секунды, 1-й будильник 00-59
    0x08 A1M2 10 минут Минуты Минуты, 1-й будильник 00-59
    0x09 A1M3 12/24 AM/PM 10 часов Час Часы, 1-й будильник 1-12 + AM/PM или 00-23
    10 часов
    0x0A A1M4 DY/DT 10 число День День недели, 1-й будильник 1-7
    Число Дата, 1-й будильник 01-31
    0x0B A2M2 10 минут Минуты Минуты, 2-й будильник 00-59
    0x0C A2M3 12/24 AM/PM 10 часов Час Часы, 2-й будильник 1-12 + AM/PM или 00-23
    10 часов
    0x0D A2M4 DY/DT 10 число День День недели, 2-й будильник 1-7
    Число Дата, 2-й будильник 01-31
    0x0E EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE Регистр настроек (Control)
    0x0F OSF 0 0 0 EN32kHz BSY A2F A1F Регистр статуса (Status)
    0x10 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр подстройки частоты (Aging Offset)
    0x11 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр температуры, старший байт
    0x12 DATA DATA 0 0 0 0 0 0 Регистр температуры, младший байт

    Информация о времени хранится в двоично-десятичном формате, то есть каждый разряд десятичного числа (от 0 до 9) представляется группой из 4-х бит. В случае одного байта, младший полубайт отсчитывает единицы, старший десятки и т. д. Счет времени осуществляется в регистрах с адресами 0x00-0x06, для отсчета часов можно выбрать режим 12-ти или 24-х часов. Установка 6-го бита регистра часов (адрес 0x02), задает 12-ти часовой режим, в котором 5-й бит указывает на время суток, значению 1 соответствует время после полудня (PM), значению 0 до полудня (AM). Нулевое значение 6-го бита соответствует 24-х часовому режиму, здесь 5-й бит участвует в счете часов (значения 20-23).

    Регистр дня недели инкрементируется в полночь, счет идет от 1 до 7, регистр месяцев (адрес 0x05) содержит бит века Century (7-й бит), который переключается при переполнении регистра счета лет (адрес 0x06), от 99 к 00.

    В микросхеме DS3231 реализовано два будильника, 1-й будильник настраивается с помощью регистров с адресами 0x07-0x0A, 2-й будильник регистрами 0x0B-0x0D. Битами A1Mx и A2Mx можно настроить различные режимы для будильников, установка бита исключает соответствующий регистр из операции сравнения. Ниже в таблицах приведены комбинации битов для разных режимов будильника:

    Комбинации битов не указанные в таблицах, приводят к некорректному функционированию будильников. Если бит DY/DT сброшен, то для будильника отслеживается совпадение даты (день месяца), при установке бита DY/DT, проверяется совпадение дня недели.

    Большинство функций настраиваются в регистре Control. Бит EOSC управляет запуском тактового генератора, сброс бита запускает генератор. Установка бита останавливает генератор, только для режима питания от батареи (Vbat). При питании от внешнего источника (Vcc), генератор всегда запущен независимо от состояния бита EOSC. После включения, значение бита по умолчанию равно 0.

    Установка бита BBSQW разрешает функционирование выхода INT/SQW (3-й вывод) в режиме питания от батареи, при отсутствии внешнего питания. При нулевом значении бита, выход INT/SQW переходит в 3-е состояние (деактивируется), если напряжение внешнего источника Vcc падает ниже порогового значения Vpf. После подачи питания, значение бита по умолчанию равно 0.

    Бит CONV отвечает за принудительное измерение температуры, установка бита запускает процесс преобразования, во время которого также выполняется корректировка частоты тактового генератора, результат измерения находится в регистрах с адресами 0x11, 0x12. Запуск возможен только в случае окончания предыдущего преобразования, перед запуском необходимо проверить флаг занятости BSY. Принудительное преобразование температуры не влияет на внутренний 64-х секундный цикл корректировки частоты. Установка бита CONV не влияет на флаг BSY в течение 2 мс. Биты CONV и BSY сбрасываются автоматически после завершения преобразования.

    Биты RS2, RS1 устанавливают частоту прямоугольных импульсов (меандр) на выходе INT/SQW. По умолчанию, при включении биты устанавливаются в 1. Ниже в таблице представлены возможные комбинации битов:

    Бит INTCN управляет выходом INT/SQW. Если бит сброшен, на выходе появляются прямоугольные импульсы (меандр), частота которых задается битами RS2, RS1. При установке бита INTCN, выход используется для генерации прерываний по сигналу будильника. По умолчанию, значение бита равно 1. Тип выхода INT/SQW – открытый сток, соответственно необходима подтяжка через резистор к высокому логическому уровню, активный уровень – низкий.

    Установка битов A1IE, A2IE разрешает прерывания по сигналу 1-го и 2-го будильника соответственно. Сброс битов, запрещает прерывания. По умолчанию значение равно 0.

    Регистр Status содержит флаги событий, и управляет выходом 32 kHz. Флаг OSF отражает состояние тактового генератора, значение 1, означает, что генератор остановлен, это событие может произойти в следующих случаях:

    • В первое время после подачи питания
    • Напряжение батареи или внешнего источника недостаточно для работы тактового генератора
    • Генератор выключен установкой бита EOSC в режиме питания от батареи
    • Внешние факторы, влияющие на кварцевый генератор (шум, утечка и т.д.)

    После установки значение бита не меняется, необходимо сбросить бит вручную.

    Установка бита EN32kHz разрешает генерирование прямоугольных импульсов (меандр) на выходе 32kHz (1-й вывод), частота импульсов фиксирована и равна 32,768 кГц. Сброс бита отключает данную функцию и переводит выход в 3-е состояние (с высоким входным сопротивлением). По умолчанию значение бита равно 1, после подачи питания на выходе появляются импульсы. Тип выхода 32kHz открытый сток, поэтому требуется подтяжка к высокому логическому уровню.

    Флаг занятости BSY устанавливается во время процесса преобразования температуры и корректировки частоты тактового генератора. Флаг сбрасывается после завершения преобразования.

    Флаги будильников A1F, A2F устанавливаются при совпадении значений регистров счета времени и регистров будильника. Если разрешены прерывания по сигналу будильников A1IE, A2IE, а также назначен выход прерывания (установлен бит INTCN), то на выходе INT/SQW появляется сигнал прерывания (переход от высокого к низкому логическому уровню). Флаги необходимо сбросить вручную, записав значение 0.

    Регистр Aging Offset предназначен для подстройки частоты тактового генератора. Значение регистра добавляется к частоте генератора во время выполнения внутренней процедуры корректировки, если зафиксировано изменение температуры, а также при запуске преобразования температуры битом CONV. Величина смещения знаковая, то есть положительные значения (1-127) уменьшают частоту, отрицательные (128-255) увеличивают. Для одинакового смещения, изменение частоты будет различным в зависимости от температуры. При температуре +25°C, изменение частоты составит 0,1 ppm/LSB.

    Текущее значение температуры хранится в регистрах с адресами 0x11 и 0x12, старший и младший байт соответственно, значение температуры в регистрах периодически обновляется. Установлено левое выравнивание, разрешение составляет 10 бит или 0,25°C/LSB, то есть в старшем байте находится целая часть температуры, а 6, 7-й биты в младшем регистры составляют дробную часть. В старшем байте 7-й бит указывает знак температуры, например, значению 00011011 01 соответствует температура +27,25 °C, значению 11111110 10 температура -2,5 °C.

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

    Подключение DS3231 к микроконтроллеру

    Я подключил часы к микроконтроллеру PIC16F628A, для отображения времени использовал . Схема подключения представлена ниже:


    После подачи питания на индикаторах высвечиваются знаки тире (– – – – – –), далее выполняется инициализация часов, значение времени появляется на индикаторах с задержкой в 1 секунду, которая требуется для запуска тактового генератора часов. На индикаторы выводится значение часов, минут и секунд, разделенных десятичной точкой, формат времени 24-х часовой. Кнопкой SB1 “Индикация” можно сменить формат отображения, где на индикаторы будет выводиться температура, а также значение часов и минут, разделенных десятичной точкой, которая мигает с частотой 2 Гц. Температура отображается без дробной части, в программе считывается только старший байт хранения температуры по адресу 0x11.

    Значение времени считывается из часов по прерыванию на линии SQW/INT, которая управляется сигналом 1-го будильника, в процессе инициализации часов будильник настраивается на ежесекундный сигнал. Светодиод HL1 служит в качестве индикатора и вспыхивает по сигналу прерывания каждую секунду. Светодиод HL2 загорается в случае ошибки передачи данных по интерфейсу I2C.

    Дополнительно добавил в программу возможность настройки часов кнопками SB2 “Настройка”, SB3 “Установка”. Вход в режим настройки производится нажатием кнопки SB2, на индикаторах высвечивается 00 часов, и знаки тире вместо минут и секунд (00 – – – –). Кнопкой SB3 задается значение часов (инкремент при каждом нажатии), далее нажатием кнопки SB2 осуществляется переход на редактирование минут, вместо тире высветится 00 минут. Кнопкой SB3 также задается необходимое значение и так далее. После редактирования секунд и нажатия кнопки SB2, время в часах перезаписывается, на индикаторах отображается обновленное время.

    Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #include LIST p=16F628A __CONFIG H"3F10" ;Конфигурация микроконтроллера errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге Sec equ 0020h ;вспомогательные регистры счета Sec1 equ 0021h ; Sec2 equ 0022h ; scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c temp equ 0026h ;регистр температуры perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр. result equ 0028h ;вспомогательный регистр двоично-десятичного преобр. dat_ind equ 0029h ;регистр данных для передачи по протоколу spi adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi second equ 002Bh ;регистр хранения секунд для установки времени minut equ 002Ch ;регистр хранения минут для установки времени hour equ 002Dh ;регистр хранения часов для установки времени adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;регистр флагов #DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231 #DEFINE sda PORTB,1 ;линия SDA для подключения DS3231 #DEFINE scl PORTB,2 ;линия SCL для подключения DS3231 #DEFINE sda_io TRISB,1 ;направление линии SDA #DEFINE scl_io TRISB,2 ;направление линии SCL #DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219 #DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219 #DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219 #DEFINE led PORTB,4 ;светодиод ошибки i2c #DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц #DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации #DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени #DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b"00000000" ;установка значений выходных защелок порта A movwf PORTA ; movlw b"01000000" ;установка значений выходных защелок порта B movwf PORTB ; movlw b"00000111" ;выключение компараторов movwf CMCON ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b"00000111" ;настройка линий ввода\вывода порта B movwf TRISB ;RB0-RB2 - на вход, остальные на выход movlw b"11111111" ;настройка линий ввода\вывода порта A movwf TRISA ;все линии на вход bcf STATUS,RP0 ;выбрать 0-й банк clrf flag ;сброс регистра флагов call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219) call viv_not ;вывод на индикаторы символов тире " ------ " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movlw b"11010000" ;адрес устройства (DS3231) movwf slave_adr ;Запись 4-х байт в регистры приема/передачи по i2c ;здесь выполняется настройка 1-го будильника, сигнал каждую секунду movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"10000000" ;данные для регистра секунд 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра минут 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра часов 1-го будильника movwf INDF ; incf FSR,F ; movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника movwf INDF ; movlw .4 ;передача 4-х байта по i2c movwf tmp_i2c ; movlw 0x07 ;установка адреса регистра секунд 1-го будильника movwf adr_i2c ; call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0E ;установка адреса регистра Control movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000101" ;запуск тактового генератора, запрет функционирования вывода INT/SQW для movwf INDF ;режима питания от батареи, частота импульсов на выходе INT/SQW 1Гц, ;выход INT/SQW задействован для генерации прерываний по будильнику, ;разрешение прерываний по 1-му будильнику call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_2 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x0F ;установка адреса регистра Status movwf adr_i2c ; movlw data_i2c ;установка первого регистра приема/передачи по i2c movwf FSR ; movlw b"00000000" ;сброс бита OSF, запрет генерирования импульсов на выходе EN32kHz, movwf INDF ;сброс флагов прерываний будильников A2F, A1F call write_i2c ;вызов подпрограммы записи по интерфейсу i2c call err_prov ;проверка на ошибки записи/чтения I2C met_1 btfsc int ;опрос линии прерывания будильника goto met_3 ; bsf led_sec ;включение светодиода индикации хода часов goto met_4 ; met_3 bcf led_sec ;выключение светодиода индикации хода часов btfsc nast ;опрос кнопки настройки часов goto met_5 ; call nast_time ;вызов подпрограммы установки времени goto met_2 ; met_5 btfsc regim ;опрос кнопки режима индикации goto met_1 ; met_6 call paus_knp ; btfss regim ; goto met_6 ; btfss flag,2 ;изменение значения флага режима индикации goto met_7 ; bcf flag,2 ;сброс флага индикации, режим отображения часов goto met_1 ; met_7 bsf flag,2 ;установка флага индикации, режим отображения температуры и часов goto met_1 ; met_4 movlw .1 ;передача 1-го байта по i2c movwf tmp_i2c ; movlw 0x11 ;установка адреса старшего регистра температуры movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C movf INDF,W ;копирование значения температуры в регистр temp movwf temp rd_time movlw .3 ;передача 3-х байт по i2c movwf tmp_i2c ; movlw 0x00 ;установка адреса регистра секунд movwf adr_i2c ; call read_i2c ;вызов подпрограммы чтения по I2C call err_prov ;проверка на ошибки записи/чтения I2C btfsc flag,2 ;опрос флага режима индикации goto met_8 ; call vivod ;вызов подпрограммы вывода значения часов на цифровое табло goto met_2 ; met_8 call vivod_temp ;вызов подпрограммы вывода температуры и часов на цифровое табло goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #include

    CONFIG H"3F10" ;Конфигурация микроконтроллера

    errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге

    Sec equ 0020h ;вспомогательные регистры счета

    Sec1 equ 0021h ;

    Sec2 equ 0022h ;

    scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит

    perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c

    temp equ 0026h ;регистр температуры

    perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр.

    result equ 0028h ;вспомогательный регистр двоично-десятичного преобр.

    dat_ind equ 0029h ;регистр данных для передачи по протоколу spi

    adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi

    second equ 002Bh ;регистр хранения секунд для установки времени

    minut equ 002Ch ;регистр хранения минут для установки времени

    hour equ 002Dh ;регистр хранения часов для установки времени

    adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c

    tmp_i2c equ 002Fh

    slave_adr equ 0030h

    data_i2c equ 0031h

    flag equ 007Fh ;регистр флагов

    #DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231

    #DEFINE sda PORTB,1 ;линия SDA для подключения DS3231

    #DEFINE scl PORTB,2 ;линия SCL для подключения DS3231

    #DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219

    #DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219

    #DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219

    #DEFINE led PORTB,4 ;светодиод ошибки i2c

    #DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц

    #DEFINE regim PORTA,2 ;кнопка Индикация - смены режима индикации

    #DEFINE nast PORTA,3 ;кнопка Настройка - входа в режим настройки времени

    #DEFINE ust PORTA,4 ;кнопка Установка - установка значения часов

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    org 0000h ;начать выполнение программы с адреса 0000h

    goto Start ;переход на метку Start

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;Основная программа

    Start movlw b"00000000" ;установка значений выходных защелок порта A

    movlw b"01000000" ;установка значений выходных защелок порта B

    movlw b"00000111" ;выключение компараторов

    bsf STATUS,RP0 ;выбрать 1-й банк

    movlw b"00000111" ;настройка линий ввода\вывода порта B

    movwf TRISB ;RB0-RB2 - на вход, остальные на выход

    movlw b"11111111" ;настройка линий ввода\вывода порта A

    movwf TRISA ;все линии на вход

    bcf STATUS,RP0 ;выбрать 0-й банк

    clrf flag ;сброс регистра флагов

    call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219)

    call viv_not ;вывод на индикаторы символов тире " ------ "

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    movlw b"11010000" ;адрес устройства (DS3231)

    ;Запись 4-х байт в регистры приема/передачи по i2c

    movlw data_i2c ;установка первого регистра приема/передачи по i2c

    movlw b"10000000" ;данные для регистра секунд 1-го будильника

    movlw b"10000000" ;данные для регистра минут 1-го будильника

    movlw b"10000000" ;данные для регистра часов 1-го будильника

    movlw b"10000000" ;данные для регистра даты/дня недели 1-го будильника

    movlw .4 ;передача 4-х байта по i2c

    movlw 0x07 ;установка адреса регистра секунд 1-го будильника

    Во многих проектах Ардуино требуется отслеживать и фиксировать время наступления тех или иных событий. Модуль часов реального времени, оснащенный дополнительной батарей, позволяет хранить текущую дату, не завися от наличия питания на самом устройстве. В этой статье мы поговорим о наиболее часто встречающихся модулях RTC DS1307, DS1302, DS3231, которые можно использовать с платой Arduino.

    Модуль часов представляет собой небольшую плату, содержащей, как правило, одну из микросхем DS1307, DS1302, DS3231.Кроме этого, на плате практически можно найти механизм установки батарейки питания. Такие платы часто применяется для учета времени, даты, дня недели и других хронометрических параметров. Модули работают от автономного питания – батареек, аккумуляторов, и продолжают проводить отсчет, даже если на Ардуино отключилось питание. Наиболее распространенными моделями часов являются DS1302, DS1307, DS3231. Они основаны на подключаемом к Arduino модуле RTC (часы реального времени).

    Часы ведут отсчет в единицах, которые удобны обычному человеку – минуты, часы, дни недели и другие, в отличие от обычных счетчиков и тактовых генераторов, которые считывают «тики». В Ардуино имеется специальная функция millis(), которая также может считывать различные временные интервалы. Но основным недостатком этой функции является сбрасывание в ноль при включении таймера. С ее помощью можно считать только время, установить дату или день недели невозможно. Для решения этой проблемы и используются модули часов реального времени.

    Электронная схема включает в себя микросхему, источник питания, кварцевый резонатор и резисторы. Кварцевый резонатор работает на частоте 32768 Гц, которая является удобной для обычного двоичного счетчика. В схеме DS3231 имеется встроенный кварц и термостабилизация, которые позволяют получить значения высокой точности.

    Сравнение популярных модулей RTC DS1302, DS1307, DS3231

    В этой таблице мы привели список наиболее популярных модулей и их основные характеристики.

    Название Частота Точность Поддерживаемые протоколы
    DS1307 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц Зависит от кварца – обычно значение достигает 2,5 секунды в сутки, добиться точности выше 1 секунды в сутки невозможно. Также точность зависит от температуры. I2C
    DS1302 32.768 кГц 5 секунд в сутки I2C, SPI
    DS3231 Два выхода – первый на 32.768 кГц, второй – программируемый от 1 Гц до 8.192 кГц ±2 ppm при температурах от 0С до 40С.

    ±3,5 ppm при температурах от -40С до 85С.

    Точность измерения температуры – ±3С

    I2C

    Модуль DS1307

    DS1307 – это модуль, который используется для отсчета времени. Он собран на основе микросхемы DS1307ZN, питание поступает от литиевой батарейки для реализации автономной работы в течение длительного промежутка времени. Батарея на плате крепится на обратной стороне. На модуле имеется микросхема AT24C32 – это энергонезависимая память EEPROM на 32 Кбайт. Обе микросхемы связаны между собой шиной I2C. DS1307 обладает низким энергопотреблением и содержит часы и календарь по 2100 год.

    Модуль обладает следующими параметрами:

    • Питание – 5В;
    • Диапазон рабочих температур от -40С до 85С;
    • 56 байт памяти;
    • Литиевая батарейка LIR2032;
    • Реализует 12-ти и 24-х часовые режимы;
    • Поддержка интерфейса I2C.

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

    Взаимодействие с другими устройствами и обмен с ними информацией производится с помощью интерфейса I2C с контактов SCL и SDA. В схеме установлены резисторы, которые позволяют обеспечивать необходимый уровень сигнала. Также на плате имеется специальное место для крепления датчика температуры DS18B20.Контакты распределены в 2 группы, шаг 2,54 мм. В первой группе контактов находятся следующие выводы:

    • DS – вывод для датчика DS18B20;
    • SCL – линия тактирования;
    • SDA – линия данных;
    • VCC – 5В;

    Во второй группе контактов находятся:

    • SQ – 1 МГц;
    • BAT – вход для литиевой батареи.

    Для подключения к плате Ардуино нужны сама плата (в данном случае рассматривается Arduino Uno), модуль часов реального времени RTC DS1307, провода и USB кабель.

    Чтобы подключить контроллер к Ардуино, используются 4 пина – VCC, земля, SCL, SDA.. VCC с часов подключается к 5В на Ардуино, земля с часов – к земле с Ардуино, SDA – А4, SCL – А5.

    Для начала работы с модулем часов нужно установить библиотеки DS1307RTC, TimeLib и Wire. Можно использовать для работы и RTCLib.

    Проверка RTC модуля

    При запуске первого кода программа будет считывать данные с модуля раз в секунду. Сначала можно посмотреть, как поведет себя программа, если достать из модуля батарейку и заменить на другую, пока плата Ардуино не присоединена к компьютеру. Нужно подождать несколько секунд и вытащить батарею, в итоге часы перезагрузятся. Затем нужно выбрать пример в меню Examples→RTClib→ds1307. Важно правильно поставить скорость передачи на 57600 bps.

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

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

    Чтобы провести настройку времени на модуле, нужно в скетче найти строку

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

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

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

    Считывание времени. Как только модуль настроен, можно отправлять запросы на получение времени. Для этого используется функция now(), возвращающая объект DateTime, который содержит информацию о времени и дате. Существует ряд библиотек, которые используются для считывания времени. Например, RTC.year() и RTC.hour() – они отдельно получают информацию о годе и часе. При работе с ними может возникнуть проблема: например, запрос на вывод времени будет сделан в 1:19:59. Прежде чем показать время 1:20:00, часы выведут время 1:19:00, то есть, по сути, будет потеряна одна минута. Поэтому эти библиотеки целесообразно использовать в случаях, когда считывание происходит нечасто – раз в несколько дней. Существуют и другие функции для вызова времени, но если нужно уменьшить или избежать погрешностей, лучше использовать now() и из нее уже вытаскивать необходимые показания.

    Пример проекта с i2C модулем часов и дисплеем

    Проект представляет собой обычные часы, на индикатор будет выведено точное время, а двоеточие между цифрами будет мигать с интервалом раз в одну секунду. Для реализации проекта потребуются плата Arduino Uno, цифровой индикатор, часы реального времени (в данном случае вышеописанный модуль ds1307), шилд для подключения (в данном случае используется Troyka Shield), батарейка для часов и провода.

    В проекте используется простой четырехразрядный индикатор на микросхеме TM1637. Устройство обладает двухпроводным интерфейсом и обеспечивает 8 уровней яркости монитора. Используется только для показа времени в формате часы:минуты. Индикатор прост в использовании и легко подключается. Его выгодно применять для проектов, когда не требуется поминутная или почасовая проверка данных. Для получения более полной информации о времени и дате используются жидкокристаллические мониторы.

    Модуль часов подключается к контактам SCL/SDA, которые относятся к шине I2C. Также нужно подключить землю и питание. К Ардуино подключается так же, как описан выше: SDA – A4, SCL – A5, земля с модуля к земле с Ардуино, VCC -5V.

    Индикатор подключается просто – выводы с него CLK и DIO подключаются к любым цифровым пинам на плате.

    Скетч. Для написания кода используется функция setup, которая позволяет инициализировать часы и индикатор, записать время компиляции. Вывод времени на экран будет выполнен с помощью loop.

    #include #include "TM1637.h" #include "DS1307.h" //нужно включить все необходимые библиотеки для работы с часами и дисплеем. char compileTime = __TIME__; //время компиляции. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //номера с выходов Ардуино, к которым присоединяется экран; void setup() { display.set(); display.init(); //подключение и настройка экрана. clock.begin(); //включение часов. byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 2); byte second = getInt(compileTime, 4); //получение времени. clock.fillByHMS(hour, minute, second); //подготовка для записывания в модуль времени. clock.setTime(); //происходит запись полученной информации во внутреннюю память, начало считывания времени. } void loop() { int8_t timeDisp; //отображение на каждом из четырех разрядов. clock.getTime();//запрос на получение времени. timeDisp = clock.hour / 10; timeDisp = clock.hour % 10; timeDisp = clock.minute / 10; timeDisp = clock.minute % 10; //различные операции для получения десятков, единиц часов, минут и так далее. display.display(timeDisp); //вывод времени на индикатор display.point(clock.second % 2 ? POINT_ON: POINT_OFF);//включение и выключение двоеточия через секунду. } char getInt(const char* string, int startIndex) { return int(string - "0") * 10 + int(string) - "0"; //действия для корректной записи времени в двухзначное целое число. В ином случае на экране будет отображена просто пара символов. }

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

    Программу можно немного модернизировать. При отключении питания выше написанный скетч приведет к тому, что после включения на дисплее будет указано время, которое было установлено при компиляции. В функции setup каждый раз будет рассчитываться время, которое прошло с 00:00:00 до начала компиляции. Этот хэш будет сравниваться с тем, что хранятся в EEPROM, которые сохраняются при отключении питания.

    Для записи и чтения времени в энергонезависимую память или из нее нужно добавить функции EEPROMWriteInt и EEPROMReadInt. Они нужны для проверки совпадения/несовпадения хэша с хэшем, записанным в EEPROM.

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

    В результате в коде нужно будет указать новую библиотеку (для жидкокристаллических экранов это LiquidCrystal), и добавить в функцию loop() строки для получения даты.

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

    • Подключение всех компонентов;
    • Проверка – на экране монитора должны меняться ежесекундно время и дата. Если на экране указано неправильное время, нужно добавить в скетч функцию RTC.write (tmElements_t tm). Проблемы с неправильно указанным временем связаны с тем, что модуль часов сбрасывает дату и время на 00:00:00 01/01/2000 при выключении.
    • Функция write позволяет получить дату и время с компьютера, после чего на экране будут указаны верные параметры.

    Заключение

    Модули часов используются во многих проектах. Они нужны для систем регистрации данных, при создании таймеров и управляющих устройств, которые работают по заданному расписанию, в бытовых приборах. С помощью широко распространенных и дешевых модулей вы можете создать такие проекты как будильник или регистратор данных с сенсоров, записывая информацию на SD-карту или показывая время на экране дисплея. В этой статье мы рассмотрели типичные сценарии использования и варианты подключения наиболее популярных видов модулей.