-
Notifications
You must be signed in to change notification settings - Fork 712
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Gambalunga branch 1 (read the PCF8523 offset register) #297
Open
Gambalunga
wants to merge
12
commits into
adafruit:master
Choose a base branch
from
Gambalunga:Gambalunga-branch-1
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 2 commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
77a7733
Add files via upload
Gambalunga 79f96db
Add files via upload
Gambalunga 82d1f2d
Delete examples/pcf8523_calibrate/README.txt
Gambalunga 7ec4645
Update pcf8523_calibrate.ino
Gambalunga 41b7bea
Update RTC_PCF8523.cpp
Gambalunga a6d1ba2
Update RTClib.h
Gambalunga 0144018
Update pcf8523_calibrate.ino
Gambalunga 3dc423b
Update RTC_PCF8523.cpp
Gambalunga c1875a4
Update pcf8523_calibrate.ino
Gambalunga fd4c4f7
Update RTC_PCF8523.cpp
Gambalunga a9894c9
Add files via upload
Gambalunga ef17692
Add files via upload
Gambalunga File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
The PCF8523 can be calibrated for: | ||
- Aging adjustment | ||
- Temperature compensation | ||
- Accuracy tuning | ||
The offset mode to use, once every two hours or once every minute. | ||
The offset Offset value from -64 to +63. A positive offset makes the clock slower. | ||
See the Application Note for calculation of offset values. | ||
https://www.nxp.com/docs/en/application-note/AN11247.pdf | ||
The deviation in parts per million can be calculated over a period of observation. Both the drift (which can be negative) | ||
and the observation period must be in seconds. For accuracy the variation should be observed over about 1 week. | ||
Note: any previous calibration should cancelled prior to any new observation period. | ||
Recommendation: | ||
Syncronise host PC time. | ||
run this sketch cancelling any previous calibration, | ||
record the output including timestamp, | ||
after several days again syncronise host PC time, | ||
run sketch again record the output including timestamp, | ||
calculate period of observation in seconds, and drift in seconds. | ||
Run sketch with the calculated figures and uncomment rtc.calibrate line as required. | ||
Example - RTC gaining 43 seconds in 1 week | ||
float drift = 43; // seconds plus or minus over oservation period - set to 0 to cancel previous calibration. | ||
float period_sec = (7 * 86400); // total obsevation period in seconds (86400 = seconds in 1 day: 7 days = (7 * 86400) seconds ) | ||
float deviation_ppm = (drift / period_sec * 1000000); // deviation in parts per million (?s) | ||
float drift_unit = 4.34; // use with offset mode PCF8523_TwoHours | ||
// float drift_unit = 4.069; //For corrections every min the drift_unit is 4.069 ppm (use with offset mode PCF8523_OneMinute) | ||
int8_t offset = round(deviation_ppm / drift_unit); | ||
rtc.calibrate(PCF8523_TwoHours, offset); // Un-comment to perform calibration once drift (seconds) and observation period (seconds) are correct | ||
// rtc.calibrate(PCF8523_OneMinute, offset); // // Un-comment to perform calibration with offset mode PCF8523_OneMinute | ||
// rtc.calibrate(PCF8523_TwoHours, 0); // Un-comment to cancel previous calibration | ||
|
||
In order to provide a method of reading the offset register, which may contain an previous calibration | ||
two methods are provided; 1. rtc.readOffsetReg(), or 2. rtc.getOffsetMode() and rtc.getOffset() | ||
See the example sketch: pcf8523_calibrate.ino | ||
|
||
Hint: | ||
Once the calibration Offset mode and Offset are known a line can be entered in the setup of the operating project sketch | ||
to re-establish the offset register after a battery replacement or clock reset. Note that your sketch will still require a method | ||
to insert the actual date and time. | ||
In the case of the above sample the line to insert in setup() would be: | ||
rtc.calibrate(PCF8523_TwoHours, 16); // re-insert previously calculated calibration after clock reset. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
// Date and time functions using a PCF8523 RTC connected via I2C and Wire lib | ||
#include "RTClib.h" | ||
|
||
RTC_PCF8523 rtc; | ||
|
||
char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; | ||
|
||
void setup() { | ||
Serial.begin(57600); | ||
delay(500); | ||
while (!Serial) | ||
; // wait for serial port to connect. Needed for native USB | ||
|
||
if (!rtc.begin()) { | ||
Serial.println("Couldn't find RTC"); | ||
Serial.flush(); | ||
while (1) delay(10); | ||
} | ||
|
||
if (!rtc.initialized() || rtc.lostPower()) { | ||
Serial.println("RTC is NOT initialized, let's set the time!"); | ||
// When time needs to be set on a new device, or after a power loss, the | ||
// following line sets the RTC to the date & time this sketch was compiled | ||
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); | ||
// This line sets the RTC with an explicit date & time, for example to set | ||
// January 21, 2014 at 3am you would call: | ||
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); | ||
// | ||
// Note: allow 2 seconds after inserting battery or applying external power | ||
// without battery before calling adjust(). This gives the PCF8523's | ||
// crystal oscillator time to stabilize. If you call adjust() very quickly | ||
// after the RTC is powered, lostPower() may still return true. | ||
} | ||
|
||
// When time needs to be re-set on a previously configured device, the | ||
// following line sets the RTC to the date & time this sketch was compiled | ||
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); | ||
// This line sets the RTC with an explicit date & time, for example to set | ||
// January 21, 2014 at 3am you would call: | ||
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); | ||
|
||
// When the RTC was stopped and stays connected to the battery, it has | ||
// to be restarted by clearing the STOP bit. Let's do this to ensure | ||
// the RTC is running. | ||
rtc.start(); | ||
|
||
// The PCF8523 can be calibrated for: | ||
// - Aging adjustment | ||
// - Temperature compensation | ||
// - Accuracy tuning | ||
// The offset mode to use, once every two hours or once every minute. | ||
// The offset Offset value from -64 to +63. See the Application Note for calculation of offset values. | ||
// https://www.nxp.com/docs/en/application-note/AN11247.pdf | ||
// The deviation in parts per million can be calculated over a period of observation. Both the drift (which can be negative) | ||
// and the observation period must be in seconds. For accuracy the variation should be observed over about 1 week. | ||
// Note: any previous calibration should cancelled prior to any new observation period. | ||
// Recommendation: Syncronise host PC time. | ||
// run this sketch cancelling any previous calibration, | ||
// record the output including timestamp, | ||
// run sketch again after several days, | ||
// calculate period of observation in seconds, and drift in seconds. | ||
// Run sketch with the calculated figures and uncomment rtc.calibrate line as required. | ||
// Example - RTC gaining 43 seconds in 1 week | ||
float drift = 43; // seconds plus or minus over oservation period - set to 0 to cancel previous calibration. | ||
float period_sec = (7 * 86400); // total obsevation period in seconds (86400 = seconds in 1 day: 7 days = (7 * 86400) seconds ) | ||
float deviation_ppm = (drift / period_sec * 1000000); // deviation in parts per million (μs) | ||
float drift_unit = 4.34; // use with offset mode PCF8523_TwoHours | ||
// float drift_unit = 4.069; //For corrections every min the drift_unit is 4.069 ppm (use with offset mode PCF8523_OneMinute) | ||
int8_t offset = round(deviation_ppm / drift_unit); | ||
// rtc.calibrate(PCF8523_TwoHours, offset); // Un-comment to perform calibration once drift (seconds) and observation period (seconds) are correct | ||
// rtc.calibrate(PCF8523_OneMinute, offset); // // Un-comment to perform calibration with offset mode PCF8523_OneMinute | ||
// rtc.calibrate(PCF8523_TwoHours, 0); // Un-comment to cancel previous calibration | ||
|
||
Serial.println(); | ||
Serial.print("Calculated Offset for calibration is: "); | ||
Serial.println(offset); // Print to control calculated offset | ||
|
||
// read offset register ******************************* | ||
Serial.println("Read RTC PCF8523 Offset Register"); // Print to control offset | ||
|
||
// Method 1 **************************** | ||
int8_t OffsetReg = rtc.readOffsetReg(); | ||
Serial.print("Offset mode is: "); | ||
if bitRead (OffsetReg, 7) { | ||
Serial.println("PCF8523_OneMinute"); | ||
} else { | ||
Serial.println("PCF8523_TwoHours "); | ||
} | ||
offset = OffsetReg; | ||
bitWrite(offset, 7, bitRead(OffsetReg, 6)); | ||
Serial.print("Offset is: "); | ||
Serial.println(offset); // Print to control offset | ||
|
||
// Method 2 **************************** | ||
String OffsetMode = String(rtc.getOffsetMode()); | ||
Serial.print("Offset mode is: "); | ||
Serial.println(OffsetMode); | ||
|
||
offset = rtc.getOffset(); | ||
Serial.print("Offset is: "); | ||
Serial.println(offset); // Print to control offset | ||
// End read offset register ******************************* | ||
|
||
DateTime now = rtc.now(); | ||
|
||
Serial.print(now.year(), DEC); | ||
Serial.print('/'); | ||
Serial.print(now.month(), DEC); | ||
Serial.print('/'); | ||
Serial.print(now.day(), DEC); | ||
Serial.print(" ("); | ||
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); | ||
Serial.print(") "); | ||
Serial.print(now.hour(), DEC); | ||
Serial.print(':'); | ||
Serial.print(now.minute(), DEC); | ||
Serial.print(':'); | ||
Serial.print(now.second(), DEC); | ||
Serial.println(); | ||
} | ||
|
||
void loop() { | ||
|
||
// do nothing | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file is mostly redundant with the comments in the example sketch. For consistency with the other provided examples, the file should be removed, and the information needed to understand the example should be provided, in comments, in the example itself.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wondered about this and I did largely cover it in the comments. I will put the comments and the readme together and try to make a succinct comment that covers the usage and remove the readme.