7 Using Time and Dates
7 Using Time and Dates
12.0 Introduction
0DQDJLQJWLPHLVDIXQGDPHQWDOHOHPHQWRILQWHUDFWLYHFRPSXWLQJ7KLVFKDSWHUFRYHUV
EXLOWLQ$UGXLQRIXQFWLRQVDQGLQWURGXFHVPDQ\DGGLWLRQDOWHFKQLTXHVIRUKDQGOLQJ
WLPHGHOD\VWLPHPHDVXUHPHQWDQGUHDOZRUOGWLPHVDQGGDWHV
Solution
7KH $UGXLQR delay IXQFWLRQ LV XVHG LQ PDQ\ VNHWFKHV WKURXJKRXW WKLV ERRN delay
SDXVHVDVNHWFKIRUWKHQXPEHURIPLOOLVHFRQGVVSHFLILHGDVDSDUDPHWHU7KHUHDUH
PLOOLVHFRQGVLQRQHVHFRQG7KHVNHWFKWKDWIROORZVVKRZVKRZ\RXFDQXVH
delayWRJHWDOPRVWDQ\LQWHUYDO
/*
* delay sketch
*/
void setup()
{
Serial.begin(9600);
}
367
void loop()
{
Serial.println("delay for 1 millisecond");
delay(1);
Serial.println("delay for 1 second");
delay(oneSecond);
Serial.println("delay for 1 minute");
delay(oneMinute);
Serial.println("delay for 1 hour");
delay(oneHour);
Serial.println("delay for 1 day");
delay(oneDay);
Serial.println("Ready to start over");
}
Discussion
7KHdelayIXQFWLRQKDVDUDQJHIURPRQHRQHWKRXVDQGWKRIDVHFRQGWRDURXQGGD\V
MXVWOHVVWKDQGD\VLIXVLQJDQXQVLJQHGORQJYDULDEOHW\SHVHH&KDSWHUIRUPRUH
RQYDULDEOHW\SHV
7KHdelayIXQFWLRQSDXVHVWKHH[HFXWLRQRI\RXUVNHWFKIRUWKHGXUDWLRQRIWKHGHOD\
,I\RXQHHGWRSHUIRUPRWKHUWDVNVZLWKLQWKHGHOD\SHULRGXVLQJmillisDVH[SODLQHG
LQ5HFLSHLVPRUHVXLWDEOH
<RXFDQXVHdelayMicrosecondsWRGHOD\VKRUWSHULRGV7KHUHDUHPLFURVHFRQGV
LQRQHPLOOLVHFRQGDQGPLOOLRQPLFURVHFRQGVLQRQHVHFRQGdelayMicrosecondsZLOO
SDXVHIURPRQHPLFURVHFRQGWRDURXQGPLOOLVHFRQGVEXWIRUGHOD\VORQJHUWKDQD
IHZWKRXVDQGPLFURVHFRQGV\RXVKRXOGXVHdelayLQVWHDG
delayMicroseconds(10); // delay for 10 microseconds
delayDQG delayMicrosecondsZLOOGHOD\IRUDWOHDVWWKHDPRXQWRIWLPH
JLYHQDVWKHSDUDPHWHUEXWWKH\FRXOGGHOD\DOLWWOHORQJHULILQWHUUXSWV
RFFXUZLWKLQWKHGHOD\WLPH
See Also
7KH$UGXLQRUHIHUHQFHIRUdelayKWWSZZZDUGXLQRFFHQ5HIHUHQFH'HOD\
long startTime; // the value returned from millis when the switch is pressed
long duration; // variable to store the duration
void setup()
{
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // turn on pull-up resistor
Serial.begin(9600);
}
void loop()
{
if(digitalRead(switchPin) == LOW)
{
// here if the switch is pressed
startTime = millis();
while(digitalRead(switchPin) == LOW)
; // wait while the switch is still pressed
long duration = millis() - startTime;
Serial.println(duration);
}
}
Discussion
7KHmillisIXQFWLRQUHWXUQVWKHQXPEHURIPLOOLVHFRQGVVLQFHWKHFXUUHQWVNHWFKVWDUWHG
UXQQLQJ7KLVQXPEHUZLOORYHUIORZJREDFNWR]HURLQDSSUR[LPDWHO\GD\V
%\VWRULQJWKHVWDUWWLPHIRUDQHYHQW\RXFDQGHWHUPLQHWKHGXUDWLRQRIWKHHYHQWE\
VXEWUDFWLQJWKHVWDUWWLPHIURPWKHFXUUHQWWLPHDVVKRZQKHUH
long duration = millis() - startTime;
<RXFDQFUHDWH\RXURZQGHOD\IXQFWLRQXVLQJ millisWKDWFDQFRQWLQXHWRGRRWKHU
WKLQJVZKLOHFKHFNLQJUHSHDWHGO\WRVHHLIWKHGHOD\SHULRGKDVSDVVHG2QHH[DPSOHRI
WKLVFDQEHIRXQGLQWKH%OLQN:LWKRXW'HOD\VNHWFKSURYLGHGZLWKWKH$UGXLQRGLVWUL
EXWLRQ+HUHLVWKHORRSFRGHLQWKDWVNHWFK
7KHQH[WOLQHFKHFNVWRVHHLIWKHGHVLUHGLQWHUYDOKDVSDVVHG
if (millis() - previousMillis > interval)
{
// save the last time you blinked the LED
,I WKH LQWHUYDO KDV SDVVHG WKH FXUUHQW millis YDOXH LV VDYHG LQ WKH YDULDEOH
previousMillis
previousMillis = millis();
+HUHLVDZD\WRSDFNDJHWKLVORJLFLQWRDIXQFWLRQQDPHG myDelayWKDWZLOOGHOD\WKH
FRGHLQloopEXWFDQSHUIRUPVRPHDFWLRQGXULQJWKHGHOD\SHULRG<RXFDQFXVWRPL]H
WKHIXQFWLRQDOLW\IRU\RXUDSSOLFDWLRQEXWLQWKLVH[DPSOHDQ/('LVIODVKHGILYHWLPHV
SHUVHFRQGHYHQZKLOHWKHSULQWVWDWHPHQWLQloopLVGHOD\HGIRUIRXUVHFRQGLQWHUYDOV
// blink an LED for a set amount of time
const int ledPin = 13; // the number of the LED pin
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
Serial.println(millis() / 1000); // print the number of elapsed seconds every
four seconds
// wait four seconds (but at the same time, quickly blink an LED)
myDelay(4000);
}
<RXFDQSXWFRGHLQWKH myDelayIXQFWLRQIRUDQDFWLRQWKDW\RXZDQWWRKDSSHQUH
SHDWHGO\ZKLOHWKHIXQFWLRQZDLWVIRUWKHVSHFLILHGWLPHWRHODSVH
$QRWKHUDSSURDFKLVWRXVHDWKLUGSDUW\OLEUDU\DYDLODEOHIURPWKH$UGXLQR3OD\JURXQG
FDOOHG7LPHG$FWLRQKWWSZZZDUGXLQRFFSOD\JURXQG&RGH7LPHG$FWLRQ
#include <TimedAction.h>
//this initializes a TimedAction class that will change the state of an LED
every second.
TimedAction timedAction = TimedAction(NO_PREDELAY,1000,blink);
void setup()
{
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,ledState);
}
void loop()
{
timedAction.check();
}
void blink()
{
if (ledState == LOW)
ledState = HIGH;
else
See Also
7KH$UGXLQRUHIHUHQFHIRUmillisKWWSZZZDUGXLQRFFHQ5HIHUHQFH0LOOLV
Solution
7KHpulseInIXQFWLRQUHWXUQVWKHGXUDWLRQLQPLFURVHFRQGVIRUDFKDQJLQJVLJQDORQD
GLJLWDOSLQ7KLVVNHWFKSULQWVWKHWLPHWKDWWKHYROWDJHRQDGLJLWDOSLQLVKHOGLOWE\D
EXWWRQSUHVV$VLQ5HFLSHWKLVXVHVWKHZLULQJVKRZQLQ5HFLSH
/*
PulseIn sketch
uses pulseIn to display how long a switch is pressed and released
*/
long val;
void setup()
{
pinMode(inputPin, INPUT);
digitalWrite(inputPin,HIGH); // turn on internal pull-up on the inputPin
Serial.begin(9600);
Serial.println("Press and release switch");
}
void loop()
{
7KHpulseInIXQFWLRQZDLWVIRUWKHSXOVHWRVWDUWRUIRUDWLPHRXWLIWKHUHLVQRSXOVH
%\GHIDXOWLWZLOOVWRSZDLWLQJDIWHURQHVHFRQGEXW\RXFDQFKDQJHWKDWE\VSHFLI\LQJ
WKHWLPHWRZDLWLQPLFURVHFRQGVDVDWKLUGSDUDPHWHUQRWHWKDWPLFURVHFRQGV
HTXDOVPLOOLVHFRQG
pulseIn(pin, HIGH, 5000); // wait 5 milliseconds for the pulse to start
7KHWLPHRXWYDOXHRQO\PDWWHUVLIWKHSXOVHGRHVQRWVWDUWZLWKLQWKH
JLYHQSHULRG2QFHWKHVWDUWRIDSXOVHLVGHWHFWHGWKHIXQFWLRQZLOOVWDUW
WLPLQJDQGZLOOQRWUHWXUQXQWLOWKHSXOVHHQGV
pulseInFDQPHDVXUHYDOXHVEHWZHHQDURXQGPLFURVHFRQGVWRWKUHHPLQXWHVLQGX
UDWLRQEXWWKHYDOXHRIORQJSXOVHVPD\QRWEHYHU\DFFXUDWH
See Also
7KH$UGXLQRUHIHUHQFHIRUpulseInKWWSZZZDUGXLQRFFHQ5HIHUHQFH3XOVH,Q
5HFLSHVKRZV pulseInXVHGWRPHDVXUHWKHSXOVHZLGWKRIDQXOWUDVRQLFGLVWDQFH
VHQVRU
5HFLSHSURYLGHVPRUHLQIRUPDWLRQRQXVLQJKDUGZDUHLQWHUUXSWV
Solution
7KLVVNHWFKXVHVWKH7LPHOLEUDU\WRGLVSOD\WKHWLPHRIGD\
/*
* Time sketch
*
*/
#include <Time.h>
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
Discussion
7KH7LPHOLEUDU\HQDEOHV\RXWRNHHSWUDFNRIWKHGDWHDQGWLPH$VWDQGDUG$UGXLQR
ERDUGXVHVDTXDUW]FU\VWDOIRUWLPLQJDQGWKLVLVDFFXUDWHWRDFRXSOHRIVHFRQGVSHU
GD\EXWLWGRHVQRWKDYHDEDWWHU\WRUHPHPEHUWKHWLPHZKHQSRZHULVVZLWFKHGRII
7KHUHIRUHWLPHZLOOUHVWDUWIURPHDFKWLPHDVNHWFKVWDUWVVR\RXQHHGWRVHWWKHWLPH
XVLQJWKHsetTimeIXQFWLRQ7KHVNHWFKVHWVWKHWLPHWRQRRQRQ-DQXDU\HDFKWLPHLW
VWDUWV
7KH7LPHOLEUDU\XVHVDVWDQGDUGNQRZQDV8QL[DOVRFDOOHG326,;
WLPH7KHYDOXHVUHSUHVHQWWKHQXPEHURIHODSVHGVHFRQGVVLQFH-DQXDU\
([SHULHQFHG&SURJUDPPHUVPD\UHFRJQL]HWKDWWKLVLVWKHVDPH
DVWKHtime_tXVHGLQWKH,62VWDQGDUG&OLEUDU\IRUVWRULQJWLPHYDOXHV
2IFRXUVHLWVPRUHXVHIXOWRVHWWKHWLPHWR\RXUFXUUHQWORFDOWLPHLQVWHDGRIDIL[HG
YDOXH 7KH IROORZLQJ VNHWFK JHWV WKH QXPHULFDO WLPH YDOXH WKH QXPEHU RI HODSVHG
VHFRQGVVLQFH-DQXDU\IURPWKHVHULDOSRUWWRVHWWKHWLPH<RXFDQHQWHUD
#include <Time.h>
void setup() {
Serial.begin(9600);
Serial.println("Waiting for time sync message");
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
// here if the time has been set
digitalClockDisplay();
}
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void processSyncMessage() {
// if time sync available from serial port, update time and return true
// time message consists of a header and ten ascii digits
while(Serial.available() >= TIME_MSG_LEN ){
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
setTime(pctime); // Sync clock to the time received on serial port
}
}
}
7KHFRGHWRGLVSOD\WKHWLPHDQGGDWHLVWKHVDPHDVEHIRUHEXWQRZWKHVNHWFKZDLWV
WRUHFHLYHWKHWLPHIURPWKHVHULDOSRUW6HHWKH'LVFXVVLRQLQ5HFLSHLI\RXDUHQRW
IDPLOLDUZLWKKRZWRUHFHLYHQXPHULFGDWDXVLQJWKHVHULDOSRUW
$SURFHVVLQJVNHWFKQDPHG6\QF$UGXLQR&ORFNLVLQFOXGHGZLWKWKH7LPHOLEUDU\H[
DPSOHVLWVLQWKH7LPH([DPSOHV3URFHVVLQJ6\QF$UGXLQR&ORFNIROGHU7KLV3URFHVV
LQJVNHWFKZLOOVHQGWKHFXUUHQWWLPHIURP\RXUFRPSXWHUWR$UGXLQRDWWKHFOLFNRID
PRXVH5XQ6\QF$UGXLQR&ORFNLQ3URFHVVLQJHQVXULQJWKDWWKHVHULDOSRUWLVWKHRQH
FRQQHFWHGWR$UGXLQR&KDSWHUGHVFULEHVKRZWRUXQD3URFHVVLQJVNHWFKWKDWWDONV
WR $UGXLQR <RX VKRXOG VHH WKH PHVVDJH Waiting for time sync message VHQW E\
$UGXLQRDQGGLVSOD\HGLQWKH3URFHVVLQJWH[WDUHDWKHEODFNDUHDIRUWH[WPHVVDJHVDW
WKHERWWRPRIWKH3URFHVVLQJ,'(&OLFNWKH3URFHVVLQJDSSOLFDWLRQZLQGRZLWVD
SL[HOJUD\VTXDUHDQG\RXVKRXOGVHHWKHWH[WDUHDGLVSOD\WKHWLPHDVSULQWHGE\WKH
$UGXLQRVNHWFK
<RXFDQDOVRVHWWKHFORFNIURPWKH6HULDO0RQLWRULI\RXFDQJHWWKHFXUUHQW8QL[WLPH
KWWSZZZHSRFKFRQYHUWHUFRPLVRQHRIPDQ\ZHEVLWHVWKDWSURYLGHWKHWLPHLQWKLV
IRUPDW&RS\WKHGLJLWQXPEHULQGLFDWHGDVWKHFXUUHQW8QL[WLPHDQGSDVWHWKLV
LQWRWKH6HULDO0RQLWRU6HQGZLQGRZ3UHFHGHWKHQXPEHUZLWKWKHOHWWHU7DQGFOLFN
6HQG)RUH[DPSOHLI\RXVHQGWKLV
T1282041639
<RXFDQDOVRVHWWKHWLPHXVLQJEXWWRQVRURWKHULQSXWGHYLFHVVXFKDVWLOWVHQVRUVD
MR\VWLFNRUDURWDU\HQFRGHU
7KHIROORZLQJVNHWFKXVHVWZREXWWRQVWRPRYHWKHFORFNKDQGVIRUZDUGRUEDFNZDUG
)LJXUHVKRZVWKHFRQQHFWLRQVVHH5HFLSHLI\RXQHHGKHOSXVLQJVZLWFKHV
/*
AdjustClockTime sketch
buttons on pins 2 and 3 adjust the time
*/
#include <Time.h>
void setup()
{
digitalWrite(btnForward, HIGH); // enable internal pull-up resistors
digitalWrite(btnBack, HIGH);
setTime(12,0,0,1,1,11); // start with the time set to noon Jan 1 2011
Serial.begin(9600);
Serial.println("ready");
}
void loop()
{
prevtime = now(); // note the time
while( prevtime == now() ) // stay in this loop till the second changes
{
// check if the set button pressed while waiting for second to roll over
if(checkSetTime())
prevtime = now(); // time changed so reset start time
}
digitalClockDisplay();
}
7KH VNHWFK XVHV WKH VDPH digitalClockDisplay DQG printDigits IXQFWLRQV IURP
5HFLSHVRFRS\WKRVHSULRUWRUXQQLQJWKHVNHWFK
void setup()
{
digitalWrite(buttonPin, HIGH); // enable internal pull-up resistors
setTime(12,0,0,1,1,11); // start with the time set to noon Jan 1 2011
Serial.begin(9600);
}
void loop()
{
prevtime = now(); // note the time
while( prevtime == now() ) // stay in this loop till the second changes
{
// check if the set button pressed while waiting for second to roll over
if(checkSetTime())
prevtime = now(); // time changed so reset start time
}
digitalClockDisplay();
}
while(digitalRead(buttonPin)== LOW)
{
// here while button is pressed
value = analogRead(potPin); // read the pot value
step = map(value, 0,1023, 10, -10); // map value to the desired range
if( step != 0)
{
adjustTime(step);
isTimeAdjusted = true; // to tell the user that the time has changed
digitalClockDisplay(); // update clock
delay(100);
}
}
return isTimeAdjusted;
}
)LJXUH$YDULDEOHUHVLVWRUXVHGWRDGMXVWWKHWLPH
<RXFDQDOVRSULQWWH[WVWULQJVIRUWKHGD\VDQGPRQWKVKHUHLVDYDULDWLRQRQWKHGLJLWDO
FORFNGLVSOD\FRGHWKDWSULQWVWKHQDPHVRIWKHGD\DQGPRQWK
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(dayStr(weekday())); // print the day of the week
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(monthShortStr(month())); // print the month (abbreviated)
Serial.print(" ");
Serial.print(year());
Serial.println();
}
See Also
$UGXLQR7LPHOLEUDU\UHIHUHQFHKWWSZZZDUGXLQRFFSOD\JURXQG&RGH7LPH
:LNLSHGLDDUWLFOHRQ8QL[WLPHKWWSHQZLNLSHGLDRUJZLNL8QL[BWLPH
KWWSZZZHSRFKFRQYHUWHUFRP DQG KWWSZZZRQOLQHFRQYHUVLRQFRPXQL[BWLPHKWP
DUHWZRSRSXODU8QL[WLPHFRQYHUVLRQWRROV
#include <Time.h>
#include <TimeAlarms.h>
void setup()
{
Serial.begin(9600);
Serial.println("TimeAlarms Example");
Serial.println("Alarms are triggered daily at 8:30 am and 17:45 pm");
Serial.println("One timer is triggered every 15 seconds");
Serial.println("Another timer is set to trigger only once after 10 seconds");
Serial.println();
void MorningAlarm()
{
Serial.println("Alarm: - turn lights off");
}
void EveningAlarm()
{
Serial.println("Alarm: - turn lights on");
}
void RepeatTask()
{
Serial.println("15 second timer");
}
void OnceOnlyTask()
void loop()
{
digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
Discussion
<RXFDQVFKHGXOHWDVNVWRWULJJHUDWDSDUWLFXODUWLPHRIGD\WKHVHDUHFDOOHGDODUPV
RUVFKHGXOHWDVNVWRRFFXUDIWHUDQLQWHUYDORIWLPHKDVHODSVHGFDOOHGWLPHUV(DFKRI
WKHVHWDVNVFDQEHFUHDWHGWRFRQWLQXRXVO\UHSHDWRUWRRFFXURQO\RQFH
7RVSHFLI\DQDODUPWRWULJJHUDWDVNUHSHDWHGO\DWDSDUWLFXODUWLPHRIGD\XVH
Alarm.alarmRepeat(8,30,0, MorningAlarm);
7KLVFDOOVWKHIXQFWLRQMorningAlarmDWDPHYHU\GD\
,I\RXZDQWWKHDODUPWRWULJJHURQO\RQFH\RXFDQXVHWKHalarmOncePHWKRG
Alarm.alarmOnce(8,30,0, MorningAlarm);
7KLVFDOOVWKHRepeatsIXQFWLRQLQ\RXUVNHWFKHYHU\VHFRQGV
7KLVFDOOVWKHonceOnlyIXQFWLRQLQDVNHWFKVHFRQGVDIWHUWKHWLPHULVFUHDWHG
<RXU FRGH QHHGV WR FDOO Alarm.delay UHJXODUO\ EHFDXVH WKLV IXQFWLRQ
FKHFNV WKH VWDWH RI DOO WKH VFKHGXOHG HYHQWV )DLOLQJ WR UHJXODUO\ FDOO
Alarm.delayZLOOUHVXOWLQWKHDODUPVQRWEHLQJWULJJHUHG<RXFDQFDOO
Alarm.delay(0) LI \RX QHHG WR VHUYLFH WKH VFKHGXOHU ZLWKRXW D GHOD\
$OZD\VXVH Alarm.delayLQVWHDGRI delayZKHQXVLQJ7LPH$ODUPVLQD
VNHWFK
7KH7LPH$ODUPVOLEUDU\UHTXLUHVWKH7LPHOLEUDU\WREHLQVWDOOHGVHH5HFLSH1R
LQWHUQDORUH[WHUQDOKDUGZDUHLVUHTXLUHGWRXVHWKH7LPH$ODUPVOLEUDU\7KHVFKHGXOHU
GRHVQRWXVHLQWHUUXSWVVRWKHWDVNKDQGOLQJIXQFWLRQLVWKHVDPHDVDQ\RWKHUIXQFWLRQV
\RXFUHDWHLQ\RXUVNHWFKFRGHLQDQLQWHUUXSWKDQGOHUKDVUHVWULFWLRQVWKDWDUHGLV
FXVVHGLQ&KDSWHUEXWWKHVHGRQRWDSSO\WR7LPH$ODUPVIXQFWLRQV
7LPHULQWHUYDOVFDQUDQJHIURPRQHVHFRQGWRVHYHUDO\HDUV,I\RXQHHGWLPHULQWHUYDOV
VKRUWHUWKDQRQHVHFRQGWKH7LPHG$FWLRQOLEUDU\E\$OH[DQGHU%UHYLJPD\EHPRUH
VXLWDEOHVHHKWWSZZZDUGXLQRFFSOD\JURXQG&RGH7LPHG$FWLRQ
7DVNVDUHVFKHGXOHGIRUVSHFLILFWLPHVGHVLJQDWHGE\WKHV\VWHPFORFNLQWKH7LPHOLEUDU\
VHH5HFLSHIRUPRUHGHWDLOV,I\RXFKDQJHWKHV\VWHPWLPHHJE\FDOOLQJ set
TimeWKHWULJJHUWLPHVDUHQRWDGMXVWHG)RUH[DPSOHLI\RXXVHsetTimeWRPRYHRQH
KRXUDKHDGDOODODUPVDQGWLPHUVZLOORFFXURQHKRXUVRRQHU,QRWKHUZRUGVLILWV
DQGDWDVNLVVHWWRWULJJHULQWZRKRXUVDWDQGWKHQ\RXFKDQJHWKHFXUUHQW
WLPHWRWKHWDVNZLOOWULJJHULQRQHKRXU,IWKHV\VWHPWLPHLVVHWEDFNZDUGIRU
H[DPSOH WR WKH WDVN ZLOO WULJJHU LQ WKUHH KRXUV LH ZKHQ WKH V\VWHP WLPH
LQGLFDWHV,IWKHWLPHLVUHVHWWRHDUOLHUWKDQWKHWLPHDWZKLFKDWDVNZDVVFKHGXOHG
WKHWDVNZLOOEHWULJJHUHGLPPHGLDWHO\DFWXDOO\RQWKHQH[WFDOOWRAlarm.delay
7KLVLVWKHH[SHFWHGEHKDYLRUIRUDODUPVWDVNVDUHVFKHGXOHGIRUDVSHFLILFWLPHRIGD\
DQGZLOOWULJJHUDWWKDWWLPHEXWWKHHIIHFWRQWLPHUVPD\EHOHVVFOHDU,IDWLPHULV
VFKHGXOHGWRWULJJHULQILYHPLQXWHVWLPHDQGWKHQWKHFORFNLVVHWEDFNE\RQHKRXU
WKDWWLPHUZLOOQRWWULJJHUXQWLORQHKRXUDQGILYHPLQXWHVKDYHHODSVHGHYHQLILWLVD
UHSHDWLQJWLPHUDUHSHDWGRHVQRWJHWUHVFKHGXOHGXQWLODIWHULWWULJJHUV
8SWRVL[DODUPVDQGWLPHUVFDQEHVFKHGXOHGWRUXQDWWKHVDPHWLPH<RXFDQPRGLI\
WKHOLEUDU\WRHQDEOHPRUHWDVNVWREHVFKHGXOHG5HFLSHVKRZV\RXKRZWRGRWKLV
onceOnlyDODUPVDQGWLPHUVDUHIUHHGZKHQWKH\DUHWULJJHUHGDQG\RXFDQUHVFKHGXOH
WKHVHDVRIWHQDV\RXZDQWVRORQJDVWKHUHDUHQRPRUHWKDQVL[SHQGLQJDWRQHWLPH
7KHIROORZLQJFRGHJLYHVRQHH[DPSOHRIKRZDtimerOnceWDVNFDQEHUHVFKHGXOHG
Alarm.timerOnce(random(10), randomTimer); // trigger after random number of
seconds
Solution
7KHVLPSOHVWZD\WRXVHDQ57&LVZLWKDFRPSDQLRQOLEUDU\IRUWKH7LPHOLEUDU\QDPHG
'657&K7KLVUHFLSHLVIRUWKHZLGHO\XVHG'6DQG'657&FKLSV
/*
* TimeRTC sketch
* example code illustrating Time library with real-time clock.
*
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
void setup() {
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
0RVW57&ERDUGVIRU$UGXLQRXVHWKH,&SURWRFROIRUFRPPXQLFDWLQJVHH&KDS
WHUIRUPRUHRQ,&&RQQHFWWKHOLQHPDUNHG6&/RU&ORFNWR$UGXLQRDQDORJ
SLQDQG6'$RU'DWDWRDQDORJSLQDVVKRZQLQ)LJXUH$QDORJSLQV
DQGDUHXVHGIRU,&VHH&KDSWHU7DNHFDUHWRHQVXUHWKDW\RXFRQQHFWWKH9
SRZHUOLQHDQG*QGSLQVFRUUHFWO\
)LJXUH&RQQHFWLQJDUHDOWLPHFORFN
Discussion
7KHFRGHLVVLPLODUWRRWKHUUHFLSHVXVLQJWKH7LPHOLEUDU\EXWLWJHWVLWVYDOXHIURPWKH
57& UDWKHU WKDQ IURP WKH VHULDO SRUW RU KDUGFRGHG YDOXH 7KH RQO\ DGGLWLRQDO OLQH
QHHGHGLVWKLV
setSyncProvider(RTC.get); // the function to get the time from the RTC
7KHsetSyncProviderIXQFWLRQWHOOVWKH7LPHOLEUDU\KRZLWVKRXOGJHWLQIRUPDWLRQIRU
VHWWLQJDQGXSGDWLQJWKHWLPHRTC.getLVDPHWKRGZLWKLQWKH57&OLEUDU\WKDWUHWXUQV
WKHFXUUHQWWLPHLQWKHIRUPDWXVHGE\WKH7LPHOLEUDU\8QL[WLPH
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
void setup() {
Serial.begin(9600);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus()!= timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
if(Serial.available())
{
time_t t = processSyncMessage();
if(t >0)
{
RTC.set(t); // set the RTC and the system time to the received value
setTime(t);
}
}
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
time_t processSyncMessage() {
// return the time if a valid sync message is received on the serial port.
// time message consists of a header and ten ascii digits
while(Serial.available() >= TIME_MSG_LEN ){
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
return pctime;
}
}
return 0;
}
7KLVVNHWFKLVDOPRVWWKHVDPHDVWKH7LPH6HULDOVNHWFKLQ5HFLSHIRUVHWWLQJWKH
WLPHIURPWKHVHULDOSRUWEXWKHUHWKHIROORZLQJIXQFWLRQLVFDOOHGZKHQDWLPHPHVVDJH
LVUHFHLYHGIURPWKHFRPSXWHUWRVHWWKH57&
RTC.set(t); // set the RTC and the system time to the received value
setTime(t);
7KH 57& FKLS XVHV ,& WR FRPPXQLFDWH ZLWK $UGXLQR ,& LV H[SODLQHG LQ &KDS
WHUVHH5HFLSHLI\RXDUHLQWHUHVWHGLQPRUHGHWDLOVRQ,&FRPPXQLFDWLRQZLWK
WKH57&FKLS
See Also
7KH6SDUN)XQ%2%GDWDVKHHWKWWSVWRUHJUDYLWHFKXVLFUHFOKWPO