#include <Wire.h>
#include <RTClib.h>
// Пин подключения сдвигового регистра
const int dataPin = 2; // DS (данные)
const int latchPin = 3; // ST_CP (защелка)
const int clockPin = 4; // SH_CP (такт)
RTC_DS3231 rtc;
// Массив для преобразования цифр в сегменты (Q1-Q7, без точки)
// Порядок сегментов: A, B, C, D, E, F, G (соответствует Q1-Q7)
const byte digitPatterns[10] = {
B1111110, // 0 (A,B,C,D,E,F,G)
B0110000, // 1 (B,C)
B1101101, // 2 (A,B,G,E,D)
B1111001, // 3 (A,B,G,C,D)
B0110011, // 4 (F,G,B,C)
B1011011, // 5 (A,F,G,C,D)
B1011111, // 6 (A,F,G,C,D,E)
B1110000, // 7 (A,B,C)
B1111111, // 8 (A,B,C,D,E,F,G)
B1111011 // 9 (A,B,C,D,F,G)
};
// Массив для выбора разряда (анодного управления)
const byte digitSelect[4] = {
B00010000, // 1-й разряд (Q5)
B00100000, // 2-й разряд (Q6)
B01000000, // 3-й разряд (Q7)
B10000000 // 4-й разряд (Q8)
};
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Wire.begin();
rtc.begin();
// Раскомментируйте для установки времени (установите текущее время)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
// Получаем часы и минуты
int hours = now.hour();
int minutes = now.minute();
// Разделяем цифры
int digit1 = hours / 10; // Первая цифра часов
int digit2 = hours % 10; // Вторая цифра часов
int digit3 = minutes / 10; // Первая цифра минут
int digit4 = minutes % 10; // Вторая цифра минут
// Если первая цифра часов равна 0, не отображаем ее
if (digit1 == 0) {
digit1 = -1; // Специальное значение для пустого разряда
}
// Отображаем время на индикаторах
displayTime(digit1, digit2, digit3, digit4);
}
void displayTime(int d1, int d2, int d3, int d4) {
// Массив цифр для отображения
int digits[4] = {d1, d2, d3, d4};
// Динамическая индикация - поочередно включаем каждый разряд
for (int i = 0; i < 4; i++) {
if (digits[i] == -1) {
// Пустой разряд - выключаем все сегменты
shiftOut(dataPin, clockPin, MSBFIRST, digitSelect[i]);
} else {
// Объединяем паттерн цифры и выбор разряда
byte pattern = digitPatterns[digits[i]] | digitSelect[i];
shiftOut(dataPin, clockPin, MSBFIRST, pattern);
}
// Защелкиваем данные
digitalWrite(latchPin, HIGH);
digitalWrite(latchPin, LOW);
// Небольшая задержка для видимости
delay(2);
}
}