Add new example showing RTC with LCD display.
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
/*----------------------------------------------------------------------*
|
||||
* Display the date and time from a DS3231 or DS3232 RTC every second. *
|
||||
* Display the temperature once per minute. (The DS3231 does a *
|
||||
* temperature conversion once every 64 seconds. This is also the *
|
||||
* default for the DS3232.) *
|
||||
* *
|
||||
* Set the date and time by entering the following on the Arduino *
|
||||
* serial monitor: *
|
||||
* year,month,day,hour,minute,second, *
|
||||
* *
|
||||
* Where *
|
||||
* year can be two or four digits, *
|
||||
* month is 1-12, *
|
||||
* day is 1-31, *
|
||||
* hour is 0-23, and *
|
||||
* minute and second are 0-59. *
|
||||
* *
|
||||
* Entering the final comma delimiter (after "second") will avoid a *
|
||||
* one-second timeout and will allow the RTC to be set more accurately. *
|
||||
* *
|
||||
* No validity checking is done, invalid values or incomplete syntax *
|
||||
* in the input will result in an incorrect RTC setting. *
|
||||
* *
|
||||
* Jack Christensen 08Aug2013 *
|
||||
* *
|
||||
* Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232. *
|
||||
* *
|
||||
* This work is licensed under the Creative Commons Attribution- *
|
||||
* ShareAlike 3.0 Unported License. To view a copy of this license, *
|
||||
* visit http://creativecommons.org/licenses/by-sa/3.0/ or send a *
|
||||
* letter to Creative Commons, 171 Second Street, Suite 300, *
|
||||
* San Francisco, California, 94105, USA. *
|
||||
*----------------------------------------------------------------------*/
|
||||
|
||||
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
|
||||
#include <Streaming.h> //http://arduiniana.org/libraries/streaming/
|
||||
#include <Time.h> //http://playground.arduino.cc/Code/Time
|
||||
#include <Wire.h> //http://arduino.cc/en/Reference/Wire
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
|
||||
//setSyncProvider() causes the Time library to synchronize with the
|
||||
//external RTC by calling RTC.get() every five minutes by default.
|
||||
setSyncProvider(RTC.get);
|
||||
Serial << F("RTC Sync");
|
||||
if (timeStatus() != timeSet) Serial << F(" FAIL!");
|
||||
Serial << endl;
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
static time_t tLast;
|
||||
time_t t;
|
||||
tmElements_t tm;
|
||||
|
||||
//check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
|
||||
if (Serial.available() >= 12) {
|
||||
//note that the tmElements_t Year member is an offset from 1970,
|
||||
//but the RTC wants the last two digits of the calendar year.
|
||||
//use the convenience macros from Time.h to do the conversions.
|
||||
int y = Serial.parseInt();
|
||||
if (y >= 100 && y < 1000)
|
||||
Serial << F("Error: Year must be two digits or four digits!") << endl;
|
||||
else {
|
||||
if (y >= 1000)
|
||||
tm.Year = CalendarYrToTm(y);
|
||||
else //(y < 100)
|
||||
tm.Year = y2kYearToTm(y);
|
||||
tm.Month = Serial.parseInt();
|
||||
tm.Day = Serial.parseInt();
|
||||
tm.Hour = Serial.parseInt();
|
||||
tm.Minute = Serial.parseInt();
|
||||
tm.Second = Serial.parseInt();
|
||||
t = makeTime(tm);
|
||||
RTC.set(t); //use the time_t value to ensure correct weekday is set
|
||||
setTime(t);
|
||||
Serial << F("RTC set to: ");
|
||||
printDateTime(t);
|
||||
Serial << endl;
|
||||
//dump any extraneous input
|
||||
while (Serial.available() > 0) Serial.read();
|
||||
}
|
||||
}
|
||||
|
||||
t = now();
|
||||
if (t != tLast) {
|
||||
tLast = t;
|
||||
printDateTime(t);
|
||||
if (second(t) == 0) {
|
||||
float c = RTC.temperature() / 4.;
|
||||
float f = c * 9. / 5. + 32.;
|
||||
Serial << F(" ") << c << F(" C ") << f << F(" F");
|
||||
}
|
||||
Serial << endl;
|
||||
}
|
||||
}
|
||||
|
||||
//print date and time to Serial
|
||||
void printDateTime(time_t t)
|
||||
{
|
||||
printDate(t);
|
||||
Serial << ' ';
|
||||
printTime(t);
|
||||
}
|
||||
|
||||
//print time to Serial
|
||||
void printTime(time_t t)
|
||||
{
|
||||
printI00(hour(t), ':');
|
||||
printI00(minute(t), ':');
|
||||
printI00(second(t), ' ');
|
||||
}
|
||||
|
||||
//print date to Serial
|
||||
void printDate(time_t t)
|
||||
{
|
||||
printI00(day(t), 0);
|
||||
Serial << monthShortStr(month(t)) << _DEC(year(t));
|
||||
}
|
||||
|
||||
//Print an integer in "00" format (with leading zero),
|
||||
//followed by a delimiter character to Serial.
|
||||
//Input value assumed to be between 0 and 99.
|
||||
void printI00(int val, char delim)
|
||||
{
|
||||
if (val < 10) Serial << '0';
|
||||
Serial << _DEC(val);
|
||||
if (delim > 0) Serial << delim;
|
||||
return;
|
||||
}
|
||||
Reference in New Issue
Block a user