Хотелось бы все время иметь под рукой часы. Или хотя бы чтобы было на виду. Наручные часы можешь снять и положить куда нибудь и забыть куда его положил. А настольные часы - идеальное решение для рабочего стола. Именно поэтому я захотел собрать цифровые часы на Ардуино с жидкокристаллическим дисплеем 1602.
Сборка и программирование очень простые. Если вы знакомы с базовыми знаниями про этот микроконтроллер, то вам не составит особого труда собрать себе такой же. Дисплей можно купить в любом маркетплейсе типа AliExpress, Ozon или Wildberries.
Что понадобится для сборки
Для создания электронных часов вам потребуются следующие компоненты:
- Arduino Nano или любой другой Ардуино
- Модуль реального времени DS1302 с батарейкой CR2032
- Провода Папа-Папа и Папа-Мама для соединений
- Дисплей LCD 1602 с I2C модулем (адрес обычно 0x27 или 0x3F)
LCD 1602 с I2C модулем
Arduino Nano
Модуль реального времени 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
// Подключение библиотеки
#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 запомнит установленное время и будет его сохранять даже при отключении питания.
А вот основной скетч для работы самих часов:
Полный скетч электронных часов
/*
Электронные часы на 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 модуле
Схема подключения джампера
Работающий дисплей с отображением времени
Корпус и финальная сборка
Долго подбирать корпус для часов не пришлось. Я решил инкрустировать дисплей часов в корпус динамика компьютера. Таким образом часы будут всегда на виду во время работы за рабочим столом. Удобство такого решения в том, что и динамик будет работать и часы показывать, получилось как-то так.
Результат
Получились компактные настольные часы с точным временем. Дисплей показывает часы, минуты, секунды и дату. Часы работают от USB-порта компьютера или от любого другого источника 5V.
Если хотите собрать часы другого формата, то у меня есть вариант попроще и дешевле с использованием 7-сегментного индикатора TM1637:
Если у вас есть вопросы по изготовлению или нужны подробности, пишите на почту: metaDonta@list.ru. Отвечаю в течение дня.