Как сделать электронные часы на Ардуино с дисплеем 1602

Как сделать электронные часы на Ардуино с дисплеем 1602 по I2C

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

Хотелось бы все время иметь под рукой часы. Или хотя бы чтобы было на виду. Наручные часы можешь снять и положить куда нибудь и забыть куда его положил. А настольные часы - идеальное решение для рабочего стола. Именно поэтому я захотел собрать цифровые часы на Ардуино с жидкокристаллическим дисплеем 1602.

Сборка и программирование очень простые. Если вы знакомы с базовыми знаниями про этот микроконтроллер, то вам не составит особого труда собрать себе такой же. Дисплей можно купить в любом маркетплейсе типа AliExpress, Ozon или Wildberries.

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

Что понадобится для сборки

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

  1. Arduino Nano или любой другой Ардуино
  2. Модуль реального времени DS1302 с батарейкой CR2032
  3. Провода Папа-Папа и Папа-Мама для соединений
  4. Дисплей LCD 1602 с I2C модулем (адрес обычно 0x27 или 0x3F)
LCD 1602 дисплей

LCD 1602 с I2C модулем

Arduino Nano

Arduino Nano

Модуль DS1302

Модуль реального времени DS1302

Соединительные провода

Соединительные провода

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

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

  • LCD 1602 (I2C): SDA → A4, SCL → A5, VCC → 5V, GND → GND
  • DS1302: CLK → D4, DAT → D5, RST → D6, VCC → 5V, GND → GND

Важно правильно подключить питание: 5V от Arduino ко всем модулям и общую землю (GND). Модуль DS1302 требует батарейки CR2032 для сохранения времени при отключении питания.

Программирование часов

Код для часов включает работу с библиотеками LiquidCrystal_I2C и Rtc by Makuna. Основная логика: чтение времени из DS1302 и вывод на дисплей. Вот первый скетч для установки времени на модуле DS1302:

Скетч для установки времени на DS1302

Скачать .ino

// Подключение библиотеки
#include <iarduino_RTC.h>

// Подключение DS1302: RST=7, CLK=6, DAT=5
iarduino_RTC time(RTC_DS1302, 6, 4, 5);

void setup() {
  Serial.begin(9600);
  time.begin();
  delay(300);
  
  Serial.println("=== Установка времени ===");
  
  // Устанавливаем точное время 
  // settime(секунды, минуты, часы, день, месяц, год, день_недели)
  time.settime(0,   // секунды: 0
               18,  // минуты: 18
               12,  // часы: 12
               2,   // день: 2
               2,   // месяц: 2
               26,  // год: 2026 (последние 2 цифры)
               5);  // день недели: 5 (пятница)
  
  Serial.println("Время успешно установлено!");
  
  // Проверяем установленное время
  delay(1000);
  showCurrentTime();
}

void loop() {
  // Показываем время каждые 10 секунд
  static unsigned long lastShow = 0;
  if (millis() - lastShow >= 10000) {
    lastShow = millis();
    showCurrentTime();
  }
}

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);
}
                            

Этот скетч нужен ардуино для того, чтобы модуль реального времени понимал, сколько сейчас актуальное время. После его прошивки модуль DS1302 запомнит установленное время и будет его сохранять даже при отключении питания.

А вот основной скетч для работы самих часов:

Полный скетч электронных часов

Скачать .ino

/*
  Электронные часы на Arduino Nano
  LCD 1602 + DS1302 + Rtc by Makuna
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ThreeWire.h>
#include <RtcDS1302.h>

// Пины для DS1302
#define RTC_CLK_PIN 4
#define RTC_DAT_PIN 5
#define RTC_RST_PIN 6

// LCD 1602 I2C (адрес обычно 0x27 или 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Создаем объекты для RTC
ThreeWire myWire(RTC_DAT_PIN, RTC_CLK_PIN, RTC_RST_PIN);
RtcDS1302<ThreeWire> Rtc(myWire);

void setup() {
  Serial.begin(9600);
  Serial.println("Часы на LCD 1602 + DS1302");
  
  // Инициализация LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("metaDonta Clock");
  lcd.setCursor(0, 1);
  lcd.print("Initializing...");
  
  // Инициализация RTC
  Rtc.Begin();
  
  // Проверка и установка времени
  setupRTC();
  
  delay(2000);
  lcd.clear();
  
  Serial.println("Часы готовы к работе!");
}

void setupRTC() {
  // Если RTC потерял время или не был установлен
  if (!Rtc.IsDateTimeValid()) {
    Serial.println("RTC потерял время!");
    
    // Устанавливаем время компиляции
    RtcDateTime manualTime = RtcDateTime(2026, 2, 2, 12, 11, 0);
    Rtc.SetDateTime(manualTime);
  }
  
  // Проверяем, работает ли RTC
  if (!Rtc.GetIsRunning()) {
    Serial.println("RTC не работает! Запускаю...");
    Rtc.SetIsRunning(true);
  }
}

void loop() {
  static unsigned long lastUpdate = 0;
  
  // Обновляем время каждую секунду
  if (millis() - lastUpdate >= 1000) {
    lastUpdate = millis();
    
    // Получаем текущее время
    RtcDateTime now = Rtc.GetDateTime();
    
    // Отображаем на LCD
    displayTime(now);
    
    // Выводим в Serial для отладки
    printDateTime(now);
  }
  
  delay(10); // Небольшая задержка
}

void displayTime(const RtcDateTime& dt) {
  // Форматируем время
  char timeStr[9];
  sprintf(timeStr, "%02d:%02d:%02d", 
          dt.Hour(), dt.Minute(), dt.Second());
  
  // Форматируем дату
  char dateStr[11];
  sprintf(dateStr, "%02d/%02d/%04d", 
          dt.Day(), dt.Month(), dt.Year());
  
  // Выводим время на первую строку
  lcd.setCursor(0, 0);
  lcd.print("Time: ");
  lcd.print(timeStr);
  
  // Выводим дату на вторую строку
  lcd.setCursor(0, 1);
  lcd.print("Date: ");
  lcd.print(dateStr);
}

void printDateTime(const RtcDateTime& dt) {
  char datestring[20];
  
  snprintf_P(datestring, 
             sizeof(datestring),
             PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
             dt.Month(),
             dt.Day(),
             dt.Year(),
             dt.Hour(),
             dt.Minute(),
             dt.Second());
  
  Serial.println(datestring);
}
                            

После того как залили скетч на ардуино, дисплей должен загореться зеленым цветом. На модуле I2C есть два пина для подсветки, их нужно замкнуть между собой для того чтобы подсветка горела:

Джампер на I2C модуле

Джампер на I2C модуле

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

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

Работающий дисплей

Работающий дисплей с отображением времени

Корпус и финальная сборка

Долго подбирать корпус для часов не пришлось. Я решил инкрустировать дисплей часов в корпус динамика компьютера. Таким образом часы будут всегда на виду во время работы за рабочим столом. Удобство такого решения в том, что и динамик будет работать и часы показывать, получилось как-то так.

Результат

Получились компактные настольные часы с точным временем. Дисплей показывает часы, минуты, секунды и дату. Часы работают от USB-порта компьютера или от любого другого источника 5V.

Если хотите собрать часы другого формата, то у меня есть вариант попроще и дешевле с использованием 7-сегментного индикатора TM1637:

* * *

Если у вас есть вопросы по изготовлению или нужны подробности, пишите на почту: metaDonta@list.ru. Отвечаю в течение дня.

Код скопирован в буфер обмена!