PCF8563 RTC órajelmodul
zoom_out_map
chevron_left chevron_right

A termékfotók tájékoztató jellegűek, és a gyártási tételtől és a beszállítótól függően kisebb eltéréseket mutathatnak. A termék specifikációi és árai előzetes értesítés nélkül változhatnak. Mindent megteszünk, hogy a lehető legpontosabb és leghitelesebb specifikációkat adjuk meg a termékoldalon, de lehetséges, hogy ezek nem teljesen helyesek. Ha ilyen esetet észlel, kérjük, jelentse nekünk.

A termék szakemberek számára készült, és használatához képzett, valamint felhatalmazott személyzet szükséges. A termék nem tartalmaz összeszerelési/használati útmutatót . A termék nem megfelelő képesítéssel rendelkező személyek általi üzembe helyezése a weboldalon található Általános Szerződési Feltételek értelmében a jótállás elvesztését eredményezi.

A megadott műszaki adatok (áram, teljesítmény stb.) ideális működési körülmények között érvényes maximális értékeket jelentenek. A biztonságos használat és az optimális élettartam érdekében javasolt a terméket folyamatos üzemben legfeljebb a megadott maximális értékek 50%-án használni.

PCF8563 RTC órajelmodul, I2C interfész, 1.0-5.5 V, riasztás és időzítő, érmeelem-tartó

Alacsony fogyasztással tartja meg az órát és a dátumot, ideális Arduino, Raspberry Pi és automatizálási projektekhez. A PCF8563 egyszerű I2C kommunikációt biztosít, 3.3 V vagy 5 V tápfeszültséggel, tartalék elemes működéssel, jó stabilitással a klasszikus DS1307 modulokhoz képest, kompakt méretekkel a könnyű beépítéshez a kapcsolásokba.

5,82 lei Adóval együtt

4,81 lei Áfa nélkül

(5/5) kívül 5 összes értékelés
Olvasd el a véleményeket
1-2 zile
check In Stoc

A termék megvásárlásával jár 0,29 lei hűségpont.

Jótállás: 24 hónap magánszemélyeknek
NEMZETKÖZI SZÁLLÍTÁS
Nemzetközi gyors szállítás az EU-n belül. Ingyenes szállítás 100 EUR feletti megrendelések esetén a legtöbb EU-országban.
GYORS KISZÁLLÍTÁS 24 ÓRÁN BELÜL
24 órán belül szállítunk raktárunkból
HŰSÉGPONTOK
Minden rendelés után pontokat kap, a rendelés értékének 5%-ában.

A PCF8563 áramkörrel szerelt RTC órajelmodul valós időben tartja nyilván az órát és a dátumot, és akkor is megőrzi azokat, ha a főtáplálás hiányzik, amíg a tartóban egy érme alakú elem van. Biztosítja a másodperceket, perceket, órákat, napot, a hét napját, a hónapot és az évet, az adatok pedig I2C interfészen keresztül olvashatók ki. Időbélyeges adatnaplózáshoz, riasztásokhoz, digitális órákhoz, ütemezett automatizálásokhoz és minden olyan projekthez alkalmas, amelynek újraindítás után is pontosan kell ismernie az időt.

A PCF8563 egy alacsony fogyasztású CMOS naptári óraáramkör, amely 32.768 kHz-es kristályt és frekvenciaosztót használ az 1 Hz-es időalap előállítására. Az óra- és naptárfunkción kívül az áramkör riasztással, időzítővel, VL jelzésű alacsony feszültség-detektorral és programozható órajel-kimenettel rendelkezik, amely 32.768 kHz, 1.024 kHz, 32 Hz vagy 1 Hz frekvenciát adhat. Az I2C interfész legfeljebb 400 kHz frekvenciát támogat, a 7 bites cím pedig 0x51.

A modul főbb jellemzői közé tartozik a SO8 tokozású PCF8563 áramkör (U4), a 32.768 kHz-es kristály (Y1), az érmeelem-tartó, a panelen elhelyezett két dióda és szűrőkondenzátorok, a két rögzítőfurat, valamint a J1 csatlakozó, amelynek 6 tűje INT, COT, SCL, SDA, GND és VCC jelöléssel rendelkezik. A tápellátás a VCC tűn keresztül, 1.0 - 5.5 V tartományban történik, a tápfeszültség elvesztése esetén pedig az óra a tartóba helyezett elemről tovább működik.

