Ардуино будильник: делаем своими руками на основе rtc ds3231

Делаем самостоятельно будильник на Arduino

Узнаем как реализовать на основе Arduino будильник с помощью модуля RTC DS3231.

В этой статье мы собираемся сделать Ардуино будильник, в котором мы будем использовать модуль RTC DS3231, чтобы получить текущее время и дату, а OLED покажет это время и дату.

Мы будем использовать библиотеку EEPROM для хранения времени будильника, которое мы будем вводить, используя модуль клавиатуры 4X4.

Когда новое введенное время будильника будет соответствовать текущему времени будильника, тогда зуммер начнет подавать звуковой сигнал, пока мы не удержим клавишу “C” на клавиатуре. Клавиша “#” будет использоваться для изменения пароля.

Шаг 1. Требуемые компоненты

Необходимыми компонентами для устройства будильника Arduino являются:

  • Arduino Uno
  • 128X32 Монохромный OLED дисплей
  • Модуль RTC DS3231
  • 4X4 клавиатура
  • 9В аккумулятор или батарея
  • Зуммер
  • Переключатель
  • Соединительные провода

Шаг 2. Схема соединения

Принципиальная схема устройства будильника Arduino достаточно большая. Прежде всего, подключите OLED к Arduino. Соединения для OLED с Arduino следующие:

  • CS-выход OLED на пин 10 Arduino
  • DC-вывод OLED на пин 9 Arduino
  • RST вывод OLED на вывод 8 Arduino
  • D1 или CLK вывод OLED на вывод 11 Arduino
  • D0 или DIN-штырь OLED на вывод 13 Arduino

Затем подключите модуль DS3231 к Arduino. Соединения следующие:

  • Подключите GND DS3231 к GND Arduino.
  • Подключите VCC DS3231 к 5V Arduino.
  • Подключите SDA DS3231 к A4 Arduino.
  • Подключите SCL DS3231 к A5 Arduino.

После этого подключите клавиатуру 4X4 к Arduino. Подключите первые 4 контакта клавиатуры, строка A0, A1, A2, A3 и последние четыре, которые относятся к контактам столбца к 6, 5, 4 и 3.

Подключите положительный контакт зуммера к контакту 7 Arduino и отрицательный сигнал зуммера к GND Arduino.

В конце, подключите положительный провод батареи к одному концу переключателя, а другой конец переключателя – к Vin Arduino.

Затем подключите отрицательный провод батареи к заземлению Arduino.

Шаг 3. Код для Ардуино бдильника

Сам код можно скачать или скопировать ниже. Дальше будет объяснение кода и ссылки на скачивание нужных библиотек.

Первым делом мы включили библиотеки для клавиатуры, DS3231 RTC и OLED. Библиотека EEPROM, которую мы включили, поможет нам сохранить время будильника. OLED работает с Arduino через связь SPI, поэтому мы включили библиотеку SPI. Аналогично, мы включили библиотеку «Wire» для DS3231, потому что DS3231 работает с Arduino через связь I2C, а библиотека «Wire» предназначена для связи I2C.

В приведенной ниже части кода мы определили контакты для DS3231, зуммера и OLED. Затем мы инициализировали некоторые переменные, которые помогут нам хранить некоторые данные. После этого мы определили контакты для клавиатуры 4X4.

В функции настройки (setup) мы запустили связь «wire» и «rtc». Затем мы объявили пин зуммера в качестве выхода и назвали функцию «welcome», которая напечатает «Добро пожаловать» на OLED.

В функции цикла (loop) мы получаем время и дату из модуля RTC DS3231 и сохраняем их в переменных. Затем мы ищем, нажата ли какая-либо клавиша или нет.

Если нажата клавиша «C», она выключит зуммер и изменит минуты на 60, что остановит будильник от включения на следующий день. Если нажата кнопка «#», она запросит новое время будильника.

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

Следующая функция Ардуино будильника сохранит время сигнала, введенное вами в переменную, чтобы мы могли сравнить ее с текущим временем.

Функция ниже отображает текущее время, текущую дату и время сигнала на OLED.

Перед загрузкой кода загрузите библиотеки из приведенных ниже ссылок.

Итоговый результат

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

На этом пока всё. Желаем вам новых классных идей и устройств.

DS3231 RTC Arduino

Ещё один интересный модуль для Arduino ZS-042 – это модуль часов Модуль RTC (Real Time Clock – часы реального времени) DS3231 с интерфейсом I2C(TWI).
Для микросхемы не нужен внешний кварцевый резонатор, благодаря встроенному термокомпенсированному кварцевому генератору (TCXO) с частотой 32,768 кГц.
У микросхемы есть вход для подключения батарейки, и благодаря питанию от батареи поддерживается точный отсчет времени даже когда питание системы отключается.
Интеграция кварцевого резонатора в корпус микросхемы улучшило стабильность точности хода часов.

Модуль DS3231 RTC Arduino собран на микросхеме DS3231 и модуле памяти EEPROM на микросхеме 24C32 объемом 32 Кбит от производителя Atmel. Может работать как совместно с Arduino, так и отдельно (необходима батарейка CR2032).

Связь модуля с Arduino происходит по сетевому последовательному интерфейсу I2C(Inter-IntegratedCircuit) с максимальной скоростью 400 кГц, разработанному фирмой Philips.
Для питания часов и памяти модуля в автономном режиме необходима батарейка CR2032.
Модуль отслеживает состояние VCC для обнаружения сбоев питания и при необходимости автоматически переключается на резервный источник питания.
Модуль позволяет устанавливать и считывать: секунды, минуты, часы, дни, дни недели, месяц, год, а так же температуру и есть возможность установки 2-х будильников.
Что может модуль DS3231 RTC Arduino
• Установить календарь до 2100 года с учётом високосных лет
• Выбор режимов 12(AM/PM) или 24-часового режима
• Возможность настроить 2 будильника
• Использовать в качестве генератора прямоугольных импульсов
• Измерять температуру микросхемы для температурной компенсацией кварцевого генератора (TCXO). Она практически не нагревается поэтому можно сказать, что она равна температуре окружающей среды

Характеристики
• Микросхема: DS3231
• Рабочее напряжение: 3,3 В – 5 В.
• Потребляемый ток (в режиме ожидания): до 170 мкА.
• Потребляемый ток (во время передачи данных): до 300 мкА.
• Потребляемый ток (во время резервного питания, без передачи данных): до 3,5 мкА.
• Тактовая частота шины I2C: до 400 кГц.
• Рабочая температура: 0 . 70 °C.
• Точность хода: ±2 ppm (примерно ± 1 минута в год) при температуре от 0 до 40С
• внутренний термометр с диапазоном от −40…+85°C.
• Размер: мм 38 мм (длина) мм * 22 мм (Ш) мм * 14 мм (высота)
• Вес: 8 г

ppm(partspermillion) – частей на миллион.

На основе этого модуля DS3231 можно построить
Часы, будильник, секундомер, генератор прямоугольных импульсов, термометр, включать/выключать внешние устройства по расписанию
На модуле выведена гребёнка контактов. Для удобного использования контакты расположены с двух сторон платы.

Теперь немного о самом модуле.
построен он на микросхеме DS3231N.
Резисторная сборка RP1 (4.7 кОм),

необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях).
Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N.
Резистор R5 и диод D1, служат для подзарядки батареи.
Микросхема памяти EEPROM AT24C32N .
Резистор R1 и светодиод Power, работают как индикатор, показывая, что модуль включен.
Модуль DS3231 RTC Arduino связывается с Arduino по шине I2C(TWI), для удобства монтажа они выведены с двух сторон модуля, J1 и J2.

Питание DS3231 RTC Arduino
Если модуль питается от платы Arduino, то он не использует батарею на модуле.
При питании от батарейки модуль отслеживает дату и время, но не работает с шиной I2C.
При отсутствии обоих источников питания модуль прекращает работать и сбрасывает все данные в заводские настройки.
С резервной батарейкой часы способны проработать несколько лет.

Группы контактов – J1
• 32K: выход генератора, частота 32 кГц
• SQW: Выход прямоугольного(Square-Wave) сигнала.
• SCL: Serial CLock – шина тактовых импульсов интерфейса I2C
• SDA: Serial Data – шина данных интерфейса I2C;
• VCC: «+» питание модуля
• GND: «-» питание модуля

Группы контактов – J2
• SCL: линия тактирования (Serial CLock)
• SDA: линия данных (Serial Data)
• VCC: «+» питание модуля
• GND: «-» питание модуля

Подключение модуля DS3231 RTC Arduino к шине I2C
(например, для Arduino UNO, Nano, Pro Mini):
SCL → A5
SDA → A4
VCC → +5 В
GND → земля
Подключение происходит по двухпроводной шине I2C(TWI)
Выводы SDA и SCL подключаются к аналогичным выводам на Arduino Питание VCC к +5 Вольт, а GND к GND на плате Arduino

