Skip to main content

MCP79412-RTC

Overview

MCP79412

The MCP79412 from Microchip Technology is a low-power, I²C-based real-time clock/calendar (RTCC) with integrated EEPROM, SRAM, and a unique ID. It provides highly accurate timekeeping (seconds, minutes, hours, day, date, month, year) and includes alarm functions, power-fail timestamping, and battery backup support, making it ideal for applications that require reliable time and date tracking.

info

Check the back of the RTC module: modules marked “M” use the MCP79412, while those marked “P” use the PCF8563.

MCP79412-result

Pin Configuration

  • VCC → VCC
  • GND → GND
  • CLK → SCK / Any GPIO
  • SDA → SDA
  • SCL → SCL
  • B → No connection / Internally connected to the 3V battery
info

Install a 3V Lithium Cell (CR1220) on the RTC module to retain time when the main circuit is powered off. The module can also operate without a battery if the circuit remains powered.

Key Features

  • I²C Interface (400 kHz Fast Mode)
  • Timekeeping: seconds, minutes, hours, day, date, month, year with leap year compensation
  • Two Alarms with programmable match options
  • Battery Backup with automatic switchover
  • Power-Fail Timestamp (records time of power loss)
  • 64 Bytes SRAM + 1 Kbit EEPROM (non-volatile storage)
  • Unique 64-bit ID (factory-programmed)
  • Digital Trimming for oscillator accuracy adjustment
  • Operating Voltage: 1.8V – 5.5V
  • Temperature Range: −40 °C to +85 °C (industrial)

Applications

  • Data loggers and metering systems
  • Security and access control devices
  • Consumer electronics (appliances, clocks, timers)
  • Automotive time-stamping and scheduling
  • Embedded systems requiring alarms, scheduling, or backup timekeeping

Step 1: Hardware Required

  1. Glyph Boards
  2. GMOD MCP79412 RTC

Step 2: Circuit Diagram

MCP79412-CIRCUIT-DIAGRAM

Step 3: Code Setup

  1. Open Arduino IDE.
  2. Make sure to install the library
  3. Copy and paste the following code into the Arduino IDE:
// You can downlaod PCBCUPID_MCP79412 from here https://github.com/pcbcupid/PCBCUPID-MCP79412 
#include <Wire.h>
#include "PCBCUPID_MCP79412.h"
#include <TimeLib.h>

PCBCUPID_MCP79412RTC rtc;
tmElements_t tm;

// Helper to read an integer cleanly from Serial, flushing leftover chars
int readIntFromSerial() {
while (!Serial.available()) {
delay(10);
}
int val = Serial.parseInt();
while (Serial.available()) Serial.read(); // flush
return val;
}

void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println(F("\r\n=======PCBCUPID_MCP79412 RTC Test Menu ==========\r\n"));
Serial.println(F("0: Wire.begin() default pins\r\n1: Wire.begin(sda,scl,clockFreq)\r\n2: Wire.begin(TwoWire*)"));
Serial.println(F("Type 0-2 to select I2C init mode....."));

uint8_t mode =
readIntFromSerial();

// These are different way's to initialize the I2C of RTC module

switch (mode)
{
case 0:
rtc.begin();
Serial.println(F(">>>Wire.begin() with default pins\r\n"));
break;
case 1:
rtc.begin(4, 5, 400000); // ESP32 based glyph default SDA/SCL
Serial.println(F(">>>Wire.begin(4,5,400kHz)\r\n"));
break;
case 2:
rtc.begin(&Wire);
Serial.println(F(">>>Wire.begin() using custom Twowire instance\r\n"));
break;
default:
Serial.println(F("Invalid Input, using default Wire.begin()\r\n"));
Wire.begin();
}

Serial.println(F("**********RTC Function Modes*************"));
Serial.println(F("3. Set RTC using setTime() + now()"));
Serial.println(F("4. Set RTC using tmElements_t"));
Serial.println(F("5: Set RTC using compile time"));
Serial.println(F("Type 3-5 to select RTC mode..."));

mode = readIntFromSerial();

// below are the different mode to setup the time for the RTC module

switch (mode)
{
case 3:
setTime(3, 43, 45, 20, 5, 2025); // HH, MM, SS, DD, MM, YYYY
rtc.set(now());
Serial.println(F(">> RTC set using setTime() + now()\r\n"));
break;

case 4:
tm.Hour = 23;
tm.Minute = 31;
tm.Second = 30;
tm.Year = 2009 - 1970;
tm.Month = 5;
tm.Day = 20;
tm.Wday = dowTuesday;
rtc.write(tm);
Serial.println(F(">> RTC set using tmElements_t structure\r\n"));
break;

case 5:
setTime(compileTime());
rtc.set(now());
Serial.println(F(">> RTC set using sketch compile time\r\n"));
break;

default:
Serial.println(F("Invalid RTC mode, terminating.\r\n"));
while (true)
;
}
delay(500);
}

void loop()
{
Serial.println(F("\r\n--- Current Time ---"));
printTime(now());

if (rtc.read(tm))
{
Serial.print(F("RTC tmElements_t: "));
Serial.print(tm.Hour); Serial.print(':');
printI00(tm.Minute, ':');
printI00(tm.Second, ' ');
Serial.print(tm.Year + 1970);
Serial.print('/');
Serial.print(tm.Month);
Serial.print('/');
Serial.println(tm.Day);
}
else
{
Serial.println(F("Failed to read RTC time using .read()"));
}
delay(3000);
}

void printTime(time_t t)
{
printI00(hour(t), ':');
printI00(minute(t), ':');
printI00(second(t), ' ');
Serial.print(dayShortStr(weekday(t)));
Serial.print(' ');
printI00(day(t), ' ');
Serial.print(monthShortStr(month(t)));
Serial.print(' ');
Serial.println(year(t));
}

void printI00(int value, char delimiter)
{
if (value < 10)
Serial.print('0');
Serial.print(value);
Serial.print(delimiter);
}

time_t compileTime()
{
const char *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
char monthstr[4];
tmElements_t tm;
strncpy(monthstr, __DATE__, 3);
monthstr[3] = '\0';

tm.Month = (strstr(months, monthstr) - months) / 3 + 1;
tm.Day = atoi(__DATE__ + 4);
tm.Year = atoi(__DATE__ + 7) - 1970;

char buf[3];

memcpy(buf, __TIME__, 2);
buf[2] = '\0';
tm.Hour = atoi(buf);

memcpy(buf, __TIME__ + 3, 2);
buf[2] = '\0';
tm.Minute = atoi(buf);

memcpy(buf, __TIME__ + 6, 2);
buf[2] = '\0';
tm.Second = atoi(buf);

return makeTime(tm) + 15; // fudge factor
}

Step 4: Upload the Code

  1. Connect the Board
  • Connect your GLYPH board to your computer
  1. Select the Board and Port

Do the following settings in your Arduino IDE,

  • Tools > Board > esp32 > Pcbcupid GLYPH C3
warning

For the Pcbcupid Glyph C3 to appear under Tools > Board > esp32, the esp32 board version installed in the Arduino IDE should be greater or equal to 3.1.0.

  • Tools > Port and select the port connected to your GLYPH.
  • Tools > USB CDC on Boot > Enabled
warning

If USB CDC on BOOT not enabled, you won't be seeing any serial data on Arduino IDE.

  1. Upload the Code

    • Click the upload button (➡️ icon) or use the shortcut CRTL + U in Arduino IDE to upload the code to the board.

Step 5: Observe the Output

The RTC module tracks time independently. With the onboard 3V Lithium Cell (CR1220), it continues timekeeping even when the GLYPH is powered off.

MCP79412-result