#include <Wire.h>
#include "RTClib.h"
const int dataPin = 2;
const int latchPin = 3;
const int clockPin = 4;
const int buttonUoPin=5;
const int buttonDownPin=6;
const int buttonModePin=7;
RTC_DS3231 rtc;
const byte digitPatterns[10] = {
B11000000, // 0
B11111001, // 1
B10100100, // 2
B10110000, // 3
B10011001, // 4
B10010010, // 5
B10000010, // 6
B11111000, // 7
B10000000, // 8
B10010000 // 9
};
void setup() {
Serial.begin(9600);
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
if (!rtc.begin()) {
Serial.println("Ошибка: RTC не найден!");
while(1);
}
if (rtc.lostPower()) {
Serial.println("Устанавливаем время компиляции");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
updateDisplay(B11111111, B11111111, B11111111, B11111111);
}
void loop() {
static uint32_t lastUpdate = 0;
if (millis() - lastUpdate >= 1000) {
lastUpdate = millis();
DateTime now = rtc.now();
showTime(now.hour(), now.minute());
printSerialTime(now);
}
}
void showTime(byte hours, byte minutes) {
byte hourTens = hours / 10;
byte hourUnits = hours % 10;
byte minuteTens = minutes / 10;
byte minuteUnits = minutes % 10;
byte digit1 = hourTens > 0 ? digitPatterns[hourTens] : B11111111;
byte digit2 = digitPatterns[hourUnits];
byte digit3 = digitPatterns[minuteTens];
byte digit4 = digitPatterns[minuteUnits];
updateDisplay(digit1, digit2, digit3, digit4);
}
void updateDisplay(byte d1, byte d2, byte d3, byte d4) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, d4);
shiftOut(dataPin, clockPin, MSBFIRST, d3);
shiftOut(dataPin, clockPin, MSBFIRST, d2);
shiftOut(dataPin, clockPin, MSBFIRST, d1);
digitalWrite(latchPin, HIGH);
}
void printSerialTime(const DateTime& dt) {
Serial.print("Time: ");
if (dt.hour() < 10) Serial.print('0');
Serial.print(dt.hour());
Serial.print(':');
if (dt.minute() < 10) Serial.print('0');
Serial.print(dt.minute());
Serial.print(':');
if (dt.second() < 10) Serial.print('0');
Serial.println(dt.second());
}