Co je RTC modul
RTC (Real-Time Clock) je modul, který si drží čas nezávisle na mikrokontroleru. Má vlastní baterii (typicky CR2032), takže běží i při výpadku napájení.
- komunikuje přes I2C
- běžná adresa: 0x68
- EEPROM na modulu má adresu 0x50
DS1307 je méně přesný než DS3231, ale pro většinu projektů stačí.

Piny modulu (přepsaná tabulka)
Modul má tyto piny:
- SQ – výstup obdélníkového signálu (nepoužívá se)
- DS – výstup pro teplotní čidlo (volitelné)
- SCL – I2C clock
- SDA – I2C data
- VCC – napájení (3.3V nebo 5V)
- GND – zem
- BAT – záložní baterie
🔗 Zapojení ESP32 ↔ RTC (přepsaná tabulka)
- SCL → GPIO 22
- SDA → GPIO 21
- VCC → 3.3V
- GND → GND

⚙️ Jak RTC používat
Jsou potřeba 2 věci:
- nastavit čas
- udržet čas pomocí baterie

📦 Knihovna
Používá se knihovna:
- RTClib od Adafruit

🧾 ✅ KOMPLETNÍ KÓD 1: Nastavení + čtení času
rtc.cpp
1#include <Wire.h>
2#include "RTClib.h"
3
4RTC_DS1307 rtc;
5
6char daysOfTheWeek[7][12] = {
7 "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
8};
9
10void setup () {
11 Serial.begin(115200);
12
13 if (!rtc.begin()) {
14 Serial.println("Couldn't find RTC");
15 while (1);
16 }
17
18 if (!rtc.isrunning()) {
19 Serial.println("RTC is NOT running, setting time...");
20
21 // nastaví čas podle času kompilace
22 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
23
24 // nebo ručně:
25 // rtc.adjust(DateTime(2024, 1, 1, 12, 0, 0));
26 }
27}
28
29void loop () {
30 DateTime now = rtc.now();
31
32 Serial.print("Date: ");
33 Serial.print(now.year());
34 Serial.print("/");
35 Serial.print(now.month());
36 Serial.print("/");
37 Serial.print(now.day());
38 Serial.print(" ");
39
40 Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
41 Serial.print(" ");
42
43 Serial.print("Time: ");
44 Serial.print(now.hour());
45 Serial.print(":");
46 Serial.print(now.minute());
47 Serial.print(":");
48 Serial.println(now.second());
49
50 delay(3000);
51}🌐 ✅ KOMPLETNÍ KÓD 2: Synchronizace s NTP (WiFi)
rtc-wifi.cpp
1#include <WiFi.h>
2#include <time.h>
3#include <Wire.h>
4#include "RTClib.h"
5
6RTC_DS1307 rtc;
7
8// WiFi
9const char* ssid = "TVE_WIFI";
10const char* password = "HESLO";
11
12// NTP
13const char* ntpServer = "pool.ntp.org";
14const long gmtOffset_sec = 0;
15const int daylightOffset_sec = 3600;
16
17struct tm timeinfo;
18
19unsigned long lastSyncMillis = 0;
20
21void initWiFi() {
22 WiFi.begin(ssid, password);
23 Serial.print("Connecting to WiFi");
24
25 while (WiFi.status() != WL_CONNECTED) {
26 delay(500);
27 Serial.print(".");
28 }
29
30 Serial.println("\nConnected!");
31}
32
33void syncTime() {
34 configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
35
36 if (!getLocalTime(&timeinfo)) {
37 Serial.println("Failed to obtain time");
38 return;
39 }
40
41 rtc.adjust(DateTime(
42 timeinfo.tm_year + 1900,
43 timeinfo.tm_mon + 1,
44 timeinfo.tm_mday,
45 timeinfo.tm_hour,
46 timeinfo.tm_min,
47 timeinfo.tm_sec
48 ));
49
50 lastSyncMillis = millis();
51 Serial.println("RTC synchronized with NTP");
52}
53
54void checkTimeAndSync() {
55 if (millis() - lastSyncMillis >= 3600000) {
56 Serial.println("Resyncing...");
57 syncTime();
58 }
59}
60
61void setup() {
62 Serial.begin(115200);
63
64 initWiFi();
65
66 if (!rtc.begin()) {
67 Serial.println("Couldn't find RTC");
68 while (1);
69 }
70
71 syncTime();
72}
73
74void loop() {
75 checkTimeAndSync();
76
77 DateTime now = rtc.now();
78
79 Serial.printf("%04d-%02d-%02d %02d:%02d:%02d\n",
80 now.year(), now.month(), now.day(),
81 now.hour(), now.minute(), now.second());
82
83 delay(10000);
84}🖥️ (Volitelné) OLED zapojení
OLED se připojuje stejně jako RTC:
- SDA → GPIO 21
- SCL → GPIO 22
- VCC → 3.3V
- GND → GND
🧾 Shrnutí
- RTC drží čas i bez napájení
- DS1307 komunikuje přes I2C
- musíš:
- jednou nastavit čas
- pak už jen číst
- můžeš synchronizovat přes NTP pro přesnost