Az I2C interfésznek köszönhetően a modul kompatibilis Arduinóval, ESP32-vel, ESP8266-tal, STM32-vel, Raspberry Pi-vel és más I2C buszt biztosító platformokkal, mindössze két adatvezetékre, a tápfeszültségre és a földre van szükség.

 

Specifikációk:

Tápfeszültség: 1.0 - 5.5 VDC

Tartalék üzemi áram: 0.25 µA típusos (3.0 V és 25 °C esetén)

Órajel-áramkör: PCF8563 (SO8)

Interfész: I2C

I2C cím: 0x51 (7 bites)

Maximális I2C frekvencia: 400 kHz (legalább 1.8 V tápfeszültségnél)

Kristály: 32.768 kHz (Y1)

Szolgáltatott adatok: másodperc, perc, óra, nap, a hét napja, hónap, év, évszázad-jelző

Kiegészítő funkciók: riasztás, időzítő, alacsony feszültség-detektor (VL jelzés)

Programozható órajel-kimenet (COT): 32.768 kHz, 1.024 kHz, 32 Hz vagy 1 Hz

Megszakítási kimenet (INT): nyitott leürítésű (open-drain), alacsony szinten aktív

Tartalék táplálás: érmeelem-tartó

Csatlakozó: J1, 6 tű (INT, COT, SCL, SDA, GND, VCC)

 

Elrendezés:

Elem Funkció
J1 csatlakozó 6 tűs csatlakozó, felülről lefelé INT, COT, SCL, SDA, GND és VCC jelöléssel, a tápellátáshoz, az I2C busz és az áramkör két kimenete számára.
U4 áramkör (PCF8563) Valós idejű óra naptárral, riasztással, időzítővel és I2C interfésszel, SO8 tokozásban.
Y1 kristály 32.768 kHz-es kristály, amely az óra időalapját adja.
Érmeelem-tartó Táplálja az órát, amikor a modul tápellátása hiányzik, így az idő és a dátum megmarad.
D7 és D8 diódák Az elemtartó mellett, az óra tápkörében elhelyezett diódák.
Kondenzátorok A C10, C16 és C22 kondenzátorok, valamint egy elektrolit kondenzátor szűri az áramkör tápfeszültségét.
Rögzítőfurat Két furat a panel elemtartó felőli végén, a modul rögzítéséhez.

 

Kiosztás:

PCF8563 RTC órajelmodul pinkiosztása a J1 csatlakozóval

Csatlakozó Tű Funkció
J1 INT Nyitott leürítésű megszakítási kimenet, alacsony szinten aktív, a riasztás és az időzítő számára
J1 COT Programozható órajel-kimenet (CLKOUT), nyitott leürítésű, alapértelmezetten 32.768 kHz
J1 SCL I2C órajel
J1 SDA I2C adat
J1 GND Föld
J1 VCC Tápfeszültség 1.0 - 5.5 VDC

 

I2C paraméter Érték
7 bites cím 0x51
8 bites írási cím A2h
8 bites olvasási cím A3h

 

Használat:

A modulon nincsenek gombok, potenciométerek, jumperek vagy LED-ek, ezért az időt és a dátumot csak az I2C buszon keresztül lehet beállítani és olvasni.

Helyezzen a tartóba érmeelemet a helyes polaritással, a tartón feltüntetett típust ellenőrizve, hogy az óra a modul kikapcsolt állapotában is működjön.

Csatlakoztassa a VCC tűt a fejlesztőpanel tápellátásához, a GND tűt a földhöz, az SDA tűt az I2C adatvonalhoz, az SCL tűt pedig az I2C órajelvonalhoz. Figyelem, a J1 csatlakozón az SCL tű az SDA tű felett helyezkedik el, ami sok más modullal ellentétes.

Az 1.0 és 5.5 V közötti tartományban táplálja a modult, a fejlesztőpanel logikai szintjének megfelelően. Ne kapcsoljon 5.5 V fölé feszültséget, és ügyeljen a polaritásra.

Ha nem használja a riasztást, az időzítőt vagy az órajel-kimenetet, hagyja az INT és COT tűket csatlakoztatatlanul. Ha használja őket, mindegyikhez tegyen egy felhúzó (pull-up) ellenállást, mivel mindkét kimenet nyitott leürítésű.

