Как сделать цифровые часы на Ардуино с TM1637
Суббота, 7 февраля 2026 г.

Как собрать цифровые часы на TM1637

В предыдущей статье мы собрали часы на дисплее LCD1602, но у них есть недостаток — мелкий шрифт, который плохо виден издалека. Решим эту проблему, заменив дисплей на крупный 4-разрядный светодиодный индикатор TM1637.

Только сидя за компьютерным столом можно увидеть время. К счастью можно сделать так, чтобы эти часы были более круче. И эта ситуация разрешена с помощью того же микроконтроллера на основе Ардуино, в нашем случае версия Нано.Статья про то как начать работать с ардуино.

Цифровые часы на Ардуино

Только теперь Ардуино не будет выводить время на жидкокристаллический дисплей типа 1602, а на 7 сегментный 4 х разрядный индикатор TM1637. Что в общем то понадобится для сборки этих часов:

  1. Arduino nano
  2. TM1637
  3. Провода Папа-Мама
  4. DS1302-модуль реального времени
Arduino Nano Индикатор TM1637
Провода для подключения Модуль DS1302

А также модулю реального времени на четвертой картинке понадобится батарейка CR2032 для того чтобы после отключения питания часы не сбрасывались.

Пины для подключения:

  1. Модуль DS1302: VCC - 5 вольт на Ардуино
  2. Gnd на Gnd Ардуино
  3. Clk на D6 Ардуино
  4. Dat на D7 Ардуино
  5. Rst на D8 Ардуино

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

  1. VCC к 5 вольтам на Ардуино
  2. Gnd к Gnd Платы
  3. Clk на D2
  4. 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Д печать если есть такая возможность.

Готовые цифровые часы