Как сделать часы из дисплея

Обновлено: 03.07.2024

Мы решили собрать большое руководство о том, как сделать часы на Ардуино, где расскажем о нескольких вариантах реализации такого проекта. Ранее мы уже делали электронные часы на основе этой платы.

Часы на Ардуино на основе ЖК-дисплея и часов реального времени

Цель первого урока показать, как сделать простые часы на основе Arduino с использованием ЖК-дисплея и часов реального времени.


Комплектующие

Для первого урока этого большого руководства нам понадобятся следующие комплектующие для наших часов на Ардуино:

    и Genuino UNO
  • PCF8563 (часы реального времени)
  • Кристалл 32 кГц
  • 10К потенциометры
  • Резистор 10k 1/4w
  • Резистор 220 Ом
  • LCD 16x2
  • Макет с набором проводов

В этом уроке будут использованы ЖК-дисплей и часы реального времени. Если вы хотите знать больше теме взаимодействия Arduino и ЖК-дисплеев - изучите уроки, которые мы публиковали ранее на нашем сайте.

Схема соединения

Схема очень проста. PCF8563 связывается с Arduino с помощью TWI, и когда данные принимаются, ЖК-дисплей обновляется, показывая новое время.


Установка даты и времени

Чтобы установить дату и время, используйте следующий скетч:

Код проекта

Теперь вы сможете использовать свои часы, загрузив этот скетч на Arduino:

Часы с выводом на экран Nokia 5110

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

В этом уроке используются лишь несколько компонентов - только перемычки, Arduino и дисплей Nokia 5110/3110.


Комплектующие

Детали, используемые в этом проекте ниже.

Оборудование

  • Arduino UNO и Genuino UNO × 1
  • Adafruit дисплей Nokia 5110 × 1
  • Соединительные провода (универсальные) × 1
  • Резистор 221 Ом × 1

Программное обеспечение

Схема соединения


Соединяем детали часов на Ардуино как на схеме выше:

  • контакт pin 3 - последовательный тактовый выход (SCLK) // pin 3 - Serial clock out (SCLK)
  • контакт pin 4 - выход серийных данных (DIN) // pin 4 - Serial date out (DIN)
  • контакт pin 5 - дата / выбор команды (D / C) // pin 5 - date/Command select (D/C)
  • контакт pin 6 - выбор ЖК-чипа (CS / CE) // pin 6 - LCD chip select (CS/CE)
  • контакт pin 7 - сброс ЖК (RST) // pin 7 - LCD reset (RST)

Код урока

Код второй версии часов вы можете скачать или скопировать ниже.

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

Эти часы сделаны с использованием платы Arduino Uno, датчика AM2302, модуля RTC DS3231 и TFT-дисплей 1,8" с ST7735.


Комплектующие

Компоненты, используемые в третьей версии часов на Ардуино перечислены ниже.

Компоненты оборудования

  • Arduino UNO и Genuino UNO × 1
  • Часы реального времени (RTC) × 1
  • Датчик температуры DHT22 × 1
  • Кнопочный переключатель 12мм
  • SparkFun Кнопочный переключатель 12 мм × 4
  • Соединительные провода (универсальные) × 1
  • Макет (универсальный) × 1
  • Adafruit ST7735 1,8 "дисплей × 1

Программное обеспечение


Схема соединения

Соедините все детали часов согласно схеме ниже.


Код урока

Скачайте или скопируйте код часов для Ардуино ниже и загрузите на плату используя Arduino IDE.

Важно! Не забудьте установить нужные библиотеки перед использованием кода для платы, которые вы можете скачать из нашего раздела Библиотеки.

Часы без RTC

Для начала мы должны понимать, что такое RTC. Из Википедии:

Часы реального времени (ЧРВ, RTC — англ. Real Time Clock ) — электронная схема, предназначенная для учёта хронометрических данных (текущее время, дата, день недели и др.), представляет собой систему из автономного источника питания и учитывающего устройства. Чаще всего часы реального времени встречаются в вычислительных машинах, хотя на самом деле ЧРВ присутствуют практически во всех электронных устройствах, которые должны хранить время.

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

