Time Check
This example for a Yún device gets the time from the Linux processor via Bridge, then parses out hours, minutes and seconds for the Arduino. The Yún device must be connected to a network to get the correct time. If you used the web-based WiFi interface to configure the Yún device for the network, make sure you've selected the proper time zone.
Hardware Required
- Yún board or shield
- WiFi network connected to the internet
Circuit
Code
You need to include the Process class :
#include <Process.h>
Create an instance of Process that will be used to get the date, and create variables to hold the current hour, minute, and second. You'll also want to create a variable to store the previous time. To start, put in a value that cannot be a valid time (like a negative number).
Process date;
int hours, minutes, seconds;
int lastSecond = -1;
In @@setup()@ initialize Bridge and Serial. Wait until there is a serial connection before continuing with the sketch and printing a status to the serial monitor.
void setup() {
Bridge.begin();
Serial.begin(9600);
while(!Serial);
Serial.println("Time Check");
Run an initial process to get the time by adding the parameter "T" to date
.
if (!date.running()) {
date.begin("date");
date.addParameter("+%T");
date.run();
}
}
In loop()
check to see if a second has passed since the previous time. If so, print out the current time to the serial monitor and restart the date
process if it has stopped.
void loop() {
if(lastSecond != seconds) { // if a second has passed
if (hours <= 9) Serial.print("0"); // adjust for 0-9
Serial.print(hours);
Serial.print(":");
if (minutes <= 9) Serial.print("0"); // adjust for 0-9
Serial.print(minutes);
Serial.print(":");
if (seconds <= 9) Serial.print("0"); // adjust for 0-9
Serial.println(seconds);
if (!date.running()) {
date.begin("date");
date.addParameter("+%T");
date.run();
}
}
If there is a result from the date
process, parse the data. First, store the result (hh:mm:ss) in a string, then find the location of the colons with indexOf()
and lastIndexOf()
.
while (date.available()>0) {
String timeString = date.readString();
int firstColon = timeString.indexOf(":");
int secondColon= timeString.lastIndexOf(":");
Knowing the index numbers of the colons, you can separate the hours minutes and seconds as substrings :
String hourString = timeString.substring(0, firstColon);
String minString = timeString.substring(firstColon+1, secondColon);
String secString = timeString.substring(secondColon+1);
Finally, convert the strings to ints, and save the previous second to do a time comparison in the next loop()
.
hours = hourString.toInt();
minutes = minString.toInt();
lastSecond = seconds;
seconds = secString.toInt();
}
}
The complete code follows :
/*
Time Check
Gets the time from Linux via Bridge then parses out hours,
minutes and seconds using a YunShield/Yún.
created 27 May 2013
modified 21 June 2013
By Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/TimeCheck
*/
#include <Process.h>
Process date; // process used to get the date
int hours, minutes, seconds; // for the results
int lastSecond = -1; // need an impossible value for comparison
void setup() {
Bridge.begin(); // initialize Bridge
SerialUSB.begin(9600); // initialize serial
while (!Serial); // wait for Serial Monitor to open
SerialUSB.println("Time Check"); // Title of sketch
// run an initial date process. Should return:
// hh:mm:ss :
if (!date.running()) {
date.begin("date");
date.addParameter("+%T");
date.run();
}
}
void loop() {
if (lastSecond != seconds) { // if a second has passed
// print the time:
if (hours <= 9) {
SerialUSB.print("0"); // adjust for 0-9
}
SerialUSB.print(hours);
SerialUSB.print(":");
if (minutes <= 9) {
SerialUSB.print("0"); // adjust for 0-9
}
SerialUSB.print(minutes);
SerialUSB.print(":");
if (seconds <= 9) {
SerialUSB.print("0"); // adjust for 0-9
}
SerialUSB.println(seconds);
// restart the date process:
if (!date.running()) {
date.begin("date");
date.addParameter("+%T");
date.run();
}
}
//if there's a result from the date process, parse it:
while (date.available() > 0) {
// get the result of the date process (should be hh:mm:ss):
String timeString = date.readString();
// find the colons:
int firstColon = timeString.indexOf(":");
int secondColon = timeString.lastIndexOf(":");
// get the substrings for hour, minute second:
String hourString = timeString.substring(0, firstColon);
String minString = timeString.substring(firstColon + 1, secondColon);
String secString = timeString.substring(secondColon + 1);
// convert to ints,saving the previous second:
hours = hourString.toInt();
minutes = minString.toInt();
lastSecond = seconds; // save to do a time comparison
seconds = secString.toInt();
}
}
See Also
- Bridge Library - Your reference to the Bridge Library
- Bridge – Simple REST style calls to access analog and digital pins
- Console Ascii Table – A complete ASCII table printed to the Console
- Console Pixel – Turn an LED on and off through the Console
- Console Read - Read data coming from bridge using the Console.read() function
- Data Logger - Log data from three analog sensors to an SD card.
- File Write - How to write file into the Yún filesystem.
- Http Client - A basic HTTP client that connects to the internet and downloads content.
- Http Client Console - HTTP client that connects, downloads content and shows it using WiFi and Console.
- Mailbox Read Message - How to read the messages queue, called Mailbox, using the Bridge library.
- Process - How to run linux processes using an Yún.
- Remote Due Blink - How to upload remotely a sketch on DUE boards.
- Shell Commands - How to run linux shell commands using a Yún.
- Temperature Web Panel - How to serve data from an analog input via the Yún's built-in webserver.
- WiFi Status - Prints information about the status of your wifi connection.
- Yún First Configuration - Easily configure your Yún device using Serial Monitor and USB port.
- Serial Terminal - Use the Yún's 32U4 processor as a serial terminal for the Linux side on the Yún.
Last revision 2016/05/25 by SM