Обзор часов реального времени DS1307 (RTC)
DS1307 это небольшой модуль, предназначенный для подсчета времени. Собранный на базе микросхемы DS1307ZN с реализацией питания от литиевой батарейки (LIR2032), что позволяет работать автономно в течение длительного времени. Также на модуле, установлена энергонезависимая память EEPROM объемом 32 Кбайт (AT24C32). Микросхема AT24C32 и DS1307ZN связаны обшей шиной интерфейсом I2C.
Технические параметры
► Напряжение питания: 5В
► Рабочая температура: – 40℃ … + 85℃
► Память: 56 байт (энергонезависимая)
► Батарейка: LIR2032 (автоматическое определение источника питания)
► Интерфейса: I2C
► Габариты: 28мм х 25мм х 8 мм
Общие сведения
Использовании модуля DS1307 зачастую очень оправдано, например, когда данные считываются редко, интервалом более недели, использовать собственные ресурсы контроллера, неоправданно или невозможно. Обеспечивание бесперебойное питание, например платы Arduino, на длительный срок дорого, даже при использовании батареи.
Благодаря собственной памяти и автономностью, можно регистрировать события, (при автономном питании) например изменение температуры и так далее, данные сохраняются в памяти их можно считать из памяти модуля. Так что модуль DS1307 часто используют, когда контроллерам Arduino необходимо знать точное время, для запуска какого то события и так далее.
Обмен данными с другими устройствами осуществляется по интерфейсу I2C с выводов SCL и SDA. Конденсаторы С1 и С2 необходимы для снижения помех по линию питания. Чтобы обеспечить надлежащего уровня сигналов SCL и SDA установлены резисторы R2 и R3 (подтянуты к питанию). Для проверки работоспособности модуля, на вывод 7 микросхему DS1307Z, подается сигнал SQ, прямоугольной формы с частотой 1 Гц. Элементы R4, R5, R6, VD1 необходимы для подзарядку литиевой батарейки. Так же, на плате предусмотрено посадочное место (U1), для установки датчика температуры DS18B20 (при необходимости можно впаять его), считывать показания, можно с вывода DS, который подтянут к пиатнию, через резистор R1 сопротивлением 3.3 кОм. Принципиальную схему и назначение контактов можно посмотреть на рисунках ниже.
На плате расположено две группы контактов, шагом 2.54 мм, для удобного подключения к макетной плате, буду использовать штырьевые разъемы, их необходимо впаять.
Первая группа контактов:
► DS: вывод DS18B20 (1-wire)
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Dфta)
► VCC: «+» питание модуля
► GND: «-» питание модуля
Вторая группа контактов:
► SQ: вход 1 МГц
► DS: вывод DS18B20 (1-wire)
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Dфta)
► VCC: «+» питание модуля
► GND:«-» питание модуля
► BAT:
Подзарядка батареи
Как описывал ваше модуль может заряжать батарею, реализовано это, с помощью компонентов R4, R5, R6 и диода D1. Но, данная схема имеет недостаток, через резистор R4 и R6 происходит разряд батареи (как подметил пользователь ALEXEY, совсем не большой). Так как модуль потребляем незначительный ток, можно удалить цепь питания, для этого убираем R4, R5, R6 и VD1, вместо R6 поставим перемычку (после удаления компонентов, можно использовать обычную батарейку CR2032).
Подключение DS1307 к Arduino
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
► Часы реального времени RTC DS1307 x 1 шт.
Подключение:
Для подключения часы реального времени DS1307, необходимо впаять впаять штыревые разъемы в первую группу контактов. Далее, подключаем провода SCL (DS1307) к выводу 4 (Arduino UNO) и SDA (DS1307) к выводу 5 (Arduino UNO), осталось подключить питания VCC к +5V и GND к GND. Кстати, в различных платах Arduino вывода интерфейса I2C отличаются, назначение каждого можно посмотреть ниже.
Установка времени DS1307
Первым делом, необходимо скачать и установить библиотеку «DS1307RTC» и «TimeLib» в среду разработки IDE Arduino, далее необходимо настроить время, открываем пример из библиотеки DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «SetTime» или копируем код снизу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
/* Тестирование производилось на Arduino IDE 1.6.12 Дата тестирования 23.11.2016г. */ #include <Wire.h> // Подключаем библиотеку Wire #include <TimeLib.h> // Подключаем библиотеку TimeLib #include <DS1307RTC.h> // Подключаем библиотеку DS1307RTC const char *monthName[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; tmElements_t tm; void setup() { bool parse=false; bool config=false; // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true; // and configure the RTC with this info if (RTC.write(tm)) { config = true; } } Serial.begin(9600); while (!Serial) ; // wait for Arduino Serial Monitor delay(200); if (parse && config) { Serial.print("DS1307 configured Time="); Serial.print(__TIME__); Serial.print(", Date="); Serial.println(__DATE__); } else if (parse) { Serial.println("DS1307 Communication Error :-{"); Serial.println("Please check your circuitry"); } else { Serial.print("Could not parse info from the compiler, Time=\""); Serial.print(__TIME__); Serial.print("\", Date=\""); Serial.print(__DATE__); Serial.println("\""); } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec; if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; tm.Hour = Hour; tm.Minute = Min; tm.Second = Sec; return true; } bool getDate(const char *str) { char Month[12]; int Day, Year; uint8_t monthIndex; if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; for (monthIndex = 0; monthIndex < 12; monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break; } if (monthIndex >= 12) return false; tm.Day = Day; tm.Month = monthIndex + 1; tm.Year = CalendarYrToTm(Year); return true; } |
Загружаем данную скетч в контроллер Arduino (время берется с ОС), открываем «Мониторинг порта»
Программа
В библиотеке есть еще один пример, открыть его можно DS1307RTC «Файл» —> «Примеры» —> «DS1307RTC» —> «ReadTest»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/* Тестирование производилось на Arduino IDE 1.6.12 Дата тестирования 23.11.2016г. */ #include <Wire.h> // Подключаем библиотеку Wire #include <TimeLib.h> // Подключаем библиотеку TimeLib #include <DS1307RTC.h> // Подключаем библиотеку DS1307RTC void setup() { Serial.begin(9600); // Устанавливаем скорость передачи данных while (!Serial) ; // Ожидаем подключение последовательного порта. Нужно только для Leonardo delay(200); // Ждем 200 мкс Serial.println("DS1307RTC Read Test"); // Выводим данные на последовательный порт Serial.println("-------------------"); // Выводим данные на последовательный порт } void loop() { tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(':'); print2digits(tm.Minute); Serial.write(':'); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write('/'); Serial.print(tm.Month); Serial.write('/'); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } delay(9000); } delay(1000); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); } Serial.print(number); } |
Загружаем данную код в контроллер Arduino, открываем «Мониторинг порта»
Ссылки
Библиотека libraries-DS1307RTC
Библиотека libraries-TimeLib
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Часы реального времени RTC DS1307
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Провода DuPont, 2,54 мм, 20 см
Часы реального времени RTC DS1307
обзор конечно хороший, но: 1.пожалуйста, исправьте ошибки в тексте, их слишком много. 2. не трогайте цепь зарядки батарейки. на делителе напряжения R4,R6 ток 2 микроАмпера, емкость батарейки 220 милиАмпер/час. посчитайте сколько нужно времени, чтобы разрядить батарейку при таком токе.
Спасибо за замечание, поправил
Наличие цепи заряда аккумулятора понятно, с батарейкой его надо удалять. А вот насчет делителя R6R4 — его тоже нужно убирать. И не из-за дополнительного тока, а из-за ограничений по напряжению на входе Vbat — оно д.б. по паспорту 2.5-3.5 В. Т.е. если батарея подсядет с номинальных 3.3 до 3 В, чип начнет глючить, по крайней мере точность хода пострадает.
Очень помог обзор. А нет ли материалов по записи данных в память этих часов?
Здравствуйте, к сожалению пока нету
Каких материалов нет?
Всё есть в даташите.
Или требуется, как для одноклеточных, прямо код для ардуино?
Спасибо за обзор! К ардуино такого зверя подключил, а вот к node mcu v3 никак не получается. Он его просто не видит. Ни одна библиотека не видит. Подключаю к ногам d4 и d5 — как по инструкции, но ничего не выходит. Может сталкивались?
у esp8266 D1-D2 sda и scl а не как ты написал, всё на ней работает отлично.
Подскажите пожалуйста как сделать чтобы реле включалось каждые 18:00 . Помагите пожалусто.
добавь Wire.begin(4, 5);
На месяц 3мин опаздывает считать. Как ето исправить
Поставить DS3231, и будет Вам счастье.
Здравствуйте, Сергей! Очень интересные обзоры.
По часам есть такой вопрос, как использовать состояние часов, чтобы ардуино управлял другими устройствами (мотором) в нужное время?
Спасибо.
Здравствуйте, Сергей. Я новичок в Ардуино. Прочитал ваш обзор по DS1307, подключил модуль к Arduino UNO точно как вы описали в обзоре, скачал и подключил нужные библиотеки, скачал проверочные скетчи. Трансляция и загрузка скетчей происходит без замечаний. Но!!! Сообщение монитора: «DS1307 ERROR». У меня два одинаковых модуля DS1307. Они укомплектованы батарейками. Ведут себя оба идентично: «DS1307 ERROR».
Что может быть??? Я с модулями обращался очень аккуратно. Чтобы сразу оба были неисправны?! Кстати, если батарейка вставлена, а на выводах модуля осциллографом нигде не наблюдаются импульсы, а только уровни — о чем это свидетельствует?
Как проверить работоспособность модулей ? Буду вам очень благодарен и надеюсь на ответ. Петр.
Здравствуйте, точно подсказать не смогу почему не работает. Проверьте подключения и провода, зачастую провода Dupoint бывают бракованные.
Столкнулся тут на одном модуле с косяком. Плюс батареи по схеме через резистор R6 должен идти на 3й контакт(vbat) ds1307. Однако, туда он почему-то не идёт, а этот самый vbat замкнут на 8й контакт Vcc этой же микросхемы. Т.е. батарея из схемы исключена =).
В итоге модуль не запоминает время при отключении от питания. Пришлось поднимать 3ю ногу и подавать на неё «+» с батареи отдельным проводом. Я не знаю, дефект это конкретного модуля или их целая партия таких кривых, но имейте это в виду.
AT24C32 имеет объём не 32 Кбайт, а 4 Кбайта.
«The AT24C32A/64A provides 32,768/65,536 bits of serial electrically erasable andprogrammable read only memory (EEPROM)»
32,768 бит = 4096 байт = 4 КБ
Смутила пара неточностей:
цепь заряда используется с LIR2032 (это аккумулятор), а на фото CR2032 (это НЕперезаряжаемая батарея — она может взорваться при попытке её зарядить).
Здравствуйте да вено на фото была CR2032
Здравствуйте, не подскажите с каких пинов получить импульс (желательно минутный ), что бы каждую минуту получать импульс. Хочу подать импульс на дискретные входа, что бы древние механические часы работали от ПЛК, а время генерировалось от этой платки.
https://alexgyver.ru/arduino-algorithms/
С SQ выходят секундные импульсы
т.е. пины SQ и VCC
Причем выходят отрицательные импульсы
Полярность и частота импульсов настраиваются.
Bit 7: Output Control (OUT). This bit controls the output level of the SQW/OUT pin when the square-wave output
is disabled. If SQWE = 0, the logic level on the SQW/OUT pin is 1 if OUT = 1 and is 0 if OUT = 0. On initial
application of power to the device, this bit is typically set to a 0.
Bits 1 and 0: Rate Select (RS[1:0]). These bits control the frequency of the square-wave output when the squarewave output has been enabled. The following table lists the square-wave frequencies that can be selected with the
RS bits. On initial application of power to the device, these bits are typically set to a 1.
Точность хода 1307 обычно составляет 2-3 с/сутки при комнатной температуре. Если сравнить 1307 с 3231, то там точность, конечно, выше, по паспорту около 0.5 с/сут. Кстати, максимальная погрешность 2ppm от частоты в 32 кГц — это уже более 1с/ сутки получается. Разница между ними не так уж и велика для большинства случаев, чтобы переплачивать за это в 5 раз. Для точных измерений все равно недостаточно. Кому надо точнее, нужно предусмотреть периодическую установку точного времени от ПК. Или использовать прецизионный кварцевый генератор.
DS3231 как раз и содержит точный кварц и температурную стабилизацию.
У меня часы на DS3231 в гараже за 4 года ушли на 3 секунды.
Ни для 1302, ни для 1307 такой результат в условиях перепада температур в 50 градусов в принципе недостижим.
Хотя для большинства применений 3231 действительно избыточна.
Подскажите пожалуйста в чем может быть причина . открываю порт и пишет:
DS1307 Communication Error :-}
Please check your circuitry
Здравствуйте, нету связи с DS1307, проверьте схему подключения.
Здравствуйте, вы пишете, что когда данные считываются редко, то RTC оправдано.
А вот почему китайцы не сэкономили на RTC в наборе будильника на контроллере STM (3118AY-82)? Вроде и к нему кварц подключается. Тем более, что там DS1302 (в панельке) и часы заметно спешат.