Красивые часы на Arduino + TFT IPS + DS3231
Два варианта стильных часов на цветном IPS-дисплее: классический аналоговый циферблат и информационная панель с датой, температурой и настройкой двумя кнопками. Всё с русским текстом и точным ходом от DS3231.
Вариант 1 — аналоговые часы (6 циферблатов)
Библиотека: TFT_eSPI + Fast ST7789
Автоматическая установка времени с ПК + ручная настройка удержанием кнопки
Вариант 2 — цифровые часы с полной информацией
- День недели (2 буквы)
- Дата ДД.ММ.ГГГГ
- Время ЧЧ:ММ:СС
- Температура от DS3231
- Текстовая строка сверху (любая надпись)
- Настройка двумя кнопками
Подключение
- DS3231 → I²C (A4 SDA, A5 SCL)
- TFT IPS (ST7789 240×240) → SPI:
- SCL → D13
- SDA → D11
- RES → D8
- DC → D9
- CS → D10 (или GND)
- BLK → не подключаем
- Кнопка «Выбор» → D7
- Кнопка «+» → D6
Готовый скетч
#include <TFT_eSPI.h>
#include <RTClib.h>
TFT_eSPI tft;
RTC_DS3231 rtc;
const int btnMode = 7;
const int btnUp = 6;
byte mode = 0; // 0-часы, 1-минуты, 2-день, 3-месяц, 4-год
int daysInMonth(int month, int year) {
if (month == 2) {
return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 29 : 28;
}
if (month == 4 || month == 6 || month == 9 || month == 11) return 30;
return 31;
}
void setup() {
pinMode(btnMode, INPUT_PULLUP);
pinMode(btnUp, INPUT_PULLUP);
tft.begin();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_WHITE);
rtc.begin();
}
void loop() {
DateTime now = rtc.now();
tft.fillScreen(TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(10, 10);
tft.println("Мои часы");
tft.setTextSize(3);
tft.setCursor(40, 60);
tft.printf("%02d:%02d:%02d", now.hour(), now.minute(), now.second());
const char* days[7] = {"Вс","Пн","Вт","Ср","Чт","Пт","Сб"};
tft.setTextSize(2);
tft.setCursor(20, 110);
tft.print(days[now.dayOfTheWeek()]);
tft.print(" ");
tft.printf("%02d.%02d.%04d", now.day(), now.month(), now.year());
tft.setCursor(70, 160);
tft.print(rtc.getTemperature(), 1);
tft.print(" C");
if (digitalRead(btnMode) == LOW) {
delay(200);
mode = (mode + 1) % 5;
}
if (digitalRead(btnUp) == LOW) {
delay(200);
DateTime nt = now;
switch (mode) {
case 0:
nt = DateTime(now.year(), now.month(), now.day(), (now.hour() + 1) % 24, now.minute(), 0);
break;
case 1:
nt = DateTime(now.year(), now.month(), now.day(), now.hour(), (now.minute() + 1) % 60, 0);
break;
case 2: {
int maxDay = daysInMonth(now.month(), now.year());
int d = now.day() + 1;
if (d > maxDay) d = 1;
nt = DateTime(now.year(), now.month(), d, now.hour(), now.minute(), 0);
break;
}
case 3: {
int m = now.month() + 1;
if (m > 12) m = 1;
int d = min(now.day(), daysInMonth(m, now.year()));
nt = DateTime(now.year(), m, d, now.hour(), now.minute(), 0);
break;
}
case 4:
nt = DateTime(now.year() + 1, now.month(), now.day(), now.hour(), now.minute(), 0);
break;
}
rtc.adjust(nt);
}
delay(100);
}
Кнопкой Mode выбирается редактируемое поле (часы, минуты, день, месяц, год).
Кнопкой Up увеличивается выбранное значение и записывается в RTC.
Обновляет экран.
Библиотеки
- TFT_eSPI
- RTClib by Adafruit
- Для русского текста — патч шрифтов в TFT_eSPI
Заключение
С IPS-дисплеем 240×240 и DS3231 получаются шикарные настольные/настенные часы. Первый запуск — время ставится автоматически с компьютера. Дальше — точность ±2 секунды в месяц. Готово к установке в корпус, добавлению будильника, погоды и анимации!
FAQ — Часы на Arduino + TFT IPS + DS3231
Какую Arduino лучше использовать для этих часов?
Подходят Arduino Nano, Pro Mini и Uno. Наиболее удобно использовать Nano: компактная плата, стабильный USB, простой монтаж. Производительности хватает и для аналогового циферблата, и для цифрового режима.
Подходит ли любой ST7789 дисплей 240×240?
Да, подойдёт любой ST7789 с интерфейсом SPI и разрешением 240×240. Важно лишь, чтобы выводы SCL/SDA/RES/DC/CS были доступны. Подсветку BLK можно оставить не подключенной — экран работает без неё.
Нужно ли настраивать TFT_eSPI вручную?
Да, в файле User_Setup.h необходимо указать распиновку, разрешение и параметры драйвера ST7789. Это делается один раз, после чего библиотека работает стабильно. Для русского текста требуется включить расширенные шрифты UTF-8.
Как установить точное время в DS3231?
Самый простой вариант — раскомментировать строку
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); и прошить плату. Часы автоматически синхронизируются с временем компьютера. После первого запуска строку нужно снова закомментировать.
Можно ли настраивать время кнопками в собранных часах?
Да. В проект встроен режим ручной настройки двумя кнопками: «Выбор» и «+». Настраиваются часы, минуты, день, месяц и год. Логика полностью реализована в предоставленном скетче.
Насколько точны часы с DS3231?
DS3231 обеспечивает точность порядка ±2 секунд в месяц. Это один из самых точных RTC-модулей, доступных для Arduino. Температурная компенсация встроена в сам чип.
Можно ли добавить будильник или погоду?
Да. Проект легко расширяется: можно подключить модуль Wi-Fi (ESP01 или ESP32), добавить вывод прогноза погоды, будильник, вибромотор, звуковой сигнал, анимацию или смену тем оформления.