174 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Наручные часы на ардуино. LCD часы, будильник и таймер с детектором движения на Arduino. Подключение часов реального времени

Урок 19. RTC часы с будильником

В предыдущем уроке 18, мы подключили Trema RTC часы реального времени с Trema кнопками и LCD I2C дисплеем к arduino Uno, написали скетч, для установки времени при помощи кнопок.

Теперь расширим функционал получившихся часов, добавив к ним функцию будильника. А код, который будет выполняться при срабатывании будильника выведем в отдельную функцию “Func_alarm_action()”, чтоб Вы смогли легко его найти и изменить. Например, при срабатывании будильника, открывать жалюзи, включать свет или музыку, включить через реле тостер или кофе-машину и т.д.

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

  • Arduino х 1шт.
  • RTC модуль Trema на базе чипа DS1307 х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
  • Trema Shield х 1шт.
  • Trema-модуль i2C Hub х 1шт.
  • Trema-модуль кнопка c проводами х 3шт.
  • Шлейф «мама-мама»для шины I2С х 2шт.
  • Trema-модуль зуммер х 1шт.
  • Trema-модуль светодиод х 1шт. (белый, синий, красный, оранжевый или зелёный)

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

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

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

Видео:

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

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

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

Зуммер подключаем к выводу 5, а светодиод к выводу 13 (дублируя встроенный в arduino).

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

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

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

Работа кнопок, вывод и установка времени, описывались в уроке 18, в этом уроке рассмотрим работу будильника:

В начале кода добавляем две константы: PIN_alarm_TONE и PIN_alarm_LED, указывающие номера выводов зуммера и светодиода.
А также добавляем четыре переменные: VAR_alarm_MIN , VAR_alarm_HOUR , VAR_alarm_FLAG1 и VAR_alarm_FLAG2 .

  • VAR_alarm_MIN – переменная в которой хранится значение минут, при котором сработает будильник (по умолчанию 0 минут)
  • VAR_alarm_HOUR – переменная в которой хранится значение часов, при котором сработает будильник (по умолчанию 0 часов)
  • VAR_alarm_FLAG1 – флаг разрешения работы будильника, false – не активен, true – активен (по умолчанию true – активен)
  • VAR_alarm_FLAG2 – флаг указывающий на то, что будильник сработал “сигнализация” (по умолчанию false – не сработал)

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

В функции loop, после вывода информации на дисплей, добавляем проверку: не пора ли включить будильник?

  • если будильник включён (установлен флаг VAR_alarm_FLAG1)
  • если в текущем времени 0 секунд (time.seconds==00)
  • если количество минут текущего времени (time.minutes) равно количеству минут установленных в будильнике (VAR_alarm_MIN)
  • если количество часов текущего времени (time.Hours) равно количеству часов установленных в будильнике (VAR_alarm_HOUR)
    то устанавливаем флаг VAR_alarm_FLAG2 (указывающий на то, что будильник сработал)
  • если установлен флаг VAR_alarm_FLAG2, то запускаем действия будильника (действия описаны в функции Func_alarm_action)
    Так как проверка будильника и запуск функции Func_alarm_action() находится внутри условия if(millis()%1000==0)<. >, то действия будильника будут выполняться один раз в секунду.

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

Разберемся в коде действий будильника:

Действия будильника описаны в функции Func_alarm_action().

В этой функции мы включаем светодиод, далее подаём три коротких звуковых сигнала (с частотой 2000Гц, длительностью и паузой 100мс), после чего выключаем светодиод.

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

Подключение часов реального времени ds1302 к Arduino

Итак, часы реального времени. Эта полезная штучка решает большинство полезных задач, связанных со временем. Допустим управление поливом в 5 часов утра на даче. Или включение и выключение освещения в определённый момент. По дате можно запускать отопление в каком-нибудь доме. Вещь достаточно интересная и полезная. А конкретно? Мы с вами рассмотрим часы реального времени DS1302 для популярной платформы Arduino.

Из этой статьи вы узнаете:

Доброго времени суток, уважаемые читатели блока kip-world! Как ваши дела? Напишите в комментариях, вы увлекаетесь робототехникой? Что значит для вас эта тема?

У меня ни на минуту не покидает мысль об этом. Я сплю и вижу, когда мы наконец — то придём к тому, что каждый сможет позволить себе купить персонального робота — помощника. Не важно, чем он будет заниматься, уборкой мусора, стрижкой газонов, мойкой автомобиля.

Я просто представляю себе, насколько сложные алгоритмы они должны содержать в своих «мозгах».