Комплектующие

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

  • Arduino Uno плата
  • Кнопки 3 шт.
  • Потенциометр
  • Модуль LCD 1602
  • Модуль температуры и влажности DHT11
  • Макетная плата
  • Перемычки

Схема соединения

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


Вы можете скопировать или скачать код часов на Ардуино ниже.

На этом пока всё. Мы постарались описать все основные варианты реализации часов на Ардуино.


Давно хотел сделать электронные часы на диодной ленте, и вот как-то наткнулся в инете на статью и сразу захотел реализовать — подкупила относительная простота и малое количество проводов — накосячить будет сложно.
Там же, в статье, указаны необходимые компоненты с ссылками на алиэкспресс, по которым я все сразу и заказал и стал изучать тему в ожидании посылки. Как оказалось, слегка поторопился, некоторые элементы можно было заменить, об этом ниже, в недочетах
Компоненты электроники:
— Диодная лента на микросхемах ws2811 (RGB, питание 12в) 5 метров — 700 рублей;
— ардуино нано — 200 рублей;
— датчик освещенности — 28 рублей;
— модуль реального времени RTC DS1307 AT24C32 — 37 рублей;
— преобразователь питания LM2596 — 41 рубль;
— блок питания 12 в 1А — нашел в закромах;
— датчик температуры DALLAS DS18B20 — 48 рублей;
— кусок макетной платы, две таковые кнопки, провода — нашел в закромах.

Для изготовления часов понадобилось так же:
— картон жесткий (изначально хотел фанеру)
— ватман (2 шт)
— двусторонний скотч (3М)
— обычный скотч
— листы вспененного полиэтилена (взял из защитных упаковок оборудования)

Изготовление часов.
1. Установка шрифта в MS Officce, и печать символа 8 на весь размер листа А4. Я сделал это в Visio


Внутренние полосы — границы для разметки под куски диодной ленты. Внешние границы — контуры цифр.

2. Нанесение границ кусков диодной ленты на картон


Прикладываем, фиксируем и обводим внутренние контуры. И так четыре символа

3. По следующему шаблону делаем разметку на вспененном полиэтилене, толщина 15 мм, и далее по разметке вырезаем.



фото процесса не сохранилось, общий итог примерно такой

Для резки использовал самодельный станок из трех деревяшек, листа ДСП и натянутой вертикально нихромовой проволоки. Запитал регулируемым блоком питания.

4. По размеченным на картоне границам приклеиваем куски диодной ленты и соединяем пайкой по цепочке.


5. Далее приклеил контуры цифр к картонке с диодной лентой:


Далее сделал из ватмана внешний корпус, хотел сделать из фанеры, деревянных реек и тонированного стекла или акрила — но пока ни времени ни возможности нет.



Электроника
Основную схему вынес в отдельную коробочку, так как такой корпус хлипковат. В итоге к часам подходит кабель, в котором:
+12В — на питание диодной ленты;
+5В — на питание модуля освещенности;
0 — общий провод (минус);
выход данных с ардуино на диодную ленту;
выход сигнала с датчика освещенности на ардуино;

Схема соединений:


На деле все получилось не так красиво, но вроде работает:


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


Алгоритм работы:
Часы показывают время, дату и температуру в помещении: первые 15 секунд — время, затем 3 секунды — дату, еще 3 секунды — температуру, затем снова время. С 45-й секунды вновь дата 3 секунды, температура 3 секунды и снова время.
Когда в помещении светло — яркость отображения высокая, когда темно — снижается до минимального.

Скетч
yadi.sk/d/apVZ5DBw3XYTZo
Список скетчей:
1. clock_date (02.01.2017) — отображает время, дату и температуру, слегка подтормаживает при смене показаний
2. clock_temp (09.09.2017) — отображает время и температуру, смена каждые 5 секунд
3. new_clock (04.01.2017) — отображает просто время, анимированная смена цвета каждую минуту
4. new_clock_без кнопок (09.09.2017) — то же, что и п. 3, только убрал кнопки корректировки времени
5. clock_temp_animation (09.09.2017) — скетч из п.2 с анимацией как в п.3.
6. clock_temp_x2_animation (25.11.2017) — скетч из п.5 с двумя датчиками температуры: 5 секунд время, 2 секунды — температура внутри, 2 секунды — температура снаружи (наружный отображает отрицательную температуру)

в скетче возможны ошибки — переделывал много раз

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

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

Внешний вид часов на Arduino и семисегментных дисплеях

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

Необходимые компоненты

  1. Плата Arduino UNO (купить на AliExpress).
  2. 4-х разрядный семисегментный дисплей (индикатор) (4-Digit 7 Segment Display) (купить на AliExpress).
  3. Микросхема 74HC595 (регистр сдвига) (купить на AliExpress).
  4. Модуль часов реального времени DS3231 (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

4-х разрядный семисегментный дисплей (4-Digit 7 Segment Display)

Внешний вид 4-х разрядного семисегментного дисплея

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

Распиновка 4-х разрядного семисегментного дисплея

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

Внутренняя схема соединений 4-х разрядного семисегментного дисплея

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

Внутренние схемы соединений семисегментных дисплеев

В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).

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

Использование технологии мультиплексирования

Так каким образом мы можем на подобном 4-х символьном семисегментном дисплее отобразить, к примеру, число 1234? Это возможно сделать с использованием технологии мультиплексирования. Смысл этой технологии достаточно прост – в каждый момент времени мы отображаем только один символ (из 4-х возможных) на данном дисплее. Переключение между отображением всех 4-х символов происходит достаточно быстро – поэтому человеческий глаз воспринимает их непрерывно горящими.

Регистр сдвига 74HC595

Распиновка регистра сдвига 74HC595

Микросхема 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

Внешний вид данного модуля представлен на следующем рисунке.

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

Модуль предназначен для хранения времени и даты даже когда общее питание схемы выключено – для этой цели в его состав входит элемент питания CR2032. В состав модуля DS3231 входит также датчик температуры, поэтому его можно использовать в различных встраиваемых устройствах, например, в цифровых часах с индикатором температуры и т.д. Модуль работает по интерфейсу I2C. На нашем сайте вы можете посмотреть следующие проекты с использованием данного модуля:

Назначение контактов (распиновка) модуля DS3231 приведена в следующей таблице.

Наименование контакта Назначение контакта
VCC напряжение питания
GND общий провод (земля)
SDA контакт последовательной передачи данных (I2C)
SCL контакт синхронизации (тактирования) (I2C)
SQW выход прямоугольного сигнала (программируемый меандр)
32K выход меандра с частотой 32.768кГц

Теперь перейдем непосредственно к схеме нашего проекта.

Схема проекта

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

Схема часов на Arduino и 4-х разрядном семисегментном индикаторе

В следующей таблице представлены необходимые соединения между модулем часов реального времени и платой Arduino Uno.

DS3231 Arduino Uno
VCC 5V
GND GND
SDA A4
SCL A5

В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595 и платой Arduino Uno.

В следующей таблице представлены необходимые соединения между регистром сдвига 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. Затем мы выделяем индивидуальные цифры из этого считанного числа. Далее эти индивидуальные цифры преобразуются в двоичный формат и передаются на регистр сдвига, а с него на семисегментный дисплей. Для отображения всех четырех символов мы используем технологию мультиплексирования – то есть в каждый момент времени мы отображаем только один символ, но переключение между символами происходит с высокой частотой, поэтому человеческий глаз этого не замечает.


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

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

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

    х 1шт.
  • RTC модуль Trema на базе чипа DS1307 х 1шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 1шт. х 1шт. х 3шт. х 2шт. х 1шт.
  • Trema-модуль светодиод х 1шт. (белый, синий, красный, оранжевый или зелёный)

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

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

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

Видео:


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

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

RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 Arduino Uno
GND GND
Vcc +5V
SDA (Serial DAta) A4
SCL (Serial CLock) A5

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

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

RTC часы с будильником на Arduino Uno

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

  • В режиме вывода даты/времени/будильника (обычный режим):
    • Кратковременное нажатие на кнопку 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.

    Читайте также: