Красивые часы на Arduino + TFT IPS + DS3231

Два варианта стильных часов на цветном IPS-дисплее: классический аналоговый циферблат и информационная панель с датой, температурой и настройкой двумя кнопками. Всё с русским текстом и точным ходом от DS3231.

Часы Arduino TFT 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);
}

Отображает на TFT-экране текущее время, дату и температуру с DS3231.
Кнопкой 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), добавить вывод прогноза погоды, будильник, вибромотор, звуковой сигнал, анимацию или смену тем оформления.

📁 Скачать примеры