Часы на Arduino: TM1637, OLED и DS3231
Часы — идеальный второй проект: схема на два-четыре провода, а результат стоит на полке и тикает годами. Я собрал их не меньше десяти, и каждый раз развилка одна: какое табло взять — семисегментный TM1637 с крупными цифрами, OLED 0.96 с полной свободой графики или привычный LCD 1602. Все три варианта собираются за вечер, отличаются ценой в 2-3 раза и объёмом того, что можно вывести на экран.
Второй вопрос — источник времени. Ход на millis() бесплатен и точен до секунд в день, но обнуляется при каждом отключении питания; модуль DS3231 за 130-220 ₽ помнит время годами с батарейкой и врёт не больше пары секунд за месяц. Ниже — таблица выбора табло, схема подключения и рабочий скетч: часы на TM1637 с ходом на millis() исполняются в симуляторе прямо со страницы, а версии с DS3231 разобраны в уроках RTClib.
Три табло на выбор: что берут для каких часов
TM1637 — четырёхразрядный семисегментный индикатор: крупные цифры, видные через комнату, идеальны для «чистых часов» на стене или столе. OLED 0.96 на SSD1306 — монохромный экран 128×64: цифры любого размера, дата, день недели, температура — всё в одном кадре. LCD 1602 — два ряда по 16 символов: часы плюс показания датчиков без графики. Бюджет примерно такой: TM1637 — 120-180 ₽, OLED — 300-450 ₽, LCD с I2C-модулем — 250-400 ₽.
Мой расклад по практике: подарок родителям или ночник-часы — TM1637 (цифры видны без очков, а яркость крутится от 0 до 7); метео-часы с датой и уличной температурой — OLED; настольная станция с показаниями DHT и кучей строк — LCD. Схема дисплея из урока про подключение LCD 1602 по I2C остаётся той же, меняется только библиотека.
Таблица: TM1637 против OLED и LCD 1602
| Параметр | TM1637 (4 разряда) | OLED 0.96 (SSD1306) | LCD 1602 I2C |
|---|---|---|---|
| Цена | 120-180 ₽ | 300-450 ₽ | 250-400 ₽ с модулем I2C |
| Провода данных | 2 (CLK, DIO) | 2 по I2C (SDA, SCL) | 2 по I2C (SDA, SCL) |
| Размер цифр | Крупные, видно через комнату | Средние, шрифт настраивается | Мелкие, крупнее — только свои глифы |
| Что на экране | Только цифры 0-9 и двоеточие | Графика, дата, иконки, графики | Два ряда по 16 символов |
| Библиотека | TM1637Display | Adafruit_SSD1306 + GFX | LiquidCrystal_I2C |
| Ток | 20-30 мА на полной яркости | 15-25 мА | 25-120 мА с подсветкой |
| Сценарий | Настольные часы, таймер, кухонный прибор | Метео-часы: время, дата, температура | Часы-станция со строками датчиков |
Отдельный плюс TM1637, о котором забывают: у него нет подсветки и буфера 1 КБ, он не грузит шину и почти не требует кода — четыре разряда и двоеточие, вся магия в showNumberDecEx. Распиновку с фотографиями шелка я свёл в обзоре подключения TM1637 из списка ссылок под статьёй.
DS3231: почему без RTC часы уходят вперёд
Кварц Arduino — керамический резонатор с разбросом, и обычные часы на millis() уходят на минуты за неделю — я видел экземпляры и получше, и похуже. Модуль DS3231 — это специализированные RTC-часы с термокомпенсацией: заявленные 2 минуты в год, у меня на полке — около 5-8 секунд за год. Питается от CR2032 и живёт на ней годами: плату выключаете, время продолжает идти.
Подключение — шина I2C: SDA на A4, SCL на A5, питание 5 В (или 3,3 В, модуль двужильный по питанию). Библиотека RTClib, установка времени одной строкой rtc.adjust(DateTime(F(__DATE__), F(__TIME__))). Если после сборки экран молчит, а I2C-устройств несколько — начинайте с сканера I2C-адресов; про точность и компенсацию DS3231 подробнее — в уроке про DS3231.
Схема подключения TM1637: два пина данных
- CLK модуля — на D4, DIO — на D5 (пины любые цифровые, порядок CLK/DIO в конструкторе важен)
- VCC — 5 В, GND — GND; ток 20-30 мА, так что USB-питания хватает
- Резисторы не нужны: у модуля свои подтяжки на борде
- Двоеточие на стандартных модулях — бит 0x40 в showNumberDecEx; у «часовых» версий 16 пинов оно горит всегда и управляется иначе
Если у вас OLED — схема другая только адресами: SDA/SCL те же A4/A5, адрес обычно 0x3C, начало скетча разобрано в уроке про установку Adafruit GFX. Полная распиновка обоих дисплеев — в обзоре OLED SSD1306 из списка ссылок.
Скетч: часы на TM1637 с ходом на millis
Стартовое время задаётся константами в шапке, дальше часы идут сами: каждые полсекунды мигает двоеточие, каждую минуту — тик. Запустите скетч в симуляторе и следите за Serial: на реальном железе код работает без изменений, только время потом будете заводить от DS3231 вместо констант.
// Часы на TM1637: стартовое время в константах, дальше ход на millis().#include <TM1637Display.h> TM1637Display disp(4, 5); // CLK на D4, DIO на D5 int hours = 12; // с чего начинаем — поставьте своёint minutes = 30;unsigned long lastHalf = 0; // метка полсекундного тикаbool colon = true; void setup() { Serial.begin(9600); disp.setBrightness(5); // яркость 0..7; для ночника хватит 2-3 showTime(); Serial.println("часы запущены, двоеточие мигает");} void showTime() { // 12:30 -> число 1230, бит 0x40 рисует двоеточие int hhmm = hours * 100 + minutes; disp.showNumberDecEx(hhmm, colon ? 0x40 : 0, true, 4, 0);} void loop() { if (millis() - lastHalf >= 500) { lastHalf = millis(); colon = !colon; // полсекунды горит, полсекунды гаснет if (!colon) { // раз в секунду — минутный тик minutes++; if (minutes >= 60) { minutes = 0; hours++; if (hours >= 24) hours = 0; Serial.print("новый час: "); Serial.println(hours); } } showTime(); }}Три ловушки, на которые я налетал: двоеточие гаснет после первого обычного showNumberDec — бит 0x40 нужно вписывать в каждый кадр; вызов clear() стирает кадр и возвращает пустоту вместо цифр; а яркость 7 съедает 30 мА и слепит ночью — для полочных часов берите 2-5. Полный разбор библиотеки с сигнатурами — в уроке про методы TM1637Display.
OLED 0.96: крупные цифры и дата в кадре
На OLED часы выглядят богаче: время шрифтом размера 3 занимает два ряда, ниже — дата и день недели, а с датчиком DHT туда же влезает температура. Ход времени тот же millis() или DS3231 через rtc.now(), а мигающее двоеточие рисуется условным выводом. Готовый скетч с DS3231, крупным шрифтом и моргающим разделителем — в уроке про часы на OLED; там же — про то, почему дисплей обновляют не чаще пары раз в секунду, чтобы не мерцал.
LCD 1602: когда рядом нужны показания датчиков
LCD проигрывает OLED в графике и TM1637 в размере цифр, но выигрывает там, где нужна строчка текста под часами: прогноз, показания, меню. Классика жанра — часы с DS3231 на верхней строке и данные DHT22 на нижней; тайминг обновления на millis() разобран в уроке про часы на LCD, вариант с настоящим RTC — второй урок в списке ссылок под статьёй. Кириллицу HD44780 без библиотечных глифов не рисует — либо латиница, либо свои символы через createChar.