В предыдущей статье мы собрали часы на дисплее LCD1602, но у них есть недостаток — мелкий шрифт, который плохо виден издалека. Решим эту проблему, заменив дисплей на крупный 4-разрядный светодиодный индикатор TM1637.
Только сидя за компьютерным столом можно увидеть время. К счастью можно сделать так, чтобы эти часы были более круче. И эта ситуация разрешена с помощью того же микроконтроллера на основе Ардуино, в нашем случае версия Нано.Статья про то как начать работать с ардуино.
Только теперь Ардуино не будет выводить время на жидкокристаллический дисплей типа 1602, а на 7 сегментный 4 х разрядный индикатор TM1637. Что в общем то понадобится для сборки этих часов:
- Arduino nano
- TM1637
- Провода Папа-Мама
- DS1302-модуль реального времени
А также модулю реального времени на четвертой картинке понадобится батарейка CR2032 для того чтобы после отключения питания часы не сбрасывались.
Пины для подключения:
- Модуль DS1302: VCC - 5 вольт на Ардуино
- Gnd на Gnd Ардуино
- Clk на D6 Ардуино
- Dat на D7 Ардуино
- Rst на D8 Ардуино
После успешного и правильного подключения модуля реального времени к Ардуино, мы переходим к индикатору TM1637. Для того чтобы подключить этот индикатор к Ардуино, руководствуемся этой схемой:
- VCC к 5 вольтам на Ардуино
- Gnd к Gnd Платы
- Clk на D2
- Dio на D3
Затем, заливаем скетч на микроконтроллер который будет ниже. Этот скетч нужен для того чтобы модуль реального времени знала актуальное время.
// Скетч для Arduino - цифровые часы #include// Подключение DS1302: RST=7, CLK=6, DAT=5 iarduino_RTC time(RTC_DS1302, 8, 6, 7); void setup() { Serial.begin(9600); time.begin(); delay(300); Serial.println("=== Установка времени для Екатеринбурга (UTC+5) ==="); // ★★★★★ АКТУАЛЬНОЕ ВРЕМЯ ЕКАТЕРИНБУРГА ★★★★★ // Дата: 15 декабря 2025 года // Время: 18:27:00 (вечер) // День недели: 15 декабря 2025 - понедельник (1) // Устанавливаем точное время Екатеринбурга // settime(секунды, минуты, часы, день, месяц, год, день_недели) time.settime(0, // секунды: 00 07, // минуты: 27 11, // часы: 8 (6 вечера по 24-часовому формату) 07, // день: 15 02, // месяц: 12 (декабрь) 26, // год: 2025 (последние 2 цифры) 6); // день недели: 1 (понедельник) Serial.println("Время успешно установлено!"); Serial.println("Дата: 15.12.2025"); Serial.println("Время: 8:58:00 (Екатеринбург, UTC+5)"); Serial.println("День недели: Понедельник"); Serial.println("================================"); // Проверяем установленное время delay(1000); showCurrentTime(); } void loop() { // Показываем время каждые 10 секунд static unsigned long lastShow = 0; if (millis() - lastShow >= 10000) { lastShow = millis(); showCurrentTime(); } // Автоматическая коррекция каждую минуту (опционально) static int lastMinute = -1; time.gettime(); if (time.minutes != lastMinute) { lastMinute = time.minutes; // Корректируем секунды для точности if (time.seconds > 5) { // Если часы убежали вперед, сбрасываем секунды time.settime(0, time.minutes, time.Hours, time.day, time.month, time.year, time.weekday); Serial.println("[Коррекция] Сброс секунд"); } } } void showCurrentTime() { time.gettime(); Serial.print("Екатеринбург: "); print2digits(time.Hours); Serial.print(":"); print2digits(time.minutes); Serial.print(":"); print2digits(time.seconds); Serial.print(" Дата: "); print2digits(time.day); Serial.print("."); print2digits(time.month); Serial.print(".20"); print2digits(time.year); Serial.print(" День недели: "); switch(time.weekday) { case 1: Serial.println("Понедельник"); break; case 2: Serial.println("Вторник"); break; case 3: Serial.println("Среда"); break; case 4: Serial.println("Четверг"); break; case 5: Serial.println("Пятница"); break; case 6: Serial.println("Суббота"); break; case 7: Serial.println("Воскресенье"); break; } } void print2digits(int number) { if (number < 10) { Serial.print('0'); } Serial.print(number); }
После прошивки Ардуино сразу же заливаем это скетч, уже для того, чтобы индикатор начал показывать то время которое мы задаем на первом скетче. Я специально написал это скетч для того чтобы двоеточие посередине индикатора не мигала, чтобы ночью не раздражала, а вообще при желании можно отрегулировать яркость индикатора строкой disp.brightness(от 0 до 7)
// Скетч для Arduino - цифровые часы #include#include #include #define DS1302_CLK 6 #define DS1302_DAT 7 #define DS1302_RST 8 #define TM1637_CLK 2 #define TM1637_DIO 3 ThreeWire myWire(DS1302_DAT, DS1302_CLK, DS1302_RST); RtcDS1302 Rtc(myWire); GyverTM1637 disp(TM1637_CLK, TM1637_DIO); void setup() { disp.clear(); disp.brightness(7); Rtc.Begin(); } void loop() { RtcDateTime now = Rtc.GetDateTime(); disp.displayClock(now.Hour(), now.Minute()); // Двоеточие горит постоянно delay(1000); // Обновляем раз в секунду }
После всех манипуляций с Ардуино, индикатор долэен загореться и начать показывать время. Индикатор не включится до того как мы не зальем скетч. И вот получились надежные, цифровые часы которых будет не стыдно поставить на видное место у себя на рабочем столе. Остается только решить что делать с корпусом. Габариты индикатора как раз в длину 3 сантиметра в высоту 1.5 сантиметра. Предлагаю сделать корпус из картона это выйдет очень дешево и сердито. Но если хотите сделать по серъезному то лучше из пластика или дерева, а лучшим вариантом будет 3Д печать если есть такая возможность.