Ведь мы придём к тому, что мы будем так же прошивать ПО, как на персональных компах. Так же скачивать прикладные программы. Пришивать руки, ноги, менять клешни, манипуляторы.

Посмотрите фильмы «Я-робот», «Искусственный интеллект», «Звёздных воинов».

Японцы уже давно внедряют свои разработки. Чем мы хуже?? У нас очень слабая популярность. Я знаю немногих разработчиков. По пальцам пересчитать. Мы занимаемся другим. Мы перекупщики. Просто покупаем готовые наборчики, роботов — игрушек и всякую дребедень.

Почему не разрабатываем вот это:

Я закончил свои размышления вслух. Давайте мы с вами поговорим о подключении Таймера часов реального времени DS1302 к Arduino.

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

Контроллер Arduino не имеет своих собственных часов. Поэтому в случае необходимости нужно дополнять специальной микросхемой DS1302.

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

LCD часы, сигнализация и таймер с детектором движения на Arduino

Проект, который отлично впишется в интерьер вашего DIY угла, комнаты, гаража или офиса, в котором вы собираете роботов и всякие гиковские автоматизированные проекты на Arduino.

На выходе проекта вы получите в пределах одного модуля следующие фичи:

  • Часы!;
  • Отображение даты и времени на LCD экране;
  • Встроенный счетчик времени (для того, чтобы засекать время, затраченное на один проект);
  • Будильник (чтобы напоминать о том, что вы засиделись и пора устроить себе разминку);
  • Отслеживание движения (сберегает заряд аккумулятора, отключая LCD экран, когда вас нет рядом);
  • Отлично впишется в ваш интерьер Arduino-разработчика!

Необходимые материалы для проекта

  • Arduino Uno;
  • LCD Keypad Shield (LCD шилд с кнопками) для Arduino (в данном случае – от производителя DFRobot)
  • Часы реального времени (RTC) DS1307 (от Adafruit);
  • Закрывающийся бокс (можно найти в радиомагазине или заказать у китайцев);
  • Зуммер (Piezo Buzzer);
  • PIR (Пассивный инфракрасный датчик движения);
  • Проводники мама/мама;
  • Джек 2.1 мм;
  • Переходник для батарейки 9 В 5.5 мм / 2.1 мм;
  • Крона 9 В.

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

Порой модуль часов реального времени (например, от компании Adafruit DS1307), поставляется в виде отдельных компонентов. Сборка не должна вызвать проблем. Тем более, есть отличная инструкция по использованию и сборке модуля часов реального времени. Как правило, батарейка идет в комплектации модуля. Работать от одной батарейки он будет не меньше трех лет.

Коннектор для питания

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

Батарейка (крона) на 9 В просто устанавливается на заднюю часть бокса.

Если вы обратили внимание, в боксе есть еще одно отверстие. Это была первая неудачная попытка. Джек в это отверстие не поместился.

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

Очень рекомендую закупить разноцветные проводники типа мама/мама. Стоят они недорого, а процесс сборки облегчают очень сильно. Подключаем проводники к модулю часов реального времени, ПИР датчику движения, зуммеру, чтобы в дальнейшем подключить их к LCD шилду.

Подключаем все к LCD шилду

На LCD шилде 5 рядов контактов, которые соответствуют пинам 1-5 на плате Arduino. Есть контакт для 5v, GND и сигнал. Эти контакты и использовались для подключения. Для обмена данными с часами реального времени, датчиком и зуммером использовались аналоговые пины на Arduino. Естественно, датчик и часы реального времени подключаются к питанию и земле.

Установка в коробку

Следующий шаг – упаковка нашего чуда в отдельный бокс. Сначала положите в коробку кабели, которые тянутся от LCD шилда.

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

После этого устанавливаем на Arduino наш LCD шилд. Кабели огибают плату с правой стороны (смотрите на фото ниже).

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

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

Часы реального времени на RTC модулях Ардуино DS1302, DS1307, DS3231

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

Модули часов реального времени в проектах Arduino

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

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

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

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

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

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

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

Модуль 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В;
  • GND.

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

Для подключения к плате Ардуино нужны сама плата (в данном случае рассматривается 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. Это связано с тем, что в часах пропадает питание, и отсчет времени прекратится. По этой причине нельзя вытаскивать батарею во время работы модуля.

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

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

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

Считывание времени. Как только модуль настроен, можно отправлять запросы на получение времени. Для этого используется функция 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.

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

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

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

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

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

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

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

Заключение

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

Мир микроконтроллеров

Навигация по записям

Часы реального времени с будильником на основе Arduino

Рассматриваемые в данной статье часы реального времени на основе платы Arduino представляют собой цифровые часы, которые показывают реальное (истинное) время на основе использования RTC IC DS1307 (микросхема часов истинного времени), которая работает по протоколу I2C. Часы реального (истинного) времени означают что они будут работать (считать время) даже если возникнет проблема с электропитанием. Когда подача питания возобновится, часы будут показывать правильное (реальное) время независимо от того сколько времени они были без питания.

В этом проекте мы будем использовать ЖК дисплей 16×2 для отображения значения времени на нем в формате: час, минута, секунда, дата, месяц и год. Также в наш проект часов реального времени добавлена опция будильника – мы можем устанавливать время «пробуждения». Время будильника будет записываться в энергонезависимую память EEPROM платы Arduino, поэтому оно будет сохраняться там даже при отключении питания. Подобные часы реального времени часто используются в наших компьютерах чтобы они могли обновляться в режиме реального времени.

Протокол I2C является способом объединения двух или более устройств в единую систему при помощи двух проводников, поэтому этот протокол также называется двухпроводным протоколом. Его можно использовать для соединения до 127 устройств в единое устройство или процессор. Большинство устройств на основе протокола I2C работает на частоте 100 кГц.

Необходимые шаги для записи данных от ведущего (master) к ведомому (slave) в протоколе I2C (slave receiving mode — режим приема для ведомого):
1. Передать состояние (команду) START к ведомому.
2. Передать адрес ведомого к ведомому устройству.
3. Передать бит (0) к ведомому.
4. Принять бит ACK (подтверждения) от ведомого.
5. Передать адрес слова (words address) ведомому.
6. Принять бит ACK (подтверждения) от ведомого.
7. Передать данные ведомому.
8. Принять бит ACK (подтверждения) от ведомого.
9. Передать команду STOP ведомому.

Шаги для чтения данных от ведомого (slave) к ведущему (master) в протоколе I2C (slave transmitting mode – режим передачи для ведомого):
1. Передать команду START ведомому.
2. Передать адрес ведомого к ведомому устройству.
3. Передать бит чтения (1) к ведомому.
4. Принять бит ACK (подтверждения) от ведомого.
5. Принять данные отведомого.
6. Принять бит ACK (подтверждения) от ведомого.
7. Передать команду STOP ведомому.

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема построена на основе трех главных компонентов: микросхемы DS1307, платы Arduino Pro Mini и ЖК дисплея 16×2.

Плата Arduino используется для чтения времени от ds1307 и отображения его на ЖК дисплее 16×2. Микросхема DS1307 передает время/дату на Arduino используя 2 провода. Звонок (буззер) используется для подачи сигнала будильника. Структурная схема работы устройства приведена на следующем рисунке.

Как можно видеть из представленной схемы, контакты микросхемы DS1307 SDA и SCL соединены с контактами платы Arduino SDA и SCL с помощью подтягивающих резисторов которые поддерживают состояние высокого напряжения на этих линиях. Кварцевый генератор на 32.768 кГц подсоединен к микросхеме DS1307 для генерации точной 1-секундной задержки. Также батарейка на 3 В подсоединена к контакту 3 (BAT) микросхемы DS1307 чтобы обеспечивать подсчет времени во время отключения питания устройства.

ЖК дисплей 16×2 подключен к плате Arduino в 4-битном режиме. Его контакты управления RS, RW и En подключены к контактам Arduino 2, GND и 3. Контакты данных ЖК дисплея D0-D7 подключены к контактам 4, 5, 6, 7 платы Arduino. Звонок (буззер) подключен к контакту 13 Arduino при помощи NPN транзистора BC547 и резистора 1 кОм.

Три кнопки под названиями set, INC и Next используются для установки времени будильника и подключены к контактам 12, 11 и 10 платы Arduino. Когда мы будем нажимать кнопку set, будет включаться режим установки времени срабатывания будильника, в котором можно будет установить это время с помощью кнопок INC и Next.

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

Исходный код программы

Для написания программы часов реального времени с будильником нам необходимо подключить ряд библиотек.

#include
#include
#include
#include

Затем в функции setup необходимо произвести инициализацию RTC (часов реального времени), ЖК дисплея, задать режимы работы ряда контактов.

Остальные необходимые функции, такие как считывание времени, установка времени срабатывания будильника и другие будут выполняться в функции void loop .

Далее представлен полный текст программы.

#include
#include
#include
#include

LiquidCrystal lcd(3, 2, 4, 5, 6, 7);
RTC_DS1307 RTC;
int temp,inc,hours1,minut,add=11;
int next=10;
int INC=11;
int set_mad=12;
#define buzzer 13
int HOUR,MINUT,SECOND;
void setup()
<
Wire.begin();
RTC.begin();
lcd.begin(16,2);
pinMode(INC, INPUT);
pinMode(next, INPUT);
pinMode(set_mad, INPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(next, HIGH);
digitalWrite(set_mad, HIGH);
digitalWrite(INC, HIGH);

lcd.setCursor(0,0);
lcd.print(“Real Time Clock”);
lcd.setCursor(0,1);
lcd.print(“Circuit Digest “);
delay(2000);

void loop()
<
int temp=0,val=1,temp4;
DateTime now = RTC.now();
if(digitalRead(set_mad) == 0) // установка времени будильника
<
lcd.setCursor(0,0);
lcd.print(” Set Alarm “);
delay(2000);
defualt();
time();
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(” Alarm time “);
lcd.setCursor(0,1);
lcd.print(” has been set “);
delay(2000);
>
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Time:”);
lcd.setCursor(6,0);
lcd.print(HOUR=now.hour(),DEC);
lcd.print(“:”);
lcd.print(MINUT=now.minute(),DEC);
lcd.print(“:”);
lcd.print(SECOND=now.second(),DEC);
lcd.setCursor(0,1);
lcd.print(“Date: “);
lcd.print(now.day(),DEC);
lcd.print(“/”);
lcd.print(now.month(),DEC);
lcd.print(“/”);
lcd.print(now.year(),DEC);
match();
delay(200);
>
void defualt()
<
lcd.setCursor(0,1);
lcd.print(HOUR);
lcd.print(“:”);
lcd.print(MINUT);
lcd.print(“:”);
lcd.print(SECOND);
>
/* функция для установки времени будильника и его загрузки в память eeprom*/
void time()
<
int temp=1,minuts=0,hours=0,seconds=0;
while(temp==1)
<
if(digitalRead(INC)==0)
<
HOUR++;
if(HOUR==24)
<
HOUR=0;
>
while(digitalRead(INC)==0);
>
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Set Alarm Time “);
//lcd.print(x);
lcd.setCursor(0,1);
lcd.print(HOUR);
lcd.print(“:”);
lcd.print(MINUT);
lcd.print(“:”);
lcd.print(SECOND);
delay(100);
if(digitalRead(next)==0)
<
hours1=HOUR;
EEPROM.write(add++,hours1);
temp=2;
while(digitalRead(next)==0);
>
>

