Подключение часов реального времени ds1302 к Arduino
Итак, часы реального времени. Эта полезная штучка решает большинство полезных задач, связанных со временем. Допустим управление поливом в 5 часов утра на даче. Или включение и выключение освещения в определённый момент. По дате можно запускать отопление в каком-нибудь доме. Вещь достаточно интересная и полезная. А конкретно? Мы с вами рассмотрим часы реального времени DS1302 для популярной платформы Arduino.
Из этой статьи вы узнаете:
Часы реального времени DS1302
Способ программирования Arduino для работы с DS1302
Доброго времени суток, уважаемые читатели блока kip-world! Как ваши дела? Напишите в комментариях, вы увлекаетесь робототехникой? Что значит для вас эта тема?
У меня ни на минуту не покидает мысль об этом. Я сплю и вижу, когда мы наконец — то придём к тому, что каждый сможет позволить себе купить персонального робота — помощника. Не важно, чем он будет заниматься, уборкой мусора, стрижкой газонов, мойкой автомобиля.
Я просто представляю себе, насколько сложные алгоритмы они должны содержать в своих «мозгах».
Louis roederer cristal brut на сайте wiski.ru.
Ведь мы придём к тому, что мы будем так же прошивать ПО, как на персональных компах. Так же скачивать прикладные программы. Пришивать руки, ноги, менять клешни, манипуляторы.
Посмотрите фильмы «Я-робот», «Искусственный интеллект», «Звёздных воинов».
Японцы уже давно внедряют свои разработки. Чем мы хуже?? У нас очень слабая популярность. Я знаю немногих разработчиков. По пальцам пересчитать. Мы занимаемся другим. Мы перекупщики. Просто покупаем готовые наборчики, роботов — игрушек и всякую дребедень.
Почему не разрабатываем вот это:
Или вот это:
Я закончил свои размышления вслух. Давайте мы с вами поговорим о подключении Таймера часов реального времени DS1302 к Arduino.
Часы реального времени DS1302
Контроллер Arduino не имеет своих собственных часов. Поэтому в случае необходимости нужно дополнять специальной микросхемой DS1302.
По питанию эти платы могут использовать свой элемент питания, или запитываться непосредственно с платы Arduino.
Таблица распиновки:
VCC | Питание (+5V) |
GND | Земля (GND) |
CLK | К цифровому пину Arduino ( в примере — пин 6, Arduino UNO) |
DAT | К цифровому пину Arduino ( в примере — пин 7, Arduino MEGA UNO) |
RST | К цифровому пину Arduino ( в примере — пин 8, Arduino MEGA UNO) |
Схема подключения c Arduino UNO:
Способ программирования Arduino для работы с DS1302
Обязательно нужно скачать действующую библиотеку из надёжных источников.
Универсальная библиотека для DS1302, DS1307, DS3231.
Библиотека позволяет считывать и записывать параметры реального времени. Небольшое описание я привожу ниже:
#include <iarduino_RTC.h> // Подключаем библиотеку.
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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iarduino_RTC.h> iarduino_RTC time(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) и выводим в "Последовательный порт" :
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1302,6,7,8); void setup() { delay(300); Serial.begin(9600); time.begin(); } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } } |
С вами на связи был я, Сёма. Пишите в комментах, подписывайтесь на новости, пишите письма.
С уважением, Гридин Семён.
Доброго времени суток)
Хорошая микросхемка, стабильная.
«По питанию эти платы могут использовать свой элемент питания, или запитываться непосредственно с платы Arduino.» — внешнее питание микросхеме в любом случае необходимо для чтения/записи текущих времени/даты/пользовательских данных. Элемент питания на самом шилде используется исключительно для тактирования в отсутствии основного питания.
И скетчи все-таки не тру)
Где романтика с самописными библиотеками, ногодрыгом и курением даташита? =)))
(как раз недавно пришлось этим заниматься с DS1307 )
А так неплохая статья) Удачи и всего хорошего =)
Юрик, привет, спасибо за комментарий. Времени не очень хватает на электронную романтику, вкуривания даташита и придумывания собственных библиотек.
Пока изучал поверхностно…
Насчёт питания я уловил мысль…
Добрый день!
А как с помощью данной библиотеки с подключенным DS1302 читать и писать в память часов данные (вроде память у нее 32 байта…)?
Привет, записывать в память я полагаю вот так
clock.set (20,29,45,27,07,2005,THURSDAY); ,
запросить вот так
clock.read ();
присвоить переменным вот так
int hour = clock.getHour ();
int minute = clock.getMinute ();
Так не получится
'class iarduino_RTC' has no member named 'getHour'
Доброе время суток,
После подключения Ардуино упорно в монитор выводила полночь. По моему в примере перепутаны пины. Строку, «iarduino_RTC time (RTC_DS1302,6,7,8);» поменял на «iarduino_RTC time (RTC_DS1302,8,6,7);» и все заработало.
Может подскажите есть ли возможность синхронизации DS1302 с компьютером?
Приветствую, я так предполагаю — нет. Так как DS1302 напрямую не связывается с компьютером. С шильдиком работает скетч в Ардуино.
Можно это осуществить через serial и Python
Текст библиотеки читается с трудом! Одна строка пишется левой рукой, другая правой, а потом наоборот.
Именно в блоге не удобно, или сама библиотека?
Потому что библиотеку, как и код программы, писал не автор.
Если решили скопировать, то укажите первоисточник.
Я и не отрицаю, в этой статье и код и библиотека не мои. Зачем изобретать велосипед, когда есть готовое в открытых источниках.
Не совсем понятно, что делает функция blinktime.
blinktime — это мигание объекта с указанной частотой, можно грубо назвать ШИМом
А вот подскажите вы используете команду time.begin ();, у других авторов я встречал вот так rtc.halt (false); //запуск часов
rtc.writeProtect (false); //снять защиту от записи
И еще что то пишут про непропаяные контакты у кварца. Так все же как правильно? У некоторых я вообще встречал схемы на аналоговых выходах. В целом мои часы не ходят, батарейка схема плата всё проверено 100500 раз. Всё же склоняюсь к кварцу
а как сделать так что бы время задавалось через ком порт а не в программе?
Как я понял из информации на сайте, переменные Hours и minutes уже встроены в библиотеку. Написал простенькую программу, чтобы по времени включался и выключался светодиод. При компиляции пишет, что переменная Hours не была объявлена. При вставке int Hours = clock.getHour (); пишет, что не видит clock.
Что я делаю не так? ))
#include
iarduino_RTC time (RTC_DS1302, 8, 6, 7); // RST, CLK, DAT
void setup () {
delay (300);
Serial.begin (9600);
time.begin ();
time.settime (0,59,15,17,05,20,7);
pinMode (5, OUTPUT);
}
void loop (){
if (Hours == 16 || minutes == 1) {
digitalWrite (5, 1);
}
if (Hours == 16 || minutes == 5) {
digitalWrite (5, 0);
}
}
А вот как такой пример реализовать? У меня например есть модуль реального времени (для случаев, когда пропало напряжение в сети) И мне нужно написать код таким образом, чтобы по циклу происходило считывание времени (сутки), сравнивалось с тем значением времени, что в программе, и если оно в диапазоне, выполнилось действие, если нет, то соответственно ждет своего часа. При отключении питания и повторном включении время в модуле продолжает тикать. Программа загрузилась и опять начала смотреть по коду, и сравнивать с реальным временем, нашла значение, выполнила код по условию, и дальше работает. Опыта в ардуинке можно сказать вообще нет, но нужно делать блок управления светом на аквариум. Хочется заложить этот минимум, когда падает электричество в сети и вырубается полностью все.