88 lines
2.5 KiB
Arduino
88 lines
2.5 KiB
Arduino
|
/*
|
||
|
* TimeGPS.pde
|
||
|
* example code illustrating time synced from a GPS
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include <TimeLib.h>
|
||
|
#include <TinyGPS.h> // http://arduiniana.org/libraries/TinyGPS/
|
||
|
#include <SoftwareSerial.h>
|
||
|
// TinyGPS and SoftwareSerial libraries are the work of Mikal Hart
|
||
|
|
||
|
SoftwareSerial SerialGPS = SoftwareSerial(10, 11); // receive on pin 10
|
||
|
TinyGPS gps;
|
||
|
|
||
|
// To use a hardware serial port, which is far more efficient than
|
||
|
// SoftwareSerial, uncomment this line and remove SoftwareSerial
|
||
|
//#define SerialGPS Serial1
|
||
|
|
||
|
// Offset hours from gps time (UTC)
|
||
|
const int offset = 1; // Central European Time
|
||
|
//const int offset = -5; // Eastern Standard Time (USA)
|
||
|
//const int offset = -4; // Eastern Daylight Time (USA)
|
||
|
//const int offset = -8; // Pacific Standard Time (USA)
|
||
|
//const int offset = -7; // Pacific Daylight Time (USA)
|
||
|
|
||
|
// Ideally, it should be possible to learn the time zone
|
||
|
// based on the GPS position data. However, that would
|
||
|
// require a complex library, probably incorporating some
|
||
|
// sort of database using Eric Muller's time zone shape
|
||
|
// maps, at http://efele.net/maps/tz/
|
||
|
|
||
|
time_t prevDisplay = 0; // when the digital clock was displayed
|
||
|
|
||
|
void setup()
|
||
|
{
|
||
|
Serial.begin(9600);
|
||
|
while (!Serial) ; // Needed for Leonardo only
|
||
|
SerialGPS.begin(4800);
|
||
|
Serial.println("Waiting for GPS time ... ");
|
||
|
}
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
while (SerialGPS.available()) {
|
||
|
if (gps.encode(SerialGPS.read())) { // process gps messages
|
||
|
// when TinyGPS reports new data...
|
||
|
unsigned long age;
|
||
|
int Year;
|
||
|
byte Month, Day, Hour, Minute, Second;
|
||
|
gps.crack_datetime(&Year, &Month, &Day, &Hour, &Minute, &Second, NULL, &age);
|
||
|
if (age < 500) {
|
||
|
// set the Time to the latest GPS reading
|
||
|
setTime(Hour, Minute, Second, Day, Month, Year);
|
||
|
adjustTime(offset * SECS_PER_HOUR);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (timeStatus()!= timeNotSet) {
|
||
|
if (now() != prevDisplay) { //update the display only if the time has changed
|
||
|
prevDisplay = now();
|
||
|
digitalClockDisplay();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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 printDigits(int digits) {
|
||
|
// utility function for digital clock display: prints preceding colon and leading 0
|
||
|
Serial.print(":");
|
||
|
if(digits < 10)
|
||
|
Serial.print('0');
|
||
|
Serial.print(digits);
|
||
|
}
|
||
|
|