while(temp==2)
<
if(digitalRead(INC)==0)
<
MINUT++;
if(MINUT==60)

while(digitalRead(INC)==0);
>
// lcd.clear();
lcd.setCursor(0,1);
lcd.print(HOUR);
lcd.print(“:”);
lcd.print(MINUT);
lcd.print(“:”);
lcd.print(SECOND);
delay(100);
if(digitalRead(next)==0)
<
minut=MINUT;
EEPROM.write(add++, minut);
temp=0;
while(digitalRead(next)==0);
>
>
delay(1000);
>
/* Function to chack medication time – функция чтобы прервать ваш сон*/
void match()
<
int tem[17];
for(int i=11;i

Видео, демонстрирующее работу схемы

Как подключить часы реального времени (RTC) к Arduino

  • Arduino UNO или иная совместимая плата;
  • модуль ZS-042 с часами реального времени DS3231;
  • модуль с часами реального времени DS1307;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1 Подключение к Arduino модуля ZS-042 с часами реального времени DS3231

Модуль ZS-042 с часами реального времени (RTC ) имеет следующие характеристики:

  • Календарь до 2100 года с отсчётами секунд, минут, часов, числа месяца, месяца, дня недели и года (с учётом високосных годов);
  • 12- или 24-часовой формат;
  • 2 будильника;
  • напряжение питания: 3,3 или 5 В;
  • точность: ± 0.432 сек в день;
  • внутренний кварцевый генератор с частотой 32768 Гц;
  • поддерживаемый протокол: I2C со скоростью от 100 до 400 кГц;
  • габариты: 38×22×15 мм;
  • диапазон рабочих температур −40…+85°C.

На модуле присутствуют: микросхема таймера реального времени DS3231 (1 на рисунке), микросхема памяти AT24C32 объёмом 32 кбит (2 на рисунке), места для трёх перемычек A0, A1 и A2 (3 на рисунке), с помощью которых можно менять адресацию памяти микросхемы памяти; место для батареи питания размером 2032 (4 на рисунке).

Внешний вид модуля ZS-042

Назначение выводов модуля такое:

С противоположной стороны модуля выводы SCL, SDA, питание и земля дублируются. На выходе 32K постоянно присутствует сигнал с встроенного кварцевого генератора:

Сигнал на выходе 32K модуля ZS-042

Теперь нужно подключить модуль к Arduino. Мы уже знаем, что линия SDA нужно подключать к пину A4 Arduino UNO и Nano, а линию SCL – к пину A5. Для питания возьмём выход 5V платы Arduino, землю модуля соединим с землёй Arduino.

Схема подключения модуля ZS-042 с таймером DS3231 к Arduino

Вот как это выглядит вживую:

Модуль ZS-042 с таймером DS3231 подключён к Arduino

Рассмотрим диаграммы записи и чтения для таймера реального времени DS3231:

Обзор передачи данных по последовательной шине I2C Диаграмма записи и диаграмма чтения таймера реального времени DS3231

Как видно, тут всё стандартно для интерфейса I2C. Осталось только узнать, какие регистры за что отвечают, и мы будем готовы начать обмен данными с таймером DS3231. А вот и карта регистров:

Карта регистров таймера реального времени DS3231

Первым делом нужно выставить дату и время. А затем нужно будет только читать значение времени и календаря. Расширенные функции – установка будильников и т.д. – всё это делается аналогично, поэтому останавливаться на этом не будем. Итак, чтобы выставить дату и время, нас интересуют регистры 0x00…0x06. Для записи значений в них, нужно послать команду записи, указать начальный адрес (0x00), а дальше – 7 байтов, сформированных для нужной даты и времени. Например, чтобы записать дату 02 января 2019 года, среда, и время 17 час 30 мин 02 сек, нужно отправить ведомому устройству с I2C адресом 0x68 массив: 00 02 30 17 03 02 01 19. Скетч, который реализует это, будет таким:

Вот как выглядит диаграмма записи этого массива в память таймера реального времени DS3231:

Диаграмма выставления времени на RTC DS3231

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

Скетч для чтения времени с часов DS3231 (разворачивается)

Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00. Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций, и возвращаемые данные будут совсем не те, что мы ожидаем.

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

Вывод даты и времени в монитор последовательного порта

А вот так выглядит временная диаграмма, порождаемая работой этого скетча:

Временная диаграмма чтения регистров времени DS3231

Напоследок давайте немного усложним нашу программу и будем читать также значение температуры:

Скетч для чтения времени и температуры с часов DS3231 (разворачивается)

Вот как теперь выглядит вывод нашей программы:

Вывод даты, времени и температуры в монитор последовательного порта

Само собой, в интернете полно библиотек для Arduino, которые упрощают работу с часами реального времени DS3231 и модулем ZS-042 в частности. Они делают всю рутинную работу, и вам не нужно будет разбираться с картой регистров и проводить манипуляции с перестановкой полученных байтов, чтобы получить удобочитаемое значение времени. В конце статьи дана ссылка на скачивание архива, в котором лежат несколько библиотек для работы с часами реального времени DS3231 и DS1307.

2 Подключение к Arduino модуля с часами реального времени DS1307

Таймер DS1307 в отличие от DS3231 проще по функциональности: он имеет меньше регистров, не имеет встроенного датчика температуры и встроенного генератора тактовой частоты. Не имеет он также и функции будильника. Шина I2C функционирует только на частоте 100 кГц. Модуль с часами реального времени DS1307 может выглядеть вот так:

Внешний вид модуля с часами реального времени DS1307

Здесь номером 1 обозначена микросхема собственно таймера DS1307, номер 2 – микросхема памяти AT24C32 объёмом 32 кбит, 3 – кварцевый резонатор с частотой 32,768 кГц, 4 – держатель для батареи типа 2032. Схема датчика приведена на рисунке:

Схема часов реального времени на датчике DS1307. Изображение с сайта easyelectronics.ru

На модуле имеются две группы контактов: P1 и P2. Группа P2 имеет стандартные выводы для шины I2C, плюс дополнительный вывод DS, к которому можно подключить внешний датчик температуры DS18B20. Группа P1 имеет большее число контактов:

голоса
Рейтинг статьи
Читать еще:  Ли телефоне zte черный список. Создаём личный «Чёрный список» за несколько кликов: самые простые и эффективные способы избавиться от назойливых контактов. Блокировка через интегрированную функцию «Чёрный список»
Ссылка на основную публикацию
Статьи c упоминанием слов: