I want to sync the Time from my pc to the arduino. I am using their Time library but it does not work.
How can I get the arduino to have the same time as on my computer ? I am currently using a mac.
Their documentations says :
On a unix system, you can set the time with the shell command:
TZ_adjust=-8; echo T$(($(date +%s)+6060$TZ_adjust)) > /dev/tty.usbserial-A8008pym
I tried on the terminal
>export TZ_adjust=-8; echo T$(($(date +%s)+6060$TZ_adjust)) > /dev/tty.usbmodemfd131
and I get Permission denied.
What am I doing wrong? Is there a simpler way to sync the time on arduino with my computer?
The Code
#include <Time.h>
#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
void setup() {
Serial.begin(9600);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println("Waiting for sync message");
}
void loop(){
if(Serial.available() )
{
processSyncMessage();
}
if(timeStatus()!= timeNotSet)
{
digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
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 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);
}
void processSyncMessage() {
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
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 Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.print(TIME_REQUEST,BYTE);
return 0; // the time will be sent later in response to serial mesg
}
Check that you have the correct port selected. If it is correct, try pressing the board's reset button after initiating the upload. This error can happen if the board on the selected port has been disconnected from the computer, or reassigned to a different port. Make sure the board is connected to your computer.
First make sure your board is on (the green LED is on) and connected to the computer. The Arduino Uno and Mega 2560 may have trouble connecting to a Mac through a USB hub. If nothing appears in your "Tools > Serial Port" menu, try plugging the board directly to your computer and restarting the Arduino IDE.
Be warned, the Arduino won't always be recognized automatically. If your Arduino is not recognized. then uninstall the driver, remove the Arduino, reinsert the Arduino, find the unrecognized device, right click “Update driver”, and then click “Search automatically”. This should fix 99 out of 100 problems.
The time value can be obtained from the webserver API or PC and it can be sent to the Arduino as a string or an int array. In the below processing code, it is using the PC time(Processing code-1) and sending the value as an int array.
Conrad and I discovered the solution after a 20 minute chat:
To set the variable to EST
TZ_adjust=-5;
sudo echo "T$(($(date +%s)+60*60*$TZ_adjust))" >/dev/tty.usbmodemfa131
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With