
Hogyan biztosítható, hogy egy Arduino-alapú projekt mindig tudja, mennyi az idő? A pontos idő sok kezdő projekt szerves része – legyen szó adatnaplózásról, időzített vezérlésről vagy egyszerű órakijelzésről. A DS1302 RTC modul könnyen kezelhető, kedvező áru, sok kezdőkészletben megtalálható és ideális első lépés a valós idejű órakezelés világába. Ez a cikk gyakorlati példán keresztül mutatja be az órafunkció használatát, külön figyelmet fordítva egy sokszor figyelmen kívül hagyott részletre: a Clock Halt bit megfelelő kezelésére.
Miért fontos az idő Arduino-projektekben?
Sok Arduino‑projektben pontos időre van szükség – például adatnaplózásnál, események időzítésénél, vagy egyszerű órakijelzéshez. A valós idejű óra (RTC – Real Time Clock) modulok ezt a feladatot látják el. Több típus is létezik: a DS1302, DS1307 vagy a DS3231. Bár a DS3231 pontosabb és hőmérséklet-kompenzált, a DS1302 előnye, hogy egyszerűbb és könnyebben tanulható kezdők számára. Ebben a példában a DS1302 használatán keresztül mutatom be az óra modul alapfunkcióit.
Kiemelten foglalkozom a gyakran figyelmen kívül hagyott Clock Halt bit szerepével. A kezdők számára azonban gyakran felesleges túlkomplikálás LCD kijelzők és naptárfunkciók bevezetése az alap óraadatok mellett. Ezért ebben a példában kifejezetten az órafunkcióra fókuszálok, külön bemutatva a Clock Halt (halt bit) szerepét is. Ez a bit indítja el az órát – ha nincs megfelelően beállítva, a modul hiába tűnik működőképesnek, az idő nem fog eltelni!
Kapcsolási séma és gyakorlati tanácsok
A DS1302 modul egy három vezetékes soros interfészen keresztül kommunikál az Arduino‑val. A modulon három fő adatvezetéket találunk: a CE (Chip Enable), az I/O (adat) és az SCLK (órajel). Ezeket tipikusan az Arduino UNO bármely digitális lábára lehet kötni. Az energiaellátást a VCC (5 V) és a GND biztosítja. A modul stabil működését egy 32,768 kHz kristály adja, amely az óra pontos futásáról gondoskodik. Emellett egy CR2032 gombelem táplálja a modult áramszünet esetén, így az idő megőrződik.
A bekötés:
- DS1302 VCC → Arduino 5V
- DS1302 GND → Arduino GND
- DS1302 CE/RST → Arduino digitális 2 (D2)
- DS1302 I/O/DAT → Arduino digitális 3 (D3)
- DS1302 SCLK/CLK → Arduino digitális 4 (D4)

Bekötési séma DS1302 óra modul és Arduino UNO között – látható a VCC, GND, CE/RST, DAT (I/O), SCLK/CLK vezetékek kapcsolata.
Ez a bekötés egyszerű és jól követhető, mivel nem igényel forrasztást, ellenállásokat vagy külön áramköri elemeket – így ideális kezdőknek is. Fontos: az Arduino földpontját (GND) mindig közösíteni kell a DS1302 modul földjével. Ellenkező esetben a kommunikáció megbízhatatlan vagy sikertelen lehet. A huzalozást érdemes röviden, egymástól távol futtatva vezetni, különösen ha hosszabb tápkábelt használunk, így csökkenthető a zajérzékenység. Ha lehet, használjunk jumper-/dupont-csatlakozót vagy breadboardot, hogy ne kelljen forrasztani a teszteléshez.

Példaprogram – az óra beállítása és kiolvasása
A kód a Rtc by Makuna könyvtárat használja, amely számos más órachipet is támogat a DS1302-n kívül . Ennek telepítése egyszerű: az Arduino IDE-ben válaszd a Tools → Manage Libraries… menüpontot, majd keress rá a DS1302 kulcsszóra. A megjelenő listából telepítheted az Rtc by Makuna könyvtárat, amely biztosítja a fenti parancsok (GetDateTime, SetDateTime, , SetIsRunningGetIsRunning) elérhetőségét.

Az alábbi kód bemutatja, hogyan lehet a DS1302‑t csak az idő megjelenítésére használni. A kód tartalmazza a Clock Halt bit kezelését, amely biztosítja, hogy az óra valóban fusson. A SetIsRunning(false) sor gondoskodik arról, hogy az óra ne álljon meg, míg a SetIsWriteProtected(false) lehetővé teszi, hogy egyszer beállítsuk az időt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | /* Program neve: DS1302 RTC inicializálása és idő kiírása – Makuna könyvtárral Verzió: 1.4 Dátum: 2025. augusztus 19. Szerző: Cseh Róbert E-mail: avr@tavir.hu Web: https://www.tavir.hu Leírás: A program bemutatja, hogyan lehet egy DS1302 típusú valós idejű órát (RTC) használni Arduino-val. A kód inicializálja az órát, ha kell, beállítja az időt, majd folyamatosan kiírja az aktuális dátumot és időt a soros monitorra. A program a „Rtc by Makuna” könyvtárat használja, amely támogatja a DS1302, DS1307, DS3231 stb. RTC modulokat. Telepítéshez: Arduino IDE → Sketch (Vázlat) → Include Library → Manage Libraries… → „Rtc by Makuna” keresés → Install. Használt könyvtár: - Név: Rtc by Makuna - Verzió: 2.5.0 - URL: https://github.com/Makuna/Rtc Hardverkövetelmények: - Arduino UNO vagy kompatibilis mikrokontroller - DS1302 RTC modul (CR2032 gombelem ajánlott) Csatlakozások: - DS1302 CLK/SCLK → D5 - DS1302 DAT/IO → D4 - DS1302 RST/CE → D2 - VCC → 3.3V – 5V - GND → GND Felhasználási feltételek: Oktatási célokra szabadon felhasználható és módosítható. A szerző nevének feltüntetése kötelező. */ #include <RtcDS1302.h> // RTC kezeléséhez szükséges könyvtár #include <ThreeWire.h> // Háromvezetékes kommunikációt biztosító könyvtár // --- A DS1302 csatlakozása az Arduino-hoz --- // IO (adat) → D3 // SCLK (órajel) → D4 // CE (engedélyezés) → D2 ThreeWire myWire(3, 4, 2); // Három vezeték (IO, CLK, CE) inicializálása RtcDS1302<ThreeWire> Rtc(myWire); // RTC példány létrehozása void setup() { Serial.begin(9600); // Soros monitor elindítása 9600 bps-en // Kiírjuk, hogy mikor lett lefordítva a program (ez hasznos lehet összehasonlításhoz) Serial.print("Fordítás ideje: "); Serial.print(__DATE__); // Fordítás napja (pl. Aug 19 2025) Serial.print(" "); Serial.println(__TIME__); // Fordítás ideje (pl. 14:36:01) Rtc.Begin(); // RTC modul elindítása // A fordítás idejéből létrehozunk egy RtcDateTime objektumot RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__); // (Csak egyszer szükséges, pl. az első bekapcsolás után) Például: // rtc.setTime(12, 0, 0); // Óra:Perc:Másodperc // rtc.setDate(1, 1, 2023); // Nap:Hónap:Év // Kiírjuk a fordítás dátumát és idejét a soros monitorra Serial.print("Fordítás dátuma: "); Serial.print(compiled.Year()); Serial.print("."); Serial.print(compiled.Month()); Serial.print("."); Serial.println(compiled.Day()); Serial.print("Fordítás ideje: "); Serial.print(compiled.Hour()); Serial.print(":"); Serial.print(compiled.Minute()); Serial.print(":"); Serial.println(compiled.Second()); Serial.println(); // Ellenőrizzük, hogy az RTC idő érvényes-e (pl. ha nincs elem, nem működik) if (!Rtc.IsDateTimeValid()) { Serial.println("HIBA: Az RTC érvénytelen időt mutat!"); Serial.println("Lehet, hogy az elem lemerült vagy hiányzik."); Serial.println("Beállítjuk a fordítás idejét..."); Rtc.SetDateTime(compiled); // Ha érvénytelen, frissítjük a fordítás idejére } // Ha az RTC írásvédett, azt feloldjuk, hogy be tudjuk állítani az időt if (Rtc.GetIsWriteProtected()) { Serial.println("Az RTC írásvédett volt – írásvédelem kikapcsolása..."); Rtc.SetIsWriteProtected(false); } // Ha az RTC nem fut (pl. le volt merülve az elem), elindítjuk if (!Rtc.GetIsRunning()) { Serial.println("Az RTC nem futott – most elindítjuk..."); Rtc.SetIsRunning(true); } // Lekérjük az aktuális időt az RTC-ből RtcDateTime now = Rtc.GetDateTime(); // Ellenőrizzük, hogy az RTC ideje régebbi-e, mint a fordítás ideje if (now < compiled) { Serial.println("Az RTC órája régebbi, mint a fordítás ideje – frissítjük..."); Rtc.SetDateTime(compiled); } else if (now > compiled) { Serial.println("Az RTC órája újabb, mint a fordítás ideje. (Ez rendben van.)"); } else if (now == compiled) { Serial.println("Az RTC órája pontosan megegyezik a fordítás idejével. (Ritka, de nem gond.)"); } } void loop() { // A loop() folyamatosan fut – itt jelenítjük meg az időt 10 másodpercenként // Lekérjük az aktuális időt és dátumot az RTC-ből RtcDateTime now = Rtc.GetDateTime(); // Kiírjuk a dátumot a formátumban: ÉÉÉÉ.HH.NN Serial.print("Dátum: "); Serial.print(now.Year()); Serial.print("."); Serial.print(now.Month()); Serial.print("."); Serial.println(now.Day()); // Kiírjuk az időt a formátumban: ÓÓ:PP:MM Serial.print("Idő: "); Serial.print(now.Hour()); Serial.print(":"); Serial.print(now.Minute()); Serial.print(":"); Serial.println(now.Second()); Serial.println(); // Üres sor az olvashatóság érdekében // Ha az RTC hibás időt ad vissza (pl. lemerült elem), figyelmeztetünk if (!now.IsValid()) { Serial.println("HIBA: Az RTC elvesztette az időt – lehet, hogy az elem lemerült?"); } delay(10000); // 10 másodpercenként frissítjük a kijelzést } |
Megjegyzés: A SetDateTime sort csak egyszer kell futtatni az idő inicializálásához. Ezután a modul a beállított idő alapján fut tovább, a gombelemnek köszönhetően áramszünet esetén sem felejti el az értékeket.
Mit csinál a kód? – lépésenkénti magyarázat
A program az alábbi fő logikai részei az órakezeléskor:
Serial.begin(9600);– elindítja a soros kommunikációt, így láthatod a kimenetet a Serial Monitorban.rtc.begin;– az óramodul elindítása.Rtc.IsDateTimeValid(),GetIsWriteProtected()ésGetIsRunning()– az óra alapfunkciói működnek és beáéllíthatóak? Ha nem – engedélyezzük aSet...utasításpárjával.rtc.SetDateTime()és aGetDateTime()– a tényleges óraadatok beállítása és kiolvasása (óra és dátum egyben).- A
loop()részben másodpercenként kiíratjuk a dátumot és időt:Rtc.GetDateTime()és a kiírást aYear,Month,Day,Hour,Minute,Secondbontásokkal végezzük.
A kijelzés formátuma a programban: Dátum: 2025.8.20, Idő: 9:19:44. Ha valahol a programban kiadjuk a SetIsRunning(false); utasítást, akkor a beépített Clock Halt bitet beállítjuk és az óra energiatakarékos módba kapcsol és a a számlálás leáll. A kiíráskor ugyanazt a másodpercet látjuk a kijelzőn.
A kimenet tehát valós idő, amelyet a modul biztosít, és az Arduino soros portján keresztül jelenít meg. Például: Egy egyszerű adatnaplózó programhoz vagy időzített LED‑vezérléshez is jól használható – az időadatokat így eseményekhez vagy műveletekhez köthetjük.

Egységes dátum- és időformátum – miért fontos?
Ha az RTC-modulból kiolvasott idő így jelenik meg: 2025.8.1, 9:9:14, akkor az az első ránézésre még olvasható, de hosszabb távon nehézkessé válik. A megjelenítés ugyanis nem mindig követi a megszokott „kétjegyű” formátumot, ezért a számok elcsúszhatnak, a kijelzés rendezetlenné válhat. Ez különösen zavaró lehet naplózás, adattárolás vagy akár egyszerű soros monitoros figyelés közben. Átláthatóbb, ha minden szám két karakter szélességű: 2025.08.01, 09:09:14 formában.
Ezt egyszerűen megoldhatjuk, elég ha egy számjegy a kiírt adat, akkor egy 0-t elé rakni. Ezt egyszerű if feltételekkel gyorsan megoldhatjuk – így nem kell formázó függvényekkel bajlódni (és a kód kezdők számára is átlátható és jól olvasható marad).
Az előző programban a teljes loop() részt cseréljük ki:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | void loop() { // Lekérjük az aktuális dátumot és időt az RTC modulból RtcDateTime now = Rtc.GetDateTime(); // --- Dátum kiírása a soros monitorra --- Serial.print("Dátum: "); Serial.print(now.Year()); // Kiírjuk az évet (pl. 2025) Serial.print("."); // Ha a hónap kisebb mint 10, nullát teszünk elé (pl. "08" a "8" helyett) if (now.Month() < 10) Serial.print("0"); Serial.print(now.Month()); Serial.print("."); // Ha a nap kisebb mint 10, nullát teszünk elé (pl. "01" a "1" helyett) if (now.Day() < 10) Serial.print("0"); Serial.println(now.Day()); // --- Idő kiírása a soros monitorra --- Serial.print("Idő: "); // Óra formázása: ha kisebb mint 10, akkor 0-val kiegészítjük if (now.Hour() < 10) Serial.print("0"); Serial.print(now.Hour()); Serial.print(":"); // Perc formázása: szintén 0-val egészítjük ki, ha szükséges if (now.Minute() < 10) Serial.print("0"); Serial.print(now.Minute()); Serial.print(":"); // Másodperc formázása if (now.Second() < 10) Serial.print("0"); Serial.println(now.Second()); Serial.println(); // Üres sor a jobb olvashatóság érdekében // Ellenőrizzük, hogy az RTC érvényes időt ad-e vissza if (!now.IsValid()) { Serial.println("HIBA: Az RTC elvesztette az időt – lehet, hogy az elem lemerült?"); } delay(10000); // 10 másodpercenként frissítjük a kijelzést } |
És így a kapott eredmén ymár sokkal olvashatóbb:

Tippek
A DS1302 modul nemcsak az Arduino Classic vonallal, hanem ESP32 és ESP8266 alapú mikrokontrollerekkel is jól működik. Ennek több oka van:
- 3,3 V kompatibilitás
A DS1302 tápfeszültség-tartománya 2–5,5 V, ezért 3,3 V-os rendszeren is gond nélkül használható. ESP-k esetén mindig 3,3 V-ról tápláljuk a modult, és ügyeljünk arra, hogy a jelvonalakon se legyen 5 V-os szint. Így nincs szükség szintillesztésre. - Tetszőleges lábkiosztás
A cikkben használt Rtc by Makuna könyvtár a DS1302-t nem hardveres SPI vagy I²C periférián keresztül kezeli, hanem úgynevezett bit-bang módban. Ez azt jelenti, hogy a könyvtár maga állítja magas vagy alacsony szintre a lábakat, és ebből hozza létre a kommunikációt. Előnye, hogy bármelyik digitális GPIO-ra beköthető a három jelvezeték (CE, I/O, SCLK). - ESP-specifikus lábválasztás
Az ESP8266-nál célszerű kerülni a boot-módot befolyásoló lábakat (pl. GPIO0, GPIO2, GPIO15), az ESP32-nél pedig a strappoló vagy alvó módhoz tartozó lábakat. A legtöbb „általános” GPIO gond nélkül használható a DS1302 bekötéséhez. - Stabil működés 3,3 V-on
Rövid kábelezést alkalmazzunk, és a vezetékeket vezessük távol nagyáramú tápvonalaktól. Ha a kommunikáció bizonytalan, segíthet kis (33–100 Ω) soros ellenállás a jelvezetékeken. A CR2032 gombelem áramszünet esetén itt is megtartja az időt, a fő tápfeszültség (3,3 V) viszont elengedhetetlen a kommunikációhoz.
Összefoglalva: a DS1302 RTC modul az ESP32/ESP8266 rendszerekkel is ugyanúgy használható, mint Arduinóval – csak a megfelelő tápellátásra és a helyes lábválasztásra kell figyelni.
Hibakeresés – gyakori problémák
Egy valós idejű óra modullal való első kísérletezéskor gyakran előfordul, hogy látszólag minden rendben, mégsem frissül az idő. Ilyenkor érdemes végigmenni az alábbi pontokon:
- Clock Halt bit: Ellenőrizd, hogy benne van-e a
sor – enélkül az óra állva marad.SetIsRunning(false) - Tápellátás: Stabil 5 V tápfeszültség és közös föld az Arduino és a modul között.
- Gombelem: Ha nincs benne elem, az idő áramszünet után nullázódik.
- Soros monitor: Győződj meg róla, hogy a Serial Monitor baud rate-je 9600.
Fontos: Ha a modulban nincs gombelem, az idő minden áramszünet után nullázódik – ezt elkerülheted, ha biztosítod, hogy a CR2032 elem megfelelően be van helyezve és működőképes. Emellett győződj meg arról, hogy szerepel a sor – ez indítja el az órát. A stabil tápellátás (5 V és GND) szintén elengedhetetlen a pontos működéshez.SetIsRunning(false)
Gyakran ismételt kérdések
Kérdés: Miért használjunk DS1302 modult Arduino projektekben?
Válasz: A DS1302 egyszerű, alacsony fogyasztású valós idejű óra (RTC), ideális kezdők számára, mivel könnyen kezelhető, kedvező áron elérhető, és számos Arduino készlet része.
Kérdés: Milyen tápfeszültséget igényel a DS1302 RTC modul?
Válasz: A modul 2–5,5 V tápfeszültséggel működik, jól illeszkedik az Arduino rendszerekhez; a példákban tipikusan 5 V-os tápot alkalmazunk.
Kérdés: Mi az a Clock Halt bit és miért fontos?
Válasz: A Clock Halt (CH) bit leállítja az óra működését, ha 1-re van állítva. Ezt a bitet ki kell kapcsolni (SetIsRunning(false)), különben az idő nem fog számolni/telni.
Kérdés: Milyen lépésekből áll a DS1302 modul bekötése és használata?
Válasz: A DS1302 bekötése Arduino‑hoz (VCC, GND, CE/RST, I/O, SCLK) nagyon egyszerűen bármely digitális lábakra mehet. A használata az Arduinoba beépített library-k segítségével a legegyszerűbb.
Kérdés: Mi a teendő, ha a DS1302 modul nem működik vagy nem ad kis időt?
Válasz: Ellenőrizd, hogy szerepel-e a programodban az SetIsRunning(false) kód, stabil a tápod (mind az 5 V mind a közös GND), van-e működő CR2032 gombelemed, és helyes a soros monitor beállítása is (9600 baud).
Kérdés: Hogyan lehet továbbfejleszteni a DS1302 RTC alapú projektet?
Válasz: Például: az idő kijelzése I²C-s LCD‑en, naptárfunkciók, valós idejű adatnaplózás SD‑kártyára, vagy időzített vezérlések (például relé) megvalósítása.
Források
- A DS1307 órachip (RTC) használata [TavIR]
- DS1302 Library (Arduino official docs) [Arduino]
- Arduino library for the DS1302 RTC chip [GitHub / msparks]
- Real Time Clock – DS1302 (tutorial) [Instructables]
- DS1302 RTC module running too fast (Arduino StackExchange Q&A) [Arduino StackExchange]
Kapcsolódó cikkek:
– A digitális idő paradoxonja: az óraátállítás árnyoldalai
– DS1302 trükkök: RAM, írásvédelem, burst mód és csepptöltés (trickle charge)
– A DS1307 órachip (RTC) használata
– Pontos idő, nagy hatás: Miért fontos a precíziós időszolgáltatás?






