Подключение часов реального времени ds1302 к Arduino. DS1302 Побеждаем время
- Отличительные особенности:
- Подсчет реального времени в секундах, минутах, часах, датах месяца, месяцах, днях недели и годах с учетом высокосности текущего года вплоть до 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 содержит часы реального времени с календарем и 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 DS1307 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
SDA | A4 |
SCL | A5 |
Подключение DS1302 к Arduino:
RTC DS1302 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
RST | 6 (Можно изменить на другие в скетче) |
CLK | 7 (Можно изменить на другие в скетче) |
DAT | (Можно изменить на другие в скетче) |
Подключение DS3231 к Arduino:
RTC DS3231 | Arduino UNO |
---|---|
GND | GND |
VCC | +5V |
SDA | A4 |
SCL | A5 |
Модуль 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— Часы реального времени. Часто встречается в KIT наборах компонентов для Arduino (arduino starter kit).
Особенности модуля:
- Часы реального времени, календарь до 2100 года, учетом високосного года.
- Держатель для Li-Ion батареи CR2032\CR1220 в зависимости от версии, для резервного питания.
- Трехпроводной последовательный интерфейс.
Из недостатков стоит отметить очень плохую точность хода.
Распиновка модуля:
- VCC и GND — Питание и масса, Напряжение питания от 2,0 В до 5,5 В. Типичное 3,3 В.
- CLK / SCLK — Тактовый сигнал последовательного интерфейса.
- DAT / I/O — Input/Push-Pull Output, линия данных последовательного интерфейса.
- RST / CE — Разрешение чтения\записи.
Подключение к Arduino:
Модуль подключается на любые свободные порты arduino, питание модуля 5 вольт.
Софт:
Есть библиотека, скачать можно
После установки библиотеки открываем пример set_clock.ino
const int kCePin = 5 ; // Chip Enable const int kIoPin = 6 ; // Input/Output const int kSclkPin = 7 ; // Serial Clockв строке с константами указываем к каким портам подключен модуль, на модуле обозначения могут отличатся и подписаны как CLK, DAT, RES, это SCLK, I/O, CE соответственно.
Итак, часы реального времени. Эта полезная штучка решает большинство полезных задач, связанных со временем. Допустим управление поливом в 5 часов утра на даче. Или включение и выключение освещения в определённый момент. По дате можно запускать отопление в каком-нибудь доме. Вещь достаточно интересная и полезная. А конкретно? Мы с вами рассмотрим часы реального времени DS1302 для популярной платформы Arduino.
Из этой статьи вы узнаете:
Доброго времени суток, уважаемые читатели блока kip-world! Как ваши дела? Напишите в комментариях, вы увлекаетесь робототехникой? Что значит для вас эта тема?
У меня ни на минуту не покидает мысль об этом. Я сплю и вижу, когда мы наконец — то придём к тому, что каждый сможет позволить себе купить персонального робота — помощника. Не важно, чем он будет заниматься, уборкой мусора, стрижкой газонов, мойкой автомобиля.
Я просто представляю себе, насколько сложные алгоритмы они должны содержать в своих «мозгах».
Ведь мы придём к тому, что мы будем так же прошивать ПО, как на персональных компах. Так же скачивать прикладные программы. Пришивать руки, ноги, менять клешни, манипуляторы.
Посмотрите фильмы «Я-робот», «Искусственный интеллект», «Звёздных воинов».
Японцы уже давно внедряют свои разработки. Чем мы хуже?? У нас очень слабая популярность. Я знаю немногих разработчиков. По пальцам пересчитать. Мы занимаемся другим. Мы перекупщики. Просто покупаем готовые наборчики, роботов — игрушек и всякую дребедень.
Почему не разрабатываем вот это:
Или вот это:
Я закончил свои размышления вслух. Давайте мы с вами поговорим о подключении Таймера часов реального времени DS1302 к Arduino.
Часы реального времени DS1302
Контроллер Arduino не имеет своих собственных часов. Поэтому в случае необходимости нужно дополнять специальной микросхемой DS1302.
По питанию эти платы могут использовать свой элемент питания, или запитываться непосредственно с платы Arduino.
Таблица распиновки:
Схема подключения c Arduino UNO:
Способ программирования Arduino для работы с DS1302
Обязательно нужно скачать действующую библиотеку из надёжных источников.
Библиотека позволяет считывать и записывать параметры реального времени. Небольшое описание я привожу ниже:
#include
iarduino_RTC ОБЪЕКТ (НАЗВАНИЕ [, ВЫВОД_RST [, ВЫВОД_CLK [, ВЫВОД_DAT ]]]);
// Создаём объект.
Функция begin (); // Инициализация работы RTC модуля.
Функция settime (СЕК [, МИН [, ЧАС [, ДЕНЬ [, МЕС [, ГОД [, ДН ]]]]]]); // Установка времени.
Функция gettime ([ СТРОКА ]); // Чтение времени.
функция blinktime (ПАРАМЕТР [ ЧАСТОТА ] ); // Заставляет функцию gettime «мигать» указанным параметром времени.
функция period (МИНУТЫ ); // Указывает минимальный период обращения к модулю в минутах.
Переменная seconds // Возвращает секунды от 0 до 59.
Переменная minutes // Возвращает минуты от 0 до 59.
Переменная hours // Возвращает часы от 1 до 12.
Переменная Hours // Возвращает часы от 0 до 23.
Переменная midday // Возвращает полдень 0 или 1 (0-am, 1-pm).
Переменная day // Возвращает день месяца от 1 до 31.
Переменная weekday // Возвращает день недели от 0 до 6 (0-воскресенье, 6-суббота).
Переменная month // Возвращает месяц от 1 до 12.
Переменная year // Возвращает год от 0 до 99.
Пишем простенькую программу. Установка текущего времени в RTC модуль (DS1302):
Arduino
#include
#include iarduino _ RTCtime (RTC_DS1302 , 6 , 7 , 8 ) ; void setup () { delay (300 ) ; Serial . begin (9600 ) ; time . begin () ; time . settime (0 , 51 , 21 , 27 , 10 , 15 , 2 ) ; // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник void loop () { if (millis () % 1000 == 0 ) { // если прошла 1 секунда Serial . println (time . gettime ("d-m-Y, H:i:s, D" ) ) ; // выводим время delay (1 ) ; // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс |
Считываем текущее время с RTC модуля (DS1302) и выводим в "Последовательный порт" :
#include
Опубліковано 18.08.2011
– это микросхема реального времени. Она обеспечивает ход времени, даже когда основное устройство отключено от питания.
Основные характеристики:
- – простота подключения к микроконтроллеру по трехпроводному интерфейсу.
- – питание от 2 до 5.5 В.
- – из внешних элементов часовой кварц 32768 Гц и батарейка резервного питания 3В (я использую RC2032). Батарейки хватает надолго, микросхема потребляет около 300 нА (нано ампер)!
- – считает секунды, минуты, часы, день месяца, месяц, год, день недели. Учитываются високосные года. Микросхема сможет работать до 2100года. Дальше не хватит счетчика лет. Это, несомненно, опечалило меня. 🙂
- – отображение времени в 12 или 24 часовом режимах с отображением AM или PM
Нюансы
Иногда пишут “в микросхеме есть встроенный календарь до 2100 года”. Не спешите удивляться, это всего лишь означает, что подсчет времени ведется с учетом високосных лет. И все! На самом деле даже день недели надо устанавливать. Т.е. день недели не определяется по установленной дате. День недели работает как простой счетчик и переключается в полночь. Но с другой стороны, это очень удобно. Ведь в Восточной Европе принято считать первый день недели понедельник, а на западе первый день недели – воскресенье. В данном случае микросхеме абсолютно все равно. Устанавливаем текущий день недели по собственному исчислению, а дальше он будет изменяться каждую полночь.
Подключение к МК
Распиновка микросхемы:
Подключение к микроконтроллеру:
взяты с документации, которую можно скачать здесь:
Библиотека для GCC WinAVR
Честно говоря, сразу я хотел не заморачиваться и использовать уже готовую библиотеку. Так и сделал, скачал даже две. Одну написал русский программист, а вторую иностранец. Обе не работали должным образом. В первом случае почему-то не выставлялся день больше магического 7 дня месяца, ну конечно, о 12 часовом режиме в России никогда не слышали, а буковки AM PM, для нас славян, чужды и не понятны. Во втором случае… уже догадались? Да! Иностранцы не учли, что где то на планете коварные нации исчисляют время до 24 часов!!! Вдобавок, год записывал (соответственно и считывал) не правильно. Т.е. оно конечно как то работает, но в следующем году вылезут все баги. Плюнул, написал свою простую библиотеку.
Перед тем как использовать библиотеку, откроем файл
В нем правим только эти параметры:
#define DS1302_E 0 #define DS1302_SCLK 1 #define DS1302_IO 2 #define DS1302_DDR_RTC DDRC #define DS1302_PORT_RTC PORTC #define DS1302_PIN_RTC PINC
Т.е. описываем к каким ногам и к какому порту подключена наша .
Обратите внимание, что в этом же файле описана структура:
Typedef struct { uint8_t Sec; uint8_t Min; uint8_t Hour; uint8_t Month; uint8_t Day; uint8_t Year; uint8_t WeekDay; uint8_t AMPM; uint8_t H12_24; } tpDateTime; tpDateTime DateTime;
Через нее и будет выполняться взаимосвязь (запись и чтение) с .
В библиотеке всего две функции:
void DS1302_ReadDateTime();
void DS1302_WriteDateTime();
Для установки времени в микросхеме необходимо
1. В структуру DateTime
задать время и режим (12 или 24 часовой)
2. Вызвать функцию DS1302_WriteDateTime();
Для чтения времени из микросхемы:
1. Вызвать функцию DS1302_ReadDateTime();
2. Читать время и режим из структуры DateTime
.
Обратите внимание, что DateTime.AMPM и DateTime.H12_24 задаются следующим образом:
DateTime.AMPM = AM; или DateTime.AMPM = PM;
DateTime.H12_24 = H12; или DateTime.H12_24 = H24;
Пример использования:
#include
Внимание! В примере в следующих строках устанавливается заранее указанное время при старте микроконтроллера.
DateTime.Sec = 57; DateTime.Min = 59; DateTime.Hour = 11; DateTime.Month = 8; DateTime.Day = 16; DateTime.Year = 11; DateTime.WeekDay = 2; DateTime.AMPM = AM; //AM/PM DateTime.H12_24 = H12; //H12/H24 // Записываем время в микросхему ds1302 DS1302_WriteDateTime();
Т.е. при каждом включении питания микроконтроллер будет устанавливать одно и то же время. Если в микросхеме уже установлено время (разумеется, при подключенной батарейки), можно закомментировать функцию DS1302_WriteDateTime(); скомпилировать и прошить микроконтроллер новой прошивкой. После чего он будет только читать время из микросхемы.
setTime(hour, min, sec);
Установка времени.
Параметры:
hour:
Часы (0-23)
min:
Минуты (0-59)
sec:
Секунды (0-59)
Пример:
rtc.setTime(23, 59, 59); // Установка времени 23:59:59
Примечание:
Установка времени сбрасывает флаг CH (Clock Halt).
setDate(date, mon, year);
Установка даты.
Параметры:
date:
День (1-31)
mon:
Месяц (1-12)
year
: Год (2000-2099)
Пример:
rtc.setDate(6, 8, 2015); // Установка даты 6 августа 2015г.
Примечание:
Защиты от ввода неправильной даты нет. Т.е., возможно ввести 31 февраля, но результат будет не предсказуем
setDOW(dow);
Установка дня недели.
Параметры:
dow:
День недели (1-7)
Пример:
rtc.setDOW(FRIDAY); // Установить день недели - Пятница
Примечание:
Устанавливаются от понедельника (1) до воскресенья (7).
getTimeStr();
Считать текущее время в виде строковой переменной.
Параметры
:
format:
<необязательный параметр>
FORMAT_LONG
"ЧЧ:ММ:СС" (По умолчанию)
FORMAT_SHORT
"ЧЧ:ММ"
Пример:
Serial.print(rtc.getTimeStr()); // Отправить текущее время через последовательный порт
getDateStr(]]);
Считать текущую дату в виде строковой переменной.
Параметры:
slformat:
<необязательный параметр>
FORMAT_LONG
Год из 4х цифр (ГГГГ) (По умолчанию)
FORMAT_SHORT
Год из 2х цифр (ГГ)
eformat:
<необязательный параметр>
FORMAT_LITTLEENDIAN
"ДД.ММ.ГГГГ" (По умолчанию)
FORMAT_BIGENDIAN
"ГГГГ.ММ.ДД"
FORMAT_MIDDLEENDIAN
"ММ.ДД.ГГГГ"
divider:
<необязательный параметр>
Символ для разделения. По умолчанию "."
Пример:
Serial.print(rtc.getDateStr()); // Отправить текущую дату через последовательный порт (В формате "ДД.ММ.ГГГГ")
getDOWStr();
Считать текущий день недели в виде строковой переменной.
Параметры:
format:
<необязательный параметр>
FORMAT_LONG
День недели на английском языке (По умолчанию)
FORMAT_SHORT
Сокращенное название дня недели на английском языке (3 символа)
Пример:
Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Отправить сокращенное название текущего дня недели через последовательный порт
getMonthStr();
Считать текущий месяц в виде строковой переменной.
Параметры:
format:
<необязательный параметр>
FORMAT_LONG
название месяца на английском языке (По умолчанию)
FORMAT_SHORT
Сокращенное название месяца на английском языке (3 символа)
Пример:
Serial.print(rtc.getMonthStr()); // Отправить название текущего месяца через последовательный порт
halt(value);
Управление флагом СН (запуск-останов часов).
Параметры:
value:
true:
Установить флаг CH
false:
очистить флаг CH
Пример:
rtc.halt (истина); // Установить флаг CH
Примечания:
Когда флаг установлен, тактовый генератор
останавливается и DS1302 находится в режиме ожидания с низким энергопотреблением с током менее 100nA. Если флаг сбрасывается, часы начинают отсчет времени.
writeProtect(enable);
Установка или сброс WP-бита.
Параметры:
enable:
true:
Установить WP-бит
false:
Сбросить WP бит
Пример:
rtc.writeProtect(false); // Сбросить WP-бит
Примечание:
WP: (Write-Protect) бит. Блокирует запись информации в DS1302
setTCR(value);
Установка режима trickle charge (заряд малым током).
Параметры:
value:
определенные литералы, обозначающие количество диодов и сопротивлений для зарядки.
Пример:
rtc.setTCR(TCR_D1R4K); // Задан режим trickle charge 1 диод и резистор сопротивлением 4кОм.
Примечание:
Литералы имеют вид TCR_DxRyK где х число диодов (1 или 2), а у - используемое сопротивление (2, 4 или 8 кОм). TCR_OFF отключает фунцию подзарядки.
writeBuffer(buffer);
Запись информации в ОЗУ DS1302.
Параметры:
buffer:
DS1302_RAM буфер
Пример:
rtc.writebuffer(ramBuffer); // Записать 31 байт из переменной ramBuffer в ОЗУ DS1302
readBuffer();
Чтение информации из ОЗУ DS1302.
Параметры:
Нет
Пример:
ramBuffer=rtc.readBuffer(); // Прочитать все 31 байт из ОЗУ DS1302 в переменную ramBuffer
poke(address, value);
Запись одного байта в ОЗУ DS1302.
Параметры:
address:
адрес для записи (0-30)
value:
число для записи по адресу
Пример: rtc.poke(15, 160); // Записать число 160 по адресу 15
peek(address);
Чтение одного байта из ОЗУ DS1302.
Параметры:
address:
адрес для чтения (0-30)
Пример:
b=rtc.peek(18); // Считать 1 байт по адресу 18 в переменную b