- Notifications
You must be signed in to change notification settings - Fork4
This library enables you to use RTC from RP2040-based boards such as Nano_RP2040_Connect, RASPBERRY_PI_PICO. This RP2040-based RTC, using Interrupt, has no battery backup. Time will be lost when powered down. To need NTP-client to update RTC every start-up.
License
khoih-prog/RP2040_RTC
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
- Why do we need this RP2040_RTC library
- Changelog
- Prerequisites
- Installation
- Libraries' Patches
- Usage
- Examples
- Example RP2040_RTC_Time_WiFiNINA
- Debug Terminal Output Samples
- 1. RP2040_RTC_Time_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
- 2. RP2040_RTC_Time_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
- 3. RP2040_RTC_Time_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
- 4. RP2040_RTC_Alarm_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
- 5. RP2040_RTC_Alarm_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
- 6. RP2040_RTC_Alarm_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
- Troubleshooting
- Issues
- TO DO
- DONE
- Contributions and Thanks
- Contributing
- License
- Copyright
Why do we need thisRP2040_RTC library
This is an Arduino library forRP2040-based RTC
The RTC keeps track of time in human readable format and generates events when the time is equal to a preset value.Think of a digital clock, not epoch time used by most computers. There are seven fields, one each for year (12 bit),month (4 bit), day (5 bit), day of the week (3 bit), hour (5 bit) minute (6 bit) and second (6 bit), storing the data in binaryformat.
The examples will demonstrate how to get the UTC time from NTP server, then update the RTC to make sure the time is perfectly correct.
Imagine you have a system with amission-critical function, measuring water level and control the sump pump or doing something much more important. You normally use a software timer to poll, or even place the function in loop(). But what if another function isblocking the loop() or setup().
So your functionmight not be executed, and the result would be disastrous.
You'd prefer to have your function called, no matter what happening with other functions (busy loop, bug, etc.).
The correct choice is to use an ISR-based Alarm withInterrupt to call your function.
These ISR-based Alarm, using interrupt, still work even if other functions are blocking. Moreover, they are much moreprecise (certainly depending on clock frequency accuracy) than other software timers using millis() or micros(). That's necessary if you need to measure some data requiring better accuracy.
Functions using normal software timers, relying on loop() and calling millis(), won't work if the loop() or setup() is blocked by certain operation. For example, certain function is blocking while it's connecting to WiFi or some services.
The catch isyour function is now part of an ISR (Interrupt Service Routine), and must be lean / mean, and follow certain rules. More to read on:
- RP2040-based boards, such asNANO_RP2040_CONNECT, RASPBERRY_PI_PICO, RASPBERRY_PI_PICO_W, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040, usingArduino-mbed RP2040 core orEarle Philhower's arduino-pico core
- W5x00 using
Ethernet_Generic
library - W5100S shield /module, using
Ethernet_Generic
library, such asWIZnet Ethernet HAT andW5100S-EVB-Pico
WiFiNINA
usingWiFiNINA_Generic
libraryCYW43439 WiFi
with RASPBERRY_PI_PICO_W usingarduino-pico core
Arduino mbed_rp2040 core 3.3.0+
for Arduino RP2040-based boards, such asArduino Nano RP2040 Connect, RASPBERRY_PI_PICO, etc..Earle Philhower's arduino-pico core v2.5.4+
for RP2040-based boards such asRASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040, etc.Timezone_Generic library v1.10.0+
to use examples using Timezone.WiFiNINA_Generic library v1.8.14-6+
to use WiFiNINA modules/shields.Depending on which Ethernet card/module/shield you're using:
Ethernet_Generic library v2.6.1+
for W5100, W5200 and W5500/WIZ550io/WIZ850io/USR-ES1 with Wiznet W5500 chip.EthernetENC library v2.0.3+
for ENC28J60..New and Better
The best and easiest way is to useArduino Library Manager
. Search forRP2040_RTC, then select / install the latest version.You can also use this link for more detailed instructions.
Another way to install is to:
- Navigate toRP2040_RTC page.
- Download the latest release
RP2040_RTC-main.zip
. - Extract the zip file to
RP2040_RTC-main
directory - Copy whole
RP2040_RTC-main
folder to Arduino libraries' directory such as~/Arduino/libraries/
.
- InstallVS Code
- InstallPlatformIO
- InstallRP2040_RTC library by usingLibrary Manager. Search forRP2040_RTC inPlatform.io Author's Libraries
- Please visit documentation for the other options and examples atProject Configuration File
If your application requires 2K+ HTML page, the currentEthernet library
must be modified if you are using W5200/W5500 Ethernet shields. W5100 is not supported for 2K+ buffer. If you use boards requiring different CS/SS pin for W5x00 Ethernet shield, for example ESP32, ESP8266, nRF52, etc., you also have to modify the following libraries to be able to specify the CS/SS pin correctly.
To fixEthernet library
, just copy these following files into theEthernet library
directory to overwrite the old files:
To fixEthernetLarge library
, just copy these following files into theEthernetLarge library
directory to overwrite the old files:
To fixEthernet2 library
, just copy these following files into theEthernet2 library
directory to overwrite the old files:
To add UDP Multicast support, necessary for theUPnP_Generic library:
- To fix
Ethernet3 library
, just copy these following files into theEthernet3 library
directory to overwrite the old files:
To be able to compile and run on nRF52 boards with ENC28J60 using UIPEthernet library, you have to copy these following files into the UIPEthernetutility
directory to overwrite the old files:
FromRaspberry Pi Pico C/C++ SDK
typedef void(* rtc_callback_t )(void);typedef struct { int16_t year; ///< 0..4095 int8_t month; ///< 1..12, 1 is January int8_t day; ///< 1..28,29,30,31 depending on month int8_t dotw; ///< 0..6, 0 is Sunday int8_t hour; ///< 0..23 int8_t min; ///< 0..59 int8_t sec; ///< 0..59} datetime_t;
void rtc_init (void);bool rtc_set_datetime (datetime_t *t);bool rtc_get_datetime (datetime_t *t);bool rtc_running (void);void rtc_set_alarm (datetime_t *t, rtc_callback_t user_callback);void rtc_enable_alarm (void);void rtc_disable_alarm (void);// Not very good to usevoid datetime_to_str (char *buf, uint buf_size, const datetime_t *t);
Use one of these functions withinterval in unsigned long microseconds
void rtc_disable_alarm (void)
Disable the RTC alarm (if active)
void rtc_enable_alarm (void)
Enable the RTC alarm (if inactive)
bool rtc_get_datetime (datetime_t *t)
Get the current time from the RTC.
Parameters
•t
: Pointer to a datetime_t structure to receive the current RTC time
Returns
•true
if datetime is valid,false
if the RTC is not running.
void rtc_init (void)
Initialise the RTC system.
bool rtc_running (void)
Is the RTC running?
void rtc_set_alarm (datetime_t *t, rtc_callback_t user_callback)
Set a time in the future for the RTC to call a user provided callback.
Parameters
•t
: Pointer to a datetime_t structure containing a time in the future to fire the alarm. Any values set to -1 will not bematched on.•user_callback
: pointer to artc_callback_t
to call when the alarm fires
bool rtc_set_datetime (datetime_t *t)
Set the RTC to the specified time.
Parameters
•t
: Pointer to a datetime_t structure contains time to set
Returns
•true
if set,false
if the passed in datetime was invalid.
void datetime_to_str (char *buf, uint buf_size, const datetime_t *t)
Convert a datetime_t structure to a string.
Parameters
•buf
: character buffer to accept generated string•buf_size
: The size of the passed in buffer•t
: The datetime to be converted
class TimeSpan;class DateTime;/** ISO 8601 Timestamp function */enum timestampOpt { TIMESTAMP_FULL, // YYYY-MM-DDTHH:MM:SS TIMESTAMP_TIME, // HH:MM:SS TIMESTAMP_DATE // YYYY-MM-DD};
class DateTime{ DateTime (uint32_t t = SECONDS_FROM_1970_TO_2000); DateTime (const uint16_t year, const uint8_t month, const uint8_t day, const uint8_t hour = 0, const uint8_t min = 0, const uint8_t sec = 0); DateTime (const DateTime& copy); DateTime (const tmElements_t& tm); // To use with RP2040 datetime_t struct DateTime (const datetime_t &tm); tmElements_t get_tmElements_t(); void setFrom_tmElements_t(const tmElements_t& tm); time_t get_time_t(); void setFrom_time_t(const time_t& timeInput); uint16_t year() const; uint8_t month() const; uint8_t day() const; uint8_t hour() const; uint8_t minute() const; uint8_t second() const; uint16_t yearOffset() const; uint8_t dayOfTheWeek() const; /** 32-bit times as seconds since 1/1/2000 */ long secondstime() const; /** 32-bit times as seconds since 1/1/1970 */ uint32_t unixtime() const; /** ISO 8601 Timestamp function */ String timestamp(timestampOpt opt = TIMESTAMP_FULL)}
- RP2040_RTC_Alarm
- RP2040_RTC_Alarm_Ethernet
- RP2040_RTC_Alarm_WiFiNINA
- RP2040_RTC_Alarm_RP2040WNew
- RP2040_RTC_Time
- RP2040_RTC_Time_Ethernet
- RP2040_RTC_Time_WiFiNINA
- RP2040_RTC_Time_RP2040WNew
ExampleRP2040_RTC_Time_WiFiNINA
1. FileRP2040_RTC_Time_WiFiNINA.ino
RP2040_RTC/examples/Time/RP2040_RTC_Time_WiFiNINA/RP2040_RTC_Time_WiFiNINA.ino
Lines 11 to 276 ine8a9591
// Important notes: Currently, RP2040-based boards RTC has no battery backup. So the time will be lost when power down | |
// Therefore, NTP client is necessary to get NTP time and update RTC. | |
#include"defines.h" | |
// To be included only in main(), .ino with setup() to avoid `Multiple Definitions` Linker Error | |
#include<Timezone_Generic.h>// https://github.com/khoih-prog/Timezone_Generic | |
////////////////////////////////////////// | |
// US Eastern Time Zone (New York, Detroit) | |
TimeChangeRule myDST = {"EDT", Second, Sun, Mar,2, -240};//Daylight time = UTC - 4 hours | |
TimeChangeRule mySTD = {"EST", First, Sun, Nov,2, -300};//Standard time = UTC - 5 hours | |
Timezone *myTZ; | |
TimeChangeRule *tcr;//pointer to the time change rule, use to get TZ abbrev | |
////////////////////////////////////////// | |
int status = WL_IDLE_STATUS;// the Wifi radio's status | |
char timeServer[] ="time.nist.gov";// NTP server | |
unsignedint localPort =2390;// local port to listen for UDP packets | |
constint NTP_PACKET_SIZE =48;// NTP timestamp is in the first 48 bytes of the message | |
constint UDP_TIMEOUT =2000;// timeout in miliseconds to wait for an UDP packet to arrive | |
byte packetBuffer[NTP_PACKET_SIZE];// buffer to hold incoming and outgoing packets | |
// A UDP instance to let us send and receive packets over UDP | |
WiFiUDP Udp; | |
datetime_t currTime; | |
char datetime_buf[256]; | |
// send an NTP request to the time server at the given address | |
voidsendNTPpacket(char *ntpSrv) | |
{ | |
// set all bytes in the buffer to 0 | |
memset(packetBuffer,0, NTP_PACKET_SIZE); | |
// Initialize values needed to form NTP request | |
// (see URL above for details on the packets) | |
packetBuffer[0] =0b11100011;// LI, Version, Mode | |
packetBuffer[1] =0;// Stratum, or type of clock | |
packetBuffer[2] =6;// Polling Interval | |
packetBuffer[3] =0xEC;// Peer Clock Precision | |
// 8 bytes of zero for Root Delay & Root Dispersion | |
packetBuffer[12] =49; | |
packetBuffer[13] =0x4E; | |
packetBuffer[14] =49; | |
packetBuffer[15] =52; | |
// all NTP fields have been given values, now | |
// you can send a packet requesting a timestamp: | |
Udp.beginPacket(ntpSrv,123);//NTP requests are to port 123 | |
Udp.write(packetBuffer, NTP_PACKET_SIZE); | |
Udp.endPacket(); | |
} | |
voidgetNTPTime() | |
{ | |
staticbool gotCurrentTime =false; | |
// Just get the correct ime once | |
if (!gotCurrentTime) | |
{ | |
sendNTPpacket(timeServer);// send an NTP packet to a time server | |
// wait to see if a reply is available | |
delay(1000); | |
if (Udp.parsePacket()) | |
{ | |
Serial.println(F("Packet received")); | |
// We've received a packet, read the data from it | |
Udp.read(packetBuffer, NTP_PACKET_SIZE);// read the packet into the buffer | |
//the timestamp starts at byte 40 of the received packet and is four bytes, | |
// or two words, long. First, esxtract the two words: | |
unsignedlong highWord =word(packetBuffer[40], packetBuffer[41]); | |
unsignedlong lowWord =word(packetBuffer[42], packetBuffer[43]); | |
// combine the four bytes (two words) into a long integer | |
// this is NTP time (seconds since Jan 1 1900): | |
unsignedlong secsSince1900 = highWord <<16 | lowWord; | |
Serial.print(F("Seconds since Jan 1 1900 =")); | |
Serial.println(secsSince1900); | |
// now convert NTP time into everyday time: | |
Serial.print(F("Unix time =")); | |
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800: | |
constunsignedlong seventyYears =2208988800UL; | |
// subtract seventy years: | |
unsignedlong epoch = secsSince1900 - seventyYears; | |
// print Unix time: | |
Serial.println(epoch); | |
// Get the time_t from epoch | |
time_tepoch_t = epoch; | |
// set the system time to UTC | |
// warning: assumes that compileTime() returns US EDT | |
// adjust the following line accordingly if you're in another time zone | |
setTime(epoch_t); | |
// Update RTC | |
// Can use either one of these functions | |
// 1) DateTime(tmElements_t). Must create tmElements_t if not present | |
//tmElements_t tm; | |
//breakTime(epoch_t, tm); | |
//rtc_set_datetime( DateTime(tm) ); | |
// 2) DateTime(year, month, day, hour, min, sec) | |
//rtc_set_datetime( DateTime(year(epoch_t), month(epoch_t), day(epoch_t), hour(epoch_t), minute(epoch_t), second(epoch_t) ) ); | |
// 3) DateTime (time_t) | |
//rtc_set_datetime( DateTime(epoch_t) ); | |
// 4) DateTime(unsigned long epoch). The best and easiest way | |
//rtc_set_datetime( DateTime((uint32_t) epoch) ); | |
// New function in DateTime_Generic.h | |
// To be called before while loop to work. Why ??? | |
rtc_set_datetime(DateTime((uint32_t) epoch)); | |
uint8_t loopCount =0; | |
while( (loopCount++ <10 ) && ( !rtc_set_datetime(DateTime((uint32_t) epoch)) ) ) | |
{ | |
Serial.println(F("rtc_set_datetime failed")); | |
sleep_ms(500); | |
} | |
// print the hour, minute and second: | |
Serial.print(F("The UTC time is"));// UTC is the time at Greenwich Meridian (GMT) | |
Serial.print((epoch %86400L) /3600);// print the hour (86400 equals secs per day) | |
Serial.print(':'); | |
if (((epoch %3600) /60) <10) | |
{ | |
// In the first 10 minutes of each hour, we'll want a leading '0' | |
Serial.print('0'); | |
} | |
Serial.print((epoch %3600) /60);// print the minute (3600 equals secs per minute) | |
Serial.print(':'); | |
if ((epoch %60) <10) | |
{ | |
// In the first 10 seconds of each minute, we'll want a leading '0' | |
Serial.print('0'); | |
} | |
Serial.println(epoch %60);// print the second | |
gotCurrentTime =true; | |
} | |
else | |
{ | |
// wait ten seconds before asking for the time again | |
delay(10000); | |
} | |
} | |
} | |
////////////////////////////////////////// | |
// format and print a time_t value, with a time zone appended. | |
voidprintDateTime(time_t t,constchar *tz) | |
{ | |
char buf[32]; | |
char m[4];// temporary storage for month string (DateStrings.cpp uses shared buffer) | |
strcpy(m,monthShortStr(month(t))); | |
sprintf(buf,"%.2d:%.2d:%.2d %s %.2d %s %d %s", | |
hour(t),minute(t),second(t),dayShortStr(weekday(t)),day(t), m,year(t), tz); | |
Serial.println(buf); | |
} | |
voidsetup() | |
{ | |
Serial.begin(115200); | |
while (!Serial &&millis() <5000); | |
delay(200); | |
Serial.print(F("\nStart RP2040_RTC_Time_WiFiNINA on")); Serial.print(BOARD_NAME); | |
Serial.print(F(" with")); Serial.println(SHIELD_TYPE); | |
Serial.println(RP2040_RTC_VERSION); | |
Serial.println(TIMEZONE_GENERIC_VERSION); | |
// check for the presence of the shield | |
if (WiFi.status() == WL_NO_MODULE) | |
{ | |
Serial.println(F("WiFi shield not present")); | |
// don't continue | |
while (true); | |
} | |
String fv = WiFi.firmwareVersion(); | |
if (fv < WIFI_FIRMWARE_LATEST_VERSION) | |
{ | |
Serial.println(F("Please upgrade the firmware")); | |
} | |
// attempt to connect to WiFi network | |
while ( status != WL_CONNECTED) | |
{ | |
Serial.print(F("Connecting to WPA SSID:")); | |
Serial.println(ssid); | |
// Connect to WPA/WPA2 network | |
status = WiFi.begin(ssid, pass); | |
} | |
// you're connected now, so print out the data | |
Serial.print(F("You're connected to the network, IP =")); | |
Serial.println(WiFi.localIP()); | |
myTZ =newTimezone(myDST, mySTD); | |
// Start the RTC | |
rtc_init(); | |
Udp.begin(localPort); | |
} | |
voiddisplayTime() | |
{ | |
rtc_get_datetime(&currTime); | |
// Display time from RTC | |
DateTime now =DateTime(currTime); | |
time_t utc = now.get_time_t(); | |
time_t local = myTZ->toLocal(utc, &tcr); | |
printDateTime(utc,"UTC"); | |
printDateTime(local, tcr -> abbrev); | |
} | |
voiddisplayRTCTime() | |
{ | |
staticunsignedlong displayRTCTime_timeout =0; | |
#defineDISPLAY_RTC_INTERVAL60000L | |
// Send status report every STATUS_REPORT_INTERVAL (60) seconds: we don't need to display frequently. | |
if ((millis() > displayRTCTime_timeout) || (displayRTCTime_timeout ==0)) | |
{ | |
Serial.println("============================"); | |
displayTime(); | |
displayRTCTime_timeout =millis() + DISPLAY_RTC_INTERVAL; | |
} | |
} | |
voidloop() | |
{ | |
// Get time from NTP once, then update RTC | |
// You certainly can make NTP check every hour/day to update RTC to have better accuracy | |
getNTPTime(); | |
displayRTCTime(); | |
} |
2. Filedefines.h
RP2040_RTC/examples/Time/RP2040_RTC_Time_WiFiNINA/defines.h
Lines 11 to 75 ine8a9591
#ifndefdefines_h | |
#definedefines_h | |
#defineDEBUG_WIFI_WEBSERVER_PORT Serial | |
// Debug Level from 0 to 4 | |
#define_WIFI_LOGLEVEL_ 1 | |
#define_WIFININA_LOGLEVEL_ 1 | |
#defineUSE_WIFI_NINA true | |
//#define USE_WIFI_NINA false | |
#defineRTC_DEBUG false | |
#ifUSE_WIFI_NINA | |
#warning Using WiFiNINA using WiFiNINA_Generic Library | |
#defineSHIELD_TYPE "WiFiNINA using WiFiNINA_Generic Library" | |
#endif | |
#if ( defined(ARDUINO_ARCH_RP2040)|| defined(ARDUINO_RASPBERRY_PI_PICO)|| defined(ARDUINO_ADAFRUIT_FEATHER_RP2040)|| defined(ARDUINO_GENERIC_RP2040) ) | |
#if defined(WIFININA_USE_RP2040) | |
#undef WIFININA_USE_RP2040 | |
#endif | |
#defineWIFININA_USE_RP2040 true | |
#if defined(ARDUINO_ARCH_MBED) | |
#if defined(BOARD_NAME) | |
#undef BOARD_NAME | |
#endif | |
#if defined(ARDUINO_NANO_RP2040_CONNECT) | |
#defineBOARD_NAME "MBED NANO_RP2040_CONNECT" | |
#elif defined(ARDUINO_RASPBERRY_PI_PICO) | |
#defineBOARD_NAME "MBED RASPBERRY_PI_PICO" | |
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) | |
#defineBOARD_NAME "MBED DAFRUIT_FEATHER_RP2040" | |
#elif defined(ARDUINO_GENERIC_RP2040) | |
#defineBOARD_NAME "MBED GENERIC_RP2040" | |
#else | |
#defineBOARD_NAME "MBED Unknown RP2040" | |
#endif | |
#endif | |
#else | |
#error This code is designed to run on RP2040 platform! Please check your Tools->Board setting. | |
#endif | |
#ifndefBOARD_NAME | |
#if defined(ARDUINO_BOARD) | |
#defineBOARD_NAME ARDUINO_BOARD | |
#else | |
#defineBOARD_NAME BOARD_TYPE | |
#endif | |
#endif | |
#include<RP2040_RTC.h> | |
#include<WiFiNINA_Generic.h> | |
charssid[]="ssid";// your network SSID (name) | |
charpass[]="12345678";// your network password | |
#endif//defines_h |
The following is the sample terminal output when running exampleRP2040_RTC_Time_Ethernet on RASPBERRY_PI_PICO with W5100S using Ethernet_Generic Library
Start RP2040_RTC_Time_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] RPIPICO setCsPin: 17=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 10You're connected to the network, IP = 192.168.2.95Packet receivedSeconds since Jan 1 1900 = 3859851978Unix time = 1650863178The UTC time is 5:06:18============================05:06:19 Mon 25 Apr 2022 UTC01:06:19 Mon 25 Apr 2022 EDT
The following is the sample terminal output when running exampleRP2040_RTC_Time_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
Start RP2040_RTC_Time_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] RPIPICO setCsPin: 17=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 1You're connected to the network, IP = 192.168.2.102Packet receivedSeconds since Jan 1 1900 = 3859851547Unix time = 1650862747The UTC time is 4:59:07============================04:59:08 Mon 25 Apr 2022 UTC00:59:08 Mon 25 Apr 2022 EDT============================05:00:08 Mon 25 Apr 2022 UTC01:00:08 Mon 25 Apr 2022 EDT============================05:01:08 Mon 25 Apr 2022 UTC01:01:08 Mon 25 Apr 2022 EDT
3. RP2040_RTC_Time_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
The following is the sample terminal output when running exampleRP2040_RTC_Time_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
Start RP2040_RTC_Time_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0Connecting to WPA SSID: HueNet1You're connected to the network, IP = 192.168.2.153Packet receivedSeconds since Jan 1 1900 = 3859851547Unix time = 1650862747The UTC time is 4:59:07============================04:59:08 Mon 25 Apr 2022 UTC00:59:08 Mon 25 Apr 2022 EDT
The following is the sample terminal output when running exampleRP2040_RTC_Alarm_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
Start RP2040_RTC_Alarm_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] RPIPICO setCsPin: 17=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 12You're connected to the network, IP = 192.168.2.99Packet receivedSeconds since Jan 1 1900 = 3859852325Unix time = 1650863525The UTC time is 5:12:05============================05:12:06 Mon 25 Apr 2022 UTC01:12:06 Mon 25 Apr 2022 EDTSet Repeatitive Alarm @ alarmSeconds = 5============================Alarm @ 05:13:05 Mon 25 Apr 2022 UTC01:13:05 Mon 25 Apr 2022 EDT============================05:13:06 Mon 25 Apr 2022 UTC01:13:06 Mon 25 Apr 2022 EDT
Start RP2040_RTC_Alarm_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] Board : RASPBERRY_PI_PICO , setCsPin: 17_pinCS = 0W5100 init, using SS_PIN_DEFAULT = 10, new ss_pin = 10, W5100Class::ss_pin = 17W5100::init: W5500, SSIZE =8192=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 17You're connected to the network, IP = 192.168.2.101Packet receivedSeconds since Jan 1 1900 = 3859852325Unix time = 1650863525The UTC time is 5:12:05============================05:12:06 Mon 25 Apr 2022 UTC01:12:06 Mon 25 Apr 2022 EDTSet One-time Alarm @ alarmSeconds = 5============================Alarm @ 05:13:05 Mon 25 Apr 2022 UTC01:13:05 Mon 25 Apr 2022 EDT
The following is the sample terminal output when running exampleRP2040_RTC_Alarm_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic Library
Start RP2040_RTC_Alarm_Ethernet on MBED RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] RPIPICO setCsPin: 17=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 19You're connected to the network, IP = 192.168.2.104Packet receivedSeconds since Jan 1 1900 = 3859852627Unix time = 1650863827The UTC time is 5:17:07============================05:17:08 Mon 25 Apr 2022 UTC01:17:08 Mon 25 Apr 2022 EDTSet Repeatitive Alarm @ alarmSeconds = 5============================Alarm @ 05:18:05 Mon 25 Apr 2022 UTC01:18:05 Mon 25 Apr 2022 EDT============================05:18:08 Mon 25 Apr 2022 UTC01:18:08 Mon 25 Apr 2022 EDT
Start RP2040_RTC_Alarm_Ethernet on RASPBERRY_PI_PICO with W5x00 using Ethernet_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0[EWS] =========== USE_ETHERNET_GENERIC ===========[EWS] Default SPI pinout:[EWS] MOSI: 19[EWS] MISO: 16[EWS] SCK: 18[EWS] SS: 17[EWS] =========================[EWS] Board : RASPBERRY_PI_PICO , setCsPin: 17_pinCS = 0W5100 init, using SS_PIN_DEFAULT = 10, new ss_pin = 10, W5100Class::ss_pin = 17W5100::init: W5500, SSIZE =8192=========================Currently Used SPI pinout:MOSI:19MISO:16SCK:18SS:17=========================Using mac index = 17You're connected to the network, IP = 192.168.2.101Packet receivedSeconds since Jan 1 1900 = 3859852627Unix time = 1650863827The UTC time is 5:17:07============================05:17:08 Mon 25 Apr 2022 UTC01:17:08 Mon 25 Apr 2022 EDTSet One-time Alarm @ alarmSeconds = 5============================Alarm @ 05:18:05 Mon 25 Apr 2022 UTC01:18:05 Mon 25 Apr 2022 EDT
6. RP2040_RTC_Alarm_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
The following is the sample terminal output when running exampleRP2040_RTC_Alarm_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic Library
Start RP2040_RTC_Alarm_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0Connecting to WPA SSID: HueNet1You're connected to the network, IP = 192.168.2.125Packet receivedSeconds since Jan 1 1900 = 3859852627Unix time = 1650863827The UTC time is 5:17:07============================05:17:08 Mon 25 Apr 2022 UTC01:17:08 Mon 25 Apr 2022 EDTSet Repeatitive Alarm @ alarmSeconds = 5============================Alarm @ 05:18:05 Mon 25 Apr 2022 UTC01:18:05 Mon 25 Apr 2022 EDT============================05:18:08 Mon 25 Apr 2022 UTC01:18:08 Mon 25 Apr 2022 EDT
Start RP2040_RTC_Alarm_WiFiNINA on MBED NANO_RP2040_CONNECT with WiFiNINA using WiFiNINA_Generic LibraryRP2040_RTC v1.1.1Timezone_Generic v1.10.0Connecting to WPA SSID: HueNet1You're connected to the network, IP = 192.168.2.125Packet receivedSeconds since Jan 1 1900 = 3859852627Unix time = 1650863827The UTC time is 5:17:07============================05:17:08 Mon 25 Apr 2022 UTC01:17:08 Mon 25 Apr 2022 EDTSet One-time Alarm @ alarmSeconds = 5============================Alarm @ 05:18:05 Mon 25 Apr 2022 UTC01:18:05 Mon 25 Apr 2022 EDT
If you get compilation errors, more often than not, you may need to install a newer version of the core for Arduino boards.
Sometimes, the library will only work if you update the board core to the latest version because I am using newly added functions.
Submit issues to:RP2040_RTC issues
- Search for bug and improvement.
- Basic RTC-wrapper library forRP2040-based boards, such as NANO_RP2040_CONNECT, RASPBERRY_PI_PICO, ADAFRUIT_FEATHER_RP2040 and GENERIC_RP2040, usingArduino-mbed RP2040 core orEarle Philhower's arduino-pico core.
- Add Version String
- Add Table of Contents
- Add simple examples with manual time input
- Use newEthernet_Generic library as default for W5x00.
- Add support to
SPI1
forRP2040
usingEarle Philhower's arduino-pico
core - Add support to WIZNet W5100S, such asWIZnet Ethernet HAT andW5100S-EVB-Pico
- Add support to
RP2040W
usingCYW43439 WiFi
withEarle Philhower's arduino-pico
core
Many thanks for everyone for bug reporting, new feature suggesting, testing and contributing to the development of this library.
- Thanks tokenb2054 to report bugs inLibraries updated to support new RP2040-based boards (RASPBERRY_PI_PICO, etc.) #43 leading to v1.0.4
- Thanks tojosephchrzempiec to report bugs leading to v1.0.5
- Thanks toMaximilian Gerhardt
- to create the PRCorrect platform name #2 leading to v1.0.6
- to create perfect bug reportLibrary converts datetime_t incorrectly, causing example to fail #4 leading to v1.0.7
![]() kenb2054 | ![]() josephchrzempiec | ![]() ⭐️ Maximilian Gerhardt |
If you want to contribute to this project:
- Report bugs and errors
- Ask for enhancements
- Create issues and pull requests
- Tell other people about this library
- The library is licensed underMIT
Copyright 2021- Khoi Hoang
About
This library enables you to use RTC from RP2040-based boards such as Nano_RP2040_Connect, RASPBERRY_PI_PICO. This RP2040-based RTC, using Interrupt, has no battery backup. Time will be lost when powered down. To need NTP-client to update RTC every start-up.