Olvassa ki a 0x51 címet az I2C buszon, hogy ellenőrizze, a modul válaszol-e, majd állítsa be az időt és a dátumot az óra regisztereinek írásával. Az értékek BCD formátumban olvashatók és írhatók.

Ellenőrizze a másodperc regiszterben lévő VL jelzést. Ha értéke 1, az idő már nem garantált, újra be kell állítani, a másodpercek írása 0 értékű 7. bittel pedig törli a jelzést.

A stabil működéshez használjon rövid SDA és SCL vezetékeket, és cserélje ki az elemet, ha áramszünet után elveszik az idő. A pontosság a kristálytól függ, ezért a pontosságot igénylő alkalmazásokhoz hasznos az óra időszakos szinkronizálása.

33580
Tápfeszültség
1.0-5.5 V DC
Tűk száma
6 (INT, COT, SCL, SDA, GND, VCC)
Interfész
I2C
Üzemi frekvencia
400 kHz
Integrált áramkör
PCF8563
Készenléti fogyasztás
0.25 µA
I2C cím
0x51
Elemtípus
Gombelem

Produs destinat utilizarii in proiecte electronice, automatizari, prototipare, educatie si cercetare.

Produsul trebuie utilizat numai conform specificatiilor tehnice mentionate in descriere si/sau in documentatia produsului.

Avertismente generale de siguranta:

Nu utilizati produsul la tensiuni, curenti sau temperaturi peste valorile specificate.

Montajul si conectarea trebuie realizate de persoane cu cunostinte tehnice minime in domeniul electric/electronic.

Evitati scurtcircuitele, inversarea polaritatii si conectarea gresita a alimentarii.

Nu lasati produsul alimentat nesupravegheat in timpul testelor.

Produsul nu este jucarie si nu este destinat copiilor.

Pentru modulele electronice, se recomanda utilizarea in carcase, panouri sau montaje protejate, dupa caz.

Identificare produs:

Denumirea produsului, codul/SKU-ul si caracteristicile tehnice sunt mentionate in pagina produsului si/sau pe eticheta ambalajului.

Producator / Importator / Distribuitor:

Sigmanortec S.R.L.

Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania

E-mail: [email protected]

Website: www.sigmanortec.ro

Persoana responsabila in UE:

Sigmanortec S.R.L.

Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania

E-mail: [email protected]

Documentatie si siguranta:

Pentru informatii suplimentare, fise tehnice, declaratii de conformitate sau instructiuni, ne puteti contacta la [email protected].

/*
  PCF8563 RTC module test

  Board: Arduino Uno (Tools > Board > Arduino AVR Boards > Arduino Uno)
  Board package: Arduino AVR Boards (comes with the Arduino IDE)
  Libraries: none to install, the Wire library comes with the Arduino IDE

  Wiring:
    RTC VCC -> Arduino 5V
    RTC GND -> Arduino GND
    RTC SDA -> Arduino A4
    RTC SCL -> Arduino A5
    RTC INT and COT are not connected

  The program sets the clock from the compile time when the time was never
  set or the backup battery was lost, then prints the date and time every second.
*/

#include <Wire.h>

const uint8_t RTC_ADDRESS = 0x51;      // 7-bit I2C address of the PCF8563
const uint8_t REG_CONTROL_1 = 0x00;    // first register, control and status 1
const uint8_t REG_SECONDS = 0x02;      // seconds register, bit 7 is the VL flag
const bool FORCE_SET_TIME = false;     // set to true to rewrite the time at every start

const char *dayNames[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

// Convert a decimal number (0 - 99) to BCD
uint8_t decToBcd(uint8_t value) {
  return ((value / 10) << 4) | (value % 10);
}

// Convert a BCD number to decimal
uint8_t bcdToDec(uint8_t value) {
  return ((value >> 4) * 10) + (value & 0x0F);
}

// Day of the week from the date, 0 = Sunday
uint8_t dayOfWeek(uint16_t year, uint8_t month, uint8_t day) {
  static const uint8_t offsets[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  if (month < 3) {
    year -= 1;
  }
  return (year + year / 4 - year / 100 + year / 400 + offsets[month - 1] + day) % 7;
}

// Check if the module answers on the I2C bus
bool rtcPresent() {
  Wire.beginTransmission(RTC_ADDRESS);
  return Wire.endTransmission() == 0;
}

// Read several consecutive registers starting at startReg
bool readRegisters(uint8_t startReg, uint8_t *buffer, uint8_t length) {
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(startReg);
  if (Wire.endTransmission() != 0) {
    return false;
  }
  if (Wire.requestFrom(RTC_ADDRESS, length) != length) {
    return false;
  }
  for (uint8_t i = 0; i < length; i++) {
    buffer[i] = Wire.read();
  }
  return true;
}

// Write the compile date and time into the clock
void setTimeFromCompileTime() {
  const char *dateText = __DATE__;   // format: "Mmm dd yyyy"
  const char *timeText = __TIME__;   // format: "hh:mm:ss"
  const char *months = "JanFebMarAprMayJunJulAugSepOctNovDec";

  char monthName[4] = {dateText[0], dateText[1], dateText[2], 0};
  uint8_t month = (strstr(months, monthName) - months) / 3 + 1;
  uint8_t day = ((dateText[4] == ' ') ? 0 : (dateText[4] - '0')) * 10 + (dateText[5] - '0');
  uint16_t year = atoi(dateText + 7);
  uint8_t hour = (timeText[0] - '0') * 10 + (timeText[1] - '0');
  uint8_t minute = (timeText[3] - '0') * 10 + (timeText[4] - '0');
  uint8_t second = (timeText[6] - '0') * 10 + (timeText[7] - '0');

  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(REG_CONTROL_1);                          // start at control register 1
  Wire.write((uint8_t)0x00);                          // control 1: clock running
  Wire.write((uint8_t)0x00);                          // control 2: no alarm or timer flags
  Wire.write(decToBcd(second));                       // seconds, bit 7 = 0 clears the VL flag
  Wire.write(decToBcd(minute));                       // minutes
  Wire.write(decToBcd(hour));                         // hours
  Wire.write(decToBcd(day));                          // day of the month
  Wire.write(dayOfWeek(year, month, day));            // day of the week
  Wire.write(decToBcd(month));                        // month, century bit 0 means 20xx
  Wire.write(decToBcd(year % 100));                   // year (00 - 99)
  Wire.endTransmission();
}

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (!rtcPresent()) {
    Serial.println("PCF8563 not found, check the wiring");
    while (true) {
      delay(1000);
    }
  }
  Serial.println("PCF8563 found at address 0x51");

  uint8_t secondsRegister = 0;
  readRegisters(REG_SECONDS, &secondsRegister, 1);
  bool vlFlag = (secondsRegister & 0x80) != 0;        // 1 = time is not guaranteed

  if (vlFlag || FORCE_SET_TIME) {
    Serial.println("Time lost or forced, setting it from compile time");
    setTimeFromCompileTime();
  }
}

void loop() {
  uint8_t data[7];

  if (!readRegisters(REG_SECONDS, data, 7)) {
    Serial.println("Read error");
    delay(1000);
    return;
  }

  bool vlFlag = (data[0] & 0x80) != 0;
  uint8_t second = bcdToDec(data[0] & 0x7F);          // mask the VL bit
  uint8_t minute = bcdToDec(data[1] & 0x7F);
  uint8_t hour = bcdToDec(data[2] & 0x3F);
  uint8_t day = bcdToDec(data[3] & 0x3F);
  uint8_t weekday = data[4] & 0x07;
  uint8_t month = bcdToDec(data[5] & 0x1F);           // mask the century bit
  uint16_t year = 2000 + bcdToDec(data[6]);

  char buffer[40];
  snprintf(buffer, sizeof(buffer), "%04u-%02u-%02u %02u:%02u:%02u ",
           (unsigned int)year, (unsigned int)month, (unsigned int)day,
           (unsigned int)hour, (unsigned int)minute, (unsigned int)second);

  Serial.print(buffer);
  Serial.print(dayNames[weekday]);
  if (vlFlag) {
    Serial.print("  WARNING: time is not guaranteed");
  }
  Serial.println();

  delay(1000);                                        // one reading per second
}

Ebben a bemutatóban az Arduino Uno R3 fejlesztőlapot használjuk. A PCF8563 modul egy valós idejű óra (RTC) I2C interfésszel. Akkor is tárolja az órát és a dátumot, amikor a fejlesztőlap ki van kapcsolva, feltéve, hogy a tartóban van tartalék elem. Adatnaplózáshoz időbélyeggel, riasztásokhoz, digitális órákhoz, programozott automatizálásokhoz és minden olyan projekthez használható, amelynek újraindítás után is tudnia kell, mennyi az idő.

A modul a PCF8563 áramkört SO8 tokban tartalmazza, emellett egy 32.768 kHz-es kristályt (Y1) és egy gombelemes tartót. A panel szélén van egy 6 tűs J1 csatlakozó, amelyen az INT, COT, SCL, SDA, GND és VCC jelölések találhatók. A lapon nincsenek nyomógombok, potenciométerek, jumperek vagy LED-ek, ezért mindent, amit beállítunk, a programból végzünk.

Óramodul, RTC, PCF8563

Működés:

A 32.768 kHz-es kristály másodpercenként 32768-szor rezeg, vagyis 2 a 15. hatványon. Az áramkör ezt a frekvenciát 1 Hz-ig osztja, és minden impulzusnál növeli a másodperc-számlálót. A másodperc-számlálóból kapjuk a perceket, órákat, napot, a hét napját, a hónapot és az évet, amelyek mind belső regiszterekben tárolódnak.

A regiszterek értékei BCD formátumban vannak. Minden decimális számjegy 4 bitet foglal el, így a 45-ös másodperc 0x45-ként olvasható, nem 0x2D-ként. A program a BCD-ből decimálisra a (v >> 4) * 10 + (v AND 0x0F) képlettel, fordítva pedig a ((v / 10) << 4) OR (v MOD 10) képlettel alakít.

A 0x02-es regiszter (másodpercek) 7. bitje a VL (voltage low) jelző. Ha értéke 1, a tápfeszültség túlságosan lecsökkent, vagy az oszcillátor leállt, és az idő már nem garantált. A másodpercek írásakor a 7. bitet 0-ra állítva a jelző törlődik. A 0x07-es regiszter (hónap) 7. bitje az évszázadbit, amelyet az áramkör akkor vált át, amikor az év 99-ről 00-ra fordul. A programban a 0 érték a 20xx éveket jelenti.

Az áramkörnek van riasztása, időzítője és programozható órakimenete a COT (CLKOUT) lábon, amelynek frekvenciája 32.768 kHz, 1.024 kHz, 32 Hz vagy 1 Hz lehet, a 0x0D címen lévő regiszterben állítva. Az INT láb megszakítási kimenet, nyitott nyelő (open-drain) típusú, alacsony szintre aktív. Ebben a bemutatóban csak az időt és a dátumot olvassuk, így a COT és az INT lábak nincsenek bekötve.

A pontosságot csak a kristály határozza meg, mert az áramkör nem végez hőmérséklet-kompenzációt. Egy 20 ppm-es eltérésű kristály (példaként megadott érték) közelítőleg 20 x 86400 / 1000000 = 1.7 másodpercet jelent naponta, ami havonta körülbelül 50 másodperc. Adatnaplózáshoz ez bőven elég, precíziós órához viszont időszakos szinkronizálás szükséges.

A 7 bites I2C-cím 0x51. Az áramkör dokumentációjában a 8 bites A2h írási és A3h olvasási címek szerepelnek, az Arduino Wire könyvtára viszont a 7 bites címmel dolgozik, vagyis 0x51-gyel.

 

Csatlakoztatás:

A modult az Arduino Uno 5V lábáról tápláljuk. A PCF8563 1.0 és 5.5 V között működik, így az 5 V megfelelő, az I2C busz logikai szintjei pedig kompatibilisek az Uno szintjeivel, ezért nincs szükség szintillesztőre. Ha 3.3 V-os lapot használunk, a modult a 3.3 V-os lábról tápláljuk. Az Arduino lapot a számítógép táplálja az USB A-B kábelen keresztül. Helyezze a gombelemet a tartóba a helyes polaritással, miközben ellenőrzi a tartón feltüntetett típust.

Termék láb Csatlakozik ide Szerep
VCC 5V Modul tápellátás
GND GND Közös föld
SDA A4 I2C adat
SCL A5 I2C óra
INT Nincs bekötve Megszakítási kimenet riasztáshoz és időzítőhöz, itt nem használt
COT Nincs bekötve Programozható CLKOUT órakimenet, itt nem használt

Az RTC PCF8563 óramodul csatlakoztatása Arduino Uno R3-hoz I2C-n keresztül

Az Arduino Uno R3 lapon az AREF melletti SDA és SCL lábak ugyanazok a jelek, mint az A4 és A5, így ezek helyett is használhatók. A csatlakozó lábait bekötve vegye figyelembe, hogy a lapon felülről lefelé a sorrend INT, COT, SCL, SDA, GND, VCC. Figyeljen az SDA és SCL sorrendjére, mert sok modulhoz képest fordított. Stabil I2C buszhoz rövid vezetékeket használjon.

 

Lap és könyvtárak:

Az Arduino IDE-ben válassza a Tools > Board > Arduino AVR Boards > Arduino Uno menüpontot. Az Arduino AVR Boards csomag az Arduino IDE-vel együtt érkezik, így a File > Preferences menüben nem kell címet megadni. Ezután válassza ki a lap portját a Tools > Port menüben.

A program csak a Wire könyvtárat használja, amely az Arduino IDE-vel együtt érkezik, így nem kell könyvtárat telepíteni. Közvetlenül az áramkör regisztereivel dolgozunk, hogy pontosan lássa, mit olvasunk és mit írunk.

 

A kód:

A program az időt a fordítási időből állítja be, ha az időt soha nem állították be, vagy ha az elemet kivették, majd másodpercenként kiírja a dátumot és az időt.

/*
  PCF8563 RTC module test
  Board: Arduino Uno (Tools > Board > Arduino AVR Boards > Arduino Uno)
  Board package: Arduino AVR Boards (comes with the Arduino IDE)
  Libraries: none to install, the Wire library comes with the Arduino IDE
  Wiring:
    RTC VCC -> Arduino 5V
    RTC GND -> Arduino GND
    RTC SDA -> Arduino A4
    RTC SCL -> Arduino A5
    RTC INT and COT are not connected
  The program sets the clock from the compile time when the time was never
  set or the backup battery was lost, then prints the date and time every second.
*/
#include <Wire.h>
const uint8_t RTC_ADDRESS = 0x51;      // 7-bit I2C address of the PCF8563
const uint8_t REG_CONTROL_1 = 0x00;    // first register, control and status 1
const uint8_t REG_SECONDS = 0x02;      // seconds register, bit 7 is the VL flag
const bool FORCE_SET_TIME = false;     // set to true to rewrite the time at every start
const char *dayNames[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Convert a decimal number (0 - 99) to BCD
uint8_t decToBcd(uint8_t value) {
  return ((value / 10) << 4) | (value % 10);
}
// Convert a BCD number to decimal
uint8_t bcdToDec(uint8_t value) {
  return ((value >> 4) * 10) + (value & 0x0F);
}
// Day of the week from the date, 0 = Sunday
uint8_t dayOfWeek(uint16_t year, uint8_t month, uint8_t day) {
  static const uint8_t offsets[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  if (month < 3) {
    year -= 1;
  }
  return (year + year / 4 - year / 100 + year / 400 + offsets[month - 1] + day) % 7;
}
// Check if the module answers on the I2C bus
bool rtcPresent() {
  Wire.beginTransmission(RTC_ADDRESS);
  return Wire.endTransmission() == 0;
}
// Read several consecutive registers starting at startReg
bool readRegisters(uint8_t startReg, uint8_t *buffer, uint8_t length) {
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(startReg);
  if (Wire.endTransmission() != 0) {
    return false;
  }
  if (Wire.requestFrom(RTC_ADDRESS, length) != length) {
    return false;
  }
  for (uint8_t i = 0; i < length; i++) {
    buffer[i] = Wire.read();
  }
  return true;
}
// Write the compile date and time into the clock
void setTimeFromCompileTime() {
  const char *dateText = __DATE__;   // format: "Mmm dd yyyy"
  const char *timeText = __TIME__;   // format: "hh:mm:ss"
  const char *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
  char monthName[4] = {dateText[0], dateText[1], dateText[2], 0};
  uint8_t month = (strstr(months, monthName) - months) / 3 + 1;
  uint8_t day = ((dateText[4] == ' ') ? 0 : (dateText[4] - '0')) * 10 + (dateText[5] - '0');
  uint16_t year = atoi(dateText + 7);
  uint8_t hour = (timeText[0] - '0') * 10 + (timeText[1] - '0');
  uint8_t minute = (timeText[3] - '0') * 10 + (timeText[4] - '0');
  uint8_t second = (timeText[6] - '0') * 10 + (timeText[7] - '0');
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(REG_CONTROL_1);                          // start at control register 1
  Wire.write((uint8_t)0x00);                          // control 1: clock running
  Wire.write((uint8_t)0x00);                          // control 2: no alarm or timer flags
  Wire.write(decToBcd(second));                       // seconds, bit 7 = 0 clears the VL flag
  Wire.write(decToBcd(minute));                       // minutes
  Wire.write(decToBcd(hour));                         // hours
  Wire.write(decToBcd(day));                          // day of the month
  Wire.write(dayOfWeek(year, month, day));            // day of the week
  Wire.write(decToBcd(month));                        // month, century bit 0 means 20xx
  Wire.write(decToBcd(year % 100));                   // year (00 - 99)
  Wire.endTransmission();
}
void setup() {
  Serial.begin(9600);
  Wire.begin();
  if (!rtcPresent()) {
    Serial.println("PCF8563 not found, check the wiring");
    while (true) {
      delay(1000);
    }
  }
  Serial.println("PCF8563 found at address 0x51");
  uint8_t secondsRegister = 0;
  readRegisters(REG_SECONDS, &secondsRegister, 1);
  bool vlFlag = (secondsRegister & 0x80) != 0;        // 1 = time is not guaranteed
  if (vlFlag || FORCE_SET_TIME) {
    Serial.println("Time lost or forced, setting it from compile time");
    setTimeFromCompileTime();
  }
}
void loop() {
  uint8_t data[7];
  if (!readRegisters(REG_SECONDS, data, 7)) {
    Serial.println("Read error");
    delay(1000);
    return;
  }
  bool vlFlag = (data[0] & 0x80) != 0;
  uint8_t second = bcdToDec(data[0] & 0x7F);          // mask the VL bit
  uint8_t minute = bcdToDec(data[1] & 0x7F);
  uint8_t hour = bcdToDec(data[2] & 0x3F);
  uint8_t day = bcdToDec(data[3] & 0x3F);
  uint8_t weekday = data[4] & 0x07;
  uint8_t month = bcdToDec(data[5] & 0x1F);           // mask the century bit
  uint16_t year = 2000 + bcdToDec(data[6]);
  char buffer[40];
  snprintf(buffer, sizeof(buffer), "%04u-%02u-%02u %02u:%02u:%02u ",
           (unsigned int)year, (unsigned int)month, (unsigned int)day,
           (unsigned int)hour, (unsigned int)minute, (unsigned int)second);
  Serial.print(buffer);
  Serial.print(dayNames[weekday]);
  if (vlFlag) {
    Serial.print("  WARNING: time is not guaranteed");
  }
  Serial.println();
  delay(1000);                                        // one reading per second
}

 

A kód működése:

A kód elején találhatók a definíciók. A RTC_ADDRESS az áramkör 7 bites I2C-címe, azaz 0x51. A REG_CONTROL_1 az első regiszter (0x00), a REG_SECONDS pedig a másodpercek regisztere (0x02), amelynek 7. bitje a VL jelző. A FORCE_SET_TIME állandó, ha true-ra állítja, minden indításkor felülírja az időt. A dayNames tömb a napok neveit tartalmazza abban a sorrendben, ahogy a program számozza őket, a vasárnaptól kezdve 0-val.

A decToBcd és bcdToDec függvények a decimális szám és a regiszterekben használt BCD formátum között konvertálnak. A dayOfWeek függvény a dátumból számolja ki a hét napját, mert az óra ezt nem tudja magától, nekünk kell kiszámolnunk. Az rtcPresent függvény egy üres átvitelt küld a 0x51 címre, és true értékkel tér vissza, ha a modul válaszol.

A readRegisters függvény elküldi a kezdő regiszter címét, majd a Wire.requestFrom segítségével length bájtot kér, és ezeket a pufferbe teszi. Az áramkör automatikusan növeli a regiszter címét, így egyetlen kéréssel a másodperctől az évig minden értéket beolvasunk.

A setTimeFromCompileTime függvény a __DATE__ és __TIME__ makrókból veszi ki a dátumot és az időt, a hónapot a months karakterlánc-beli pozíciója alapján számítja ki, és sorrendben írja a 0x00-tól 0x08-ig terjedő regisztereket. A másodperceket a 7. bit 0-ra állításával írja, ami törli a VL jelzőt, a hónap évszázadbitje pedig 0 marad.

A setup részben 9600 baudon elindítjuk a soros portot, és a Wire.begin paranccsal az I2C buszt. Ha az rtcPresent false értéket ad, a program hibaüzenetet ír ki és leáll. Egyébként beolvassuk a másodpercek regiszterét, és ha a vlFlag értéke 1, vagy a FORCE_SET_TIME true, meghívjuk a setTimeFromCompileTime függvényt.

A loop részben a 0x02-es címtől kezdve 7 regisztert olvasunk be a data tömbbe. Minden értékből kimaszkoljuk a számhoz nem tartozó biteket (0x7F a másodpercekhez és percekhez, 0x3F az órákhoz és naphoz, 0x1F a hónaphoz), majd BCD-ből konvertáljuk. Az évet 2000 plusz az évregiszter értéke adja. A sort a snprintf formázza, kiírjuk a napnévvel együtt, és ha a vlFlag értéke 1, figyelmeztetéssel. A végén a delay(1000) másodpercenként egy olvasást ad.

 

Eredmény:

Nyissa meg a Serial Monitort a Tools menüből, és állítsa a sebességet 9600 baudra. Első indításkor megjelennek a modul megtalálásáról és az idő beállításáról szóló üzenetek, majd másodpercenként egy sor a dátummal, idővel és a hét napjával. A további indításoknál az időt nem állítja be újra, amíg az elem a tartóban van.

PCF8563 found at address 0x51
Time lost or forced, setting it from compile time
2025-03-14 10:22:31 Friday
2025-03-14 10:22:32 Friday
2025-03-14 10:22:33 Friday
2025-03-14 10:22:34 Friday
2025-03-14 10:22:35 Friday
2025-03-14 10:22:36 Friday

 

Gyakori problémák:

A soros monitoron a PCF8563 not found üzenet jelenik meg. Ennek oka általában a hibás bekötés vagy a hiányzó táplálás. Ellenőrizze, hogy az SDA az A4-re, az SCL pedig az A5-re csatlakozik, figyelembe véve, hogy a csatlakozón az SCL van az SDA felett, és hogy a VCC 5V-ra, a GND pedig GND-re van kötve.

A soros monitoron semmi nem jelenik meg, vagy furcsa karakterek láthatók. Ennek oka a rossz sebesség. Állítsa a Serial Monitorban 9600 baudra, és ellenőrizze, hogy a kiválasztott port az Arduino Uno portja.

Minden áramkimaradás után rossz az idő. Ennek oka a tartóban lévő elem hiánya vagy lemerülése, illetve a fordított polaritású behelyezés. Tegyen be megfelelő elemet, majd állítsa a FORCE_SET_TIME értékét true-ra, töltse fel a programot egyszer, utána pedig állítsa vissza false-ra.

Megjelenik a time is not guaranteed figyelmeztetés. A VL jelző 1, vagyis a tápfeszültség túlságosan lecsökkent, vagy az oszcillátor leállt. Állítsa be újra az órát, és ha a figyelmeztetés visszatér, cserélje ki az elemet.

Az idő a fordítási időre áll be, de néhány másodperces késéssel. Ennek oka a fordítás és a program lapra töltése közötti idő. A pontos időhöz állítsa be az órát külső forrásból, például a számítógépről vagy egy időszerverről.

Az óra néhány másodpercet tér el havonta. Ez normális, mert a pontosságot a kristály határozza meg, az áramkör pedig nem végez hőmérséklet-kompenzációt. Ha jobb pontosságra van szüksége, szinkronizálja rendszeresen az órát.

 

Korlátok és tanácsok:

Az óra 1.0 és 5.5 V között működik, de 400 kHz-es I2C kommunikációhoz a tápfeszültségnek legalább 1.8 V-nak kell lennie. A pontosságot a 32.768 kHz-es kristály határozza meg, amely a hőmérséklettel változik, így nem helyettesít hőmérséklet-kompenzált órát ott, ahol havonta a törtmásodpercek is számítanak.

A modul csak addig tartja az időt, amíg a tartóban jó állapotú elem van, a tartalék üzemmódban felvett áram pedig nagyon kicsi, jellemzően 0.25 µA 3.0 V-on és 25 °C-on. Ha az INT és a COT kimeneteket használja, húzó ellenállásokat (pull-up) adjon hozzá, mert mindkettő nyitott nyelő kimenet.

A továbbiakban használhatja az áramkör riasztását és időzítőjét is, az INT kimenetet megszakítási bemenetre kötve, hogy az Arduino-t kis fogyasztású üzemmódból felébressze. A COT kimenetet 1 Hz-en időalapként használhatja más áramkörökhöz, vagy az SD-kártyára időbélyeges adatnaplót építhet.