Мини-часы на LED-матрице 32×8 с Arduino Nano и DS3231 — DIY-настольные часы
Компоненты и материалы
- Arduino Nano R3 — 1 шт.
- Модуль RTC DS3231 (I2C, высокая точность ±5 ppm) — 1 шт.
- Кнопки тактильные (модуль 2 шт.) — 2 шт.
- Модуль LED-матрицы 32×8 на MAX7219 (4 каскадированных матрицы 8×8) — 1 шт.
- Паяльник, припой, корпус по желанию
Программное обеспечение
- Arduino IDE
- Библиотеки:
LedControl,FontLEDClock,RTClib,Button(Alexander Brevig)
О проекте
Проект основан на часах Nick Hall («Nick's LED Projects»), адаптирован под дешёвый и компактный модуль 4-в-1 (32×8) с AliExpress. Часы обладают богатым функционалом:
- Базовый режим — большие цифры 5×7
- Режим «Бегущая строка» — цифры плавно сменяют друг друга
- Малые цифры 3×5 с секундами
- Текстовый режим — время словами (например, «ten past twelve»)
- Отображение даты
- Формат 12/24 часа
- Регулировка яркости
- Случайный режим — смена режима отображения каждые несколько часов
- Меню на двух кнопках для настройки

Схема проста: Arduino Nano, модуль RTC DS3231 (I2C — A4/A5), матрица MAX7219 (DIN=D12, CLK=D11, CS=D10), две кнопки на D2 и D3 (с подтяжкой). Библиотеки и модифицированный код доступны для скачивания.
Схема подключения

Основной скетч (Mini Clock v1.0)
/*********************************************************************** Mini Clock v1.0, Jul 2014 by Nick Hall Adapted for 32x8 MAX7219 module (4 matrices) GPL license. Tested on IDE 1.6.5 ***********************************************************************/ #include "LedControl.h" #include#include #include "RTClib.h" #include // LED Matrix: DIN=12, CLK=11, CS=10, 4 devices LedControl lc = LedControl(12, 11, 10, 4); byte intensity = 7; // Яркость 0-15 byte clock_mode = 0; // 0=basic, 1=small, 2=slide, 3=word, 4=setup bool random_mode = 0; byte old_mode = clock_mode; bool ampm = 0; // 0=24h, 1=12h byte change_mode_time = 0; unsigned long delaytime = 500; int rtc[7]; // [sec, min, hour, dow, date, month, year] char days[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; char daysfull[7][9] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; char suffix[4][3] = {"st","nd","rd","th"}; #define NUM_DISPLAY_MODES 3 #define NUM_SETTINGS_MODES 4 #define SLIDE_DELAY 20 #define cls clear_display RTC_DS1307 ds1307; Button buttonA = Button(2, BUTTON_PULLUP); Button buttonB = Button(3, BUTTON_PULLUP); void setup() { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); Serial.begin(9600); for (int addr = 0; addr < 4; addr++) { lc.shutdown(addr, false); lc.setIntensity(addr, intensity); lc.clearDisplay(addr); } #ifdef AVR Wire.begin(); #else Wire1.begin(); #endif ds1307.begin(); if (!ds1307.isrunning()) { Serial.println("RTC not running!"); ds1307.adjust(DateTime(__DATE__, __TIME__)); } printver(); digitalWrite(13, HIGH); } void loop() { switch (clock_mode) { case 0: basic_mode(); break; case 1: small_mode(); break; case 2: slide(); break; case 3: word_clock(); break; case 4: setup_menu(); break; } } // --- Вспомогательные функции --- void plot(byte x, byte y, byte val) { /* установка пикселя на нужной матрице */ } void clear_display() { for (byte a=0;a<4;a++) lc.clearDisplay(a); } void fade_down() { /* плавное затухание */ } void printver() { /* тест LED и приветствие */ } void puttinychar(byte x, byte y, char c) { /* вывод символа 3x5 */ } void putnormalchar(byte x, byte y, char c) { /* вывод символа 5x7 */ } // --- Режимы отображения --- void small_mode() { /* время мелкими цифрами с секундами */ } void basic_mode() { /* время большими цифрами 5x7 с мигающим двоеточием */ } void slide() { /* анимация смены цифр слайдом */ } void slideanim(byte x, byte y, byte seq, char cur, char nxt) { /* кадр анимации слайда */ } void word_clock() { /* время словами на английском */ } void display_date() { /* день недели, число, месяц с центрированием */ } void switch_mode() { /* меню выбора режима отображения (кнопка A) */ } byte run_mode() { /* проверка случайного режима смены */ } void set_next_random() { /* выбор следующего режима и времени смены */ } void setup_menu() { /* меню настроек: случайный режим, 12/24ч, установка времени, яркость, выход */ } void set_random() { /* вкл/выкл случайного режима */ } void set_ampm() { ampm ^= 1; cls(); } // переключение 12/24 void set_intensity() { /* настройка яркости кнопкой B с индикатором */ } void set_time() { /* установка времени и даты через кнопки */ } int set_value(byte msg, int val, int reset, int limit) { /* универсальный ввод числа */ } void get_time() { /* чтение RTC в массив rtc[] */ } // Полный код с всеми функциями доступен в разделе Code проекта.
Для работы необходимы библиотеки: LedControl, FontLEDClock, RTClib, Button. Скачайте их через менеджер библиотек Arduino IDE или по ссылкам в проекте.
Производственный процесс
- Сборка светодиодного секвенсора на таймере 555 и счетчике 4017: деление частоты и устранение дребезга
- Кукушка: история, мастерство и современная эволюция
- Матрицы в MATLAB: Создание, индексация, удаление строк/столбцов и операции
- Arduino Mini Boss Battle Game — ретро-игра в стиле босса
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Сборка Берлинских часов на Arduino UNO — LED-матричные часы своими руками
- Аналоговые POV-часы на Arduino Nano: персистенция зрения с 17 светодиодами
- Интерактивный LED-дисплей в двери с PIR-датчиком — новогоднее приветствие на Arduino
- Звукоактивируемый светодиодный дисплей 8 LED на Arduino
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino