//verze III
#include <Wire.h>
#include "RTClib.h"
// Piny pro 74HC595
const int latchPin = 9;
const int clockPin = 10;
const int dataPin = 11;
// Další piny
const int errPin = A0;
const int hhPin = 5;
const int mmPin = 6;
const int ssPin = 7;
RTC_DS1307 DS1307;
int hh; //hodiny
int mm; //minuty
int ss; //sekundy
void setup() {
Serial.begin(9600);
if (!DS1307.begin()) {
Serial.println("chyba hodin!");
digitalWrite(errPin, HIGH);
while (1);
}
if (!DS1307.isrunning()) {
Serial.println("Hodiny nejsou spuštěny! Spouštím nyní...");
digitalWrite(errPin, LOW);
DS1307.adjust(DateTime(2025, 6, 26, 12, 54, 11)); // jednorázové nastavení
}
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(errPin, OUTPUT);
pinMode(hhPin, INPUT_PULLUP);
pinMode(mmPin, INPUT_PULLUP);
pinMode(ssPin, INPUT_PULLUP);
resSeq();
}
void resSeq() {
delay(1000);
for (int i = 0; i <= 9; i++) {
byte val = (i << 4) | i; // například: 0x00, 0x11, 0x22, ..., 0x99
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, val); // sekundy
shiftOut(dataPin, clockPin, MSBFIRST, val); // minuty
shiftOut(dataPin, clockPin, MSBFIRST, val); // hodiny
digitalWrite(latchPin, HIGH);
delay(300);
}
}
void loop() {
DateTime now = DS1307.now();
hh = now.hour();
mm = now.minute();
ss = now.second();
bool timeChanged = false;
if (digitalRead(hhPin) == LOW) {
hh = (hh + 1) % 24;
timeChanged = true;
delay(300); // jednoduché odrušení
}
if (digitalRead(mmPin) == LOW) {
mm = (mm + 1) % 60;
timeChanged = true;
delay(300);
}
if (digitalRead(ssPin) == LOW) {
ss = (ss + 10) % 60;
timeChanged = true;
delay(300);
}
if (timeChanged) {
// Uloží změněný čas zpět do RTC
DS1307.adjust(DateTime(now.year(), now.month(), now.day(), hh, mm, ss));
}
// Rozdělení času na číslice
byte h1 = hh / 10;
byte h2 = hh % 10;
byte m1 = mm / 10;
byte m2 = mm % 10;
byte s1 = ss / 10;
byte s2 = ss % 10;
byte hodinyByte = (h1 << 4) | h2;
byte minutyByte = (m1 << 4) | m2;
byte sekundyByte = (s1 << 4) | s2;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, sekundyByte);
shiftOut(dataPin, clockPin, MSBFIRST, minutyByte);
shiftOut(dataPin, clockPin, MSBFIRST, hodinyByte);
digitalWrite(latchPin, HIGH);
Serial.print(hh);
Serial.print(":");
Serial.print(mm);
Serial.print(":");
Serial.println(ss);
delay(1000); // aktualizace každou sekundu
}