Цифровые часы Arduino
Спроектировать и собрать электронные часы не так просто, как может показаться на первый взгляд.
Помимо подключения энергонезависимого модуля часов реального времени, необходимо продумать как задавать текущее время. В нашем примере часы и минуты настраиваются с помощью четырёхкнопочного модуля: верхний ряд добавляет значения, нижний — уменьшает.
Что потребуется
Полный сет компонентов проекта. В сет входят:
Видеоинструкция
Как собрать
Установите Troyka Slot Shield на Iskra Neo
Возьмите часы реального времени и вставьте в средний верхний слот. Вставьте батарейку CR1225 в держатель на лицевой панели модуля.
Переверните Quad Display на 180 градусов и вставьте в центральный и правый слоты нижнего ряда.
Поверните четырёхкнопочную клавиатуру на 90 градусов против часовой стрелки и вставьте в правый верхний слот.
Если у вас старый модуль семисегментного индикатора (у него всего три ноги и расположены они слева), схема сборки устройства, скетч и библиотеки будут отличаться. Мы выложили их ниже, в ответах на часто задаваемые вопросы .
Скетч
Прошейте контроллер скетчем через Arduino IDE.
Что дальше?
Хотите собрать другой девайс? Выберите своё будущее устройство из списка проектов на Slot Shield.
OLED часы на arduino
На днях я решил создать часы на arduino с отображением времени, текущей даты, дня недели и температуры воздуха на OLED дисплее. Что из этого получилось смотрите на видео.
Список необходимых компонентов:
- Часовой модуль DS1307 – 1 шт.
- Датчик температуры DS18B20 – 1 шт.
- OLED I2C дисплей 0.96″ – 1 шт. – 1 шт.
- DS1307
- OneWire
- OLED I2C RUS

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

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

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

Для тех, кому было лень править скетч, ниже есть готовый скетч.
Ну а теперь, еще более усовершенствуем наши OLED часы и добавим к ним отображение температуры, которую мы будем считывать с датчика температуры DS18B20.
Для отображения рисунка с градусником на OLED дисплее и значка градуса выберем картинку с рисунком градусника и с помощью графического редактора сохраним ее в формате GIF с именем term.gif, и тоже самое проделаем с картинкой с значком градуса — сохраним ее как grad.gif.
У меня картинка term.bmp имеет размеры 19×40 пикселей, а картинка grad.bmp 13×12 пикселей. Потом нам потребуется конвертировать две картинки с помощью онлайн-сервиса www.rinkydinkelectronics.com

выбираем наш файл изображения и жмем Make File

Жмем на Click here to download your file и сохраняем файл grad.c в папку с нашим скетчем, тоже самое проделываем с другим изображением. Сохраняем и закрываем скетч. При повторном открытии он будет иметь еще две вкладки с файлами изображений.

После этого добавим две строки в скетч, которые инициализируют наши файлы изображений
а потом отобразим наши изображения на экране OLED дисплея, добавив строки
Добавим в наш скетч на два цикла. В первом цикле у нас будет отображаться время – назовем его void watch(); Второй цикл будет считывать и отображать температуру void temp();
А в основном цикле void loop(); пропишем для ротации циклов несколько строчек кода
В цикле void temp(); пропишем кусочек кода для считывания и отображения температуры
В цикле void watch(); пропишем наш код, который отвечает за отображение времени
После заливки скетча, наши OLED часы сначала должны отображать время, а потом температуру как на видео в начале статьи.
Часы на Arduino и 4-х разрядном семисегментном индикаторе
В настоящее время во встраиваемой электронике (и не только) достаточно широкое применение находят часы на семисегментных дисплеях (индикаторах). Ранее на нашем сайте мы уже рассматривали подключение семисегментного дисплея к плате Arduino Uno, также у нас представлены проекты различных часов на основе Arduino:

В этой же статье мы рассмотрим создание часов на основе платы Arduino и четырех семисегментных дисплеях. Управление семисегментными дисплеями мы будем осуществлять с помощью технологии мультиплексирования.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- 4-х разрядный семисегментный дисплей (индикатор) (4-Digit 7 Segment Display) (купить на AliExpress).
- Микросхема 74HC595 (регистр сдвига) (купить на AliExpress).
- Модуль часов реального времени DS3231 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
4-х разрядный семисегментный дисплей (4-Digit 7 Segment Display)

4-х разрядный семисегментный дисплей состоит из четырех семисегментных дисплеев, объединенных в единое устройство. Иногда говорят, что эти дисплеи “мультиплексированы вместе”, поэтому для управления ими можно использовать технологию мультиплексирования. Этот дисплей можно использовать для отображения цифр, а также некоторых букв. Дисплей можно использовать в обоих направлениях. 4 символа удобно использовать для изготовления электронных часов или счетчика от 0 до 9999.

На следующем рисунке показана внутренняя схема соединений 4-х разрядного семисегментного дисплея.

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

В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).
На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:
Использование технологии мультиплексирования
Так каким образом мы можем на подобном 4-х символьном семисегментном дисплее отобразить, к примеру, число 1234? Это возможно сделать с использованием технологии мультиплексирования. Смысл этой технологии достаточно прост – в каждый момент времени мы отображаем только один символ (из 4-х возможных) на данном дисплее. Переключение между отображением всех 4-х символов происходит достаточно быстро – поэтому человеческий глаз воспринимает их непрерывно горящими.
Регистр сдвига 74HC595
Микросхема 74HC595 представляет собой 8-битовый регистр сдвига, работающий по принципу Serial IN – Parallel OUT (последовательный вход – параллельный выход). То есть данный регистр сдвига принимает входные данные последовательно и обеспечивает параллельный вывод этих данных на своих 8 контактах. С его помощью можно значительно уменьшить количество используемых контактов микроконтроллера (в нашем случае платы Arduino). Более подробно о подключении регистра сдвига 74HC595 к платы Arduino можно прочитать в этой статье.

Микросхема 74HC595 использует 3 контакта (Clock, Data & Latch) для подключения к микроконтроллеру и позволяет контролировать 8 своих выходных контактов. Контакт Clock используется для непрерывной подачи синхронизирующих импульсов, а контакт Data предназначен для подачи на него необходимых данных. Регистр сдвига 74HC595 работает по интерфейсу SPI, подробную информацию по использованию данного интерфейса в платах Arduino вы можете почерпнуть в этой статье. Назначение контактов микросхемы 74HC595 приведено на следующих двух рисунках.

Расшифровка обозначений контактов регистра сдвига74HC595 на русском языке выглядит следующим образом.
Q0-Q7 – восемь параллельных выходов общего назначения. Данные выходы нужны для того, чтобы мы могли как-то воспользоваться пришедшими данными по SPI – подключить линейку светодиодов, либо сегменты какого-то индикатора, либо дешифратор и т.д.
VCC – напряжение питания.
GND – общий провод.
Q7′ – последовательный выход данных. По сути — это MISO.
DS – последовательный вход данных или MOSI.
MR – это master reset. Сбрасывает все выходы в 0. Для нормального функционирования регистра сдвига на нем должна быть логическая 1.
SH_CP – в нашем случае это будет chip select.
ST_CP – это контакт управления регистром хранения, в нашем случае это будет контакт синхронизации, на который необходимо подавать тактовые импульсы. Но Arduino будет делать для нас это автоматически при использовании соответствующей команды.
OE – задействования выхода. При отрицательном значении последовательный выход включен, при положительном – выключен.
Модуль часов реального времени DS3231
Внешний вид данного модуля представлен на следующем рисунке.

Модуль предназначен для хранения времени и даты даже когда общее питание схемы выключено – для этой цели в его состав входит элемент питания CR2032. В состав модуля DS3231 входит также датчик температуры, поэтому его можно использовать в различных встраиваемых устройствах, например, в цифровых часах с индикатором температуры и т.д. Модуль работает по интерфейсу I2C. На нашем сайте вы можете посмотреть следующие проекты с использованием данного модуля:
Назначение контактов (распиновка) модуля DS3231 приведена в следующей таблице.
| Наименование контакта | Назначение контакта |
| VCC | напряжение питания |
| GND | общий провод (земля) |
| SDA | контакт последовательной передачи данных (I2C) |
| SCL | контакт синхронизации (тактирования) (I2C) |
| SQW | выход прямоугольного сигнала (программируемый меандр) |
| 32K | выход меандра с частотой 32.768кГц |
Теперь перейдем непосредственно к схеме нашего проекта.
Схема проекта
Схема часов на Arduino и 4-х разрядном семисегментном индикаторе представлена на следующем рисунке.

В следующей таблице представлены необходимые соединения между модулем часов реального времени и платой Arduino Uno.
| DS3231 | Arduino Uno |
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595 и платой Arduino Uno.
| Регистр сдвига 74HC595 | Arduino Uno |
| 11-SH_CP (SRCLK) | 6 |
| 12-ST_CP (RCLK) | 5 |
| 14-DS (Data) | 4 |
| 13-OE(Latch) | GND |
| 8-GND | GND |
| 10-MR(SRCLR) | +5V |
| 16-VCC | +5V |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595, 4-х разрядным семисегментным дисплей и платой Arduino Uno.
| 4-х разрядный семисегментный дисплей | Регистр сдвига 74HC595 | Arduino Uno |
| A | Q0 | — |
| B | Q1 | — |
| C | Q2 | — |
| D | Q3 | — |
| E | Q4 | — |
| F | Q5 | — |
| G | Q6 | — |
| D1 | — | 10 |
| D2 | — | 11 |
| D3 | — | 12 |
| D4 | — | 9 |
Внешний вид собранной конструкции проекта показан на следующем рисунке.

Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу проекта, приведены в конце статьи. Здесь же мы рассмотрим основные фрагменты кода программы.
В программе мы должны считывать время (часы и минуты в 24-часовом формате) с модуля часов реального времени и конвертировать их в формат для отображения на 4-х символьном семисегментном дисплее.
Для подключения модуля часов реального времени DS3231 к плате Arduino используется шина I2C. Для работы с данным модулем (считывания даты, времени, температуры и т.д.) мы в программе будем использовать библиотеку <DS3231.h>. Скачайте ее по следующей ссылке — DS3231 RTC module Arduino Library. Поскольку мы используем интерфейс I2C нам в программе необходимо будет подключить и библиотеку <wire.h>.
В нашем проекте часы и минуты считываются с модуля часов реального времени и они потом объединяются вместе, например, 0930 – это будет 09:30 pm. Затем мы выделяем индивидуальные цифры из этого считанного числа. Далее эти индивидуальные цифры преобразуются в двоичный формат и передаются на регистр сдвига, а с него на семисегментный дисплей. Для отображения всех четырех символов мы используем технологию мультиплексирования – то есть в каждый момент времени мы отображаем только один символ, но переключение между символами происходит с высокой частотой, поэтому человеческий глаз этого не замечает.
Часы на Ардуино без модуля RTC на LCD 1602

Часы на Ардуино без модуля часов реального времени RTC с выводом информации на дисплей LCD 1602 i2c — в этом проекте предусмотрена настройка времени (часов и минут) и время включения будильника. Для этого использованы две тактовые кнопки (для переключения режимов настройки) и пьезодинамик ардуино для звукового сигнала. Проект содержит схему сборки устройства, а также рабочий код.
Часы на Ардуино без модуля реального времени
Для этого проекта потребуется минимум деталей: дисплей 1602 с модулем i2c (можно подключить дисплей без i2c при желании), две тактовые кнопки и пьезодинамик. Кнопки подключаются к пинам микроконтроллера Arduino, сконфигурированных в режиме INPUT_PULLUP — при таком способе подключения можно считывать количество нажатий на кнопку, а при сборке не потребуются резисторы и ds1302.
Для этого проекта потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- экран LCD 16×02 i2c;
- 2 тактовые кнопки;
- пьезодинамик;
- макетная плата;
- провода «папа-мама», «папа-папа».

Схема сборки часов на Arduino без использования модуля RTC ds1302
Если вы используете Arduino Mega, то на этой плате порты SDA и SCL для подключения дисплея расположены на 20 и 21 пине. У платы Arduino Nano распиновка такая же, как на Uno и LCD 1602 подключается к пинам A4 (SDA) и A5 (SCL). Будильник будет пищать в течении 1 минуты, чтобы его выключить можно нажать на кнопку, подключенную к 8 порту. После сборки электрической схемы загрузите в плату следующую программу.
Скетч. Часы на LCD 16×02 без модуля RTC
Пояснения к коду:
- переменные c1 и c2 отвечают за позицию курсора при выводе времени и минут на экране, в зависимости от того — двухзначное или однозначное число хранится в переменной (это сделано для удобства вывода информации);
- во время настройки часов и будильника, таймер останавливается.
Заключение. Часы без модуля RTC ds1302 будут сбрасывать время на начальные значения при отключении питания, поэтому в проект были добавлены кнопки. С помощью них можно настроить часы, без необходимости повторной загрузки скетча — получился простой проект на Ардуино для начинающих программировать. Также можно добавить датчик DHT11 или BMP180, чтобы выводить на экране температуру.