Пины SDA и SCL на разных платах Arduino:
SDA SCL
UNO A4 A5
Mini A4 A5
Nano A4 A5
Mega2560 20 21
Leonardo 2 3

Для работы необходимо установить библиотеку DS3231

После установки откройте пример из библиотеки

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

Загрузите скетч в плату, после чего откройте монитор последовательного порта (Ctrl+Shift+M).
Вы увидите неправильные данные, но не переживайте – это потому, что для работы надо установить календарь и время самостоятельно. Это делается один раз, при включении. И потребуется ещё раз только если разрядится батарея.

Ну вот и всё. DS3231 RTC Arduino очень простой и интересный модуль.

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

Подписывайтесь и не пропустите новые интересные статьи и описания различных модулей.

Часы реального времени на 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

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

Название Частота Точность Поддерживаемые протоколы
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В;
  • 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-карту или показывая время на экране дисплея. В этой статье мы рассмотрели типичные сценарии использования и варианты подключения наиболее популярных видов модулей.

Подключение часов реального времени( DS3231) к Arduino.

Одной из самых известных микросхем RTC (RealTimeClock) является наверное DS1307 от Dallas Semiconductors. Эти часы достаточно точные, братья Китайци сделали целую кучу готовых модулей. Они просты в понимании и подключение. Приступим.

Характеристики :

  • Напряжение питания: 3.3В и 5В.
  • Чип памяти: AT24C32 (32 Кб).
  • Точность: ± 0.432 сек в день .
  • Частота кварца:32.768 кГц.
  • Поддерживаемый протокол: I2C.

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

Выводы :
  • 32K: выход, частота 32 кГц.
  • SQW: выход.
  • SCL: линия тактирования (Serial CLock) .
  • SDA: линия данных (Serial Data).
  • VCC: «+» питание модуля.
  • GND: «-» питание модуля.
Подключение :

Часы подключаются по двухпроводной шине IIC (Inter-IntegratedCircuit) через выводы SDA и SCL к SDA и SCL Arduino соответственно. Также необходимо подключить питание +5В и GND. Остальные выводы специфичны для DS3231 и не поддерживаются библиотеками для DS1307, да и не часто используются.

На Arduino Nano это будут SDA — D4(7 pin), SCL- D5(8 pin).

Кодинг :

Для начала нам потребуется две библиотеке DS1307 RTC и TimeLib. Скачать их можно например отсюда. Так же мы будем использовать TFT дисплей. Как его подключить написано тут.

// библиотека для работы.
#include // Библиотека дисплея.
#include
#include // Библиотека часов.
#include // Библиотека IIC (Inter-IntegratedCircuit).
#include //Библиотека часов.

// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS
UTFT myGLCD(TFT01_22SP, 9, 8, 12, 11, 10);

// объявления встроенных шрифтов
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
String floatToString(float x, byte precision = 0) // Функция преобразования
<
char tmp[50];
dtostrf(x, 0, precision, tmp);
return String(tmp);
>
void setup()
<
setSyncProvider(RTC.get);
//Устанавливаем нужное время в формате: Часы, минуты, секунды, день, месяц, год
setTime(11,32,0,01,4,2016);
//Применяем значение:
RTC.set(now());
myGLCD.InitLCD(1); // инициализируем дисплей с горизонтальной ориентацией
>

void loop()
<
// очищаем экран
myGLCD.clrScr();
myGLCD.setFont(BigFont);// Выбираем шрифт.
myGLCD.setColor(VGA_RED); //Задаем цвет.
myGLCD.print( floatToString(hour()) , 100, 215); //Выводим на экран часы
myGLCD.print( floatToString(minute()) , 150, 215); // Минуты
myGLCD.print( floatToString(second()) , 200, 215); // Секунды

// ждём 1 секунду
delay(1000);
>

Более подробно про библиотеку TimeLib можно прочитать тут. Успехов.

Источники:

http://arduino-kid.ru/ds3231_rtc_arduino

http://arduinomaster.ru/datchiki-arduino/arduino-chasy-rtc-ds1307-ds1302-ds3231/

http://xn--90aeniddllys.xn--p1ai/podklyuchenie-chasov-realnogo-vremeni-ds3231-k-arduino/

http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D0%BC%D0%B8%D0%B3%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B2%D0%B5%D1%82%D0%BE%D0%B4%D0%B8%D0%BE%D0%B4%D0%BE%D0%BC/

Ссылка на основную публикацию