Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to sync computer time to Arduino via USB

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
}
like image 285
Conrad C Avatar asked Nov 11 '12 20:11

Conrad C


People also ask

Why is my program not uploading to Arduino?

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.

Why isn't my Arduino connecting to my 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.

How do I get my computer to recognize my Arduino?

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.

Can Arduino get computer time?

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.


1 Answers

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
like image 115
David K Avatar answered Sep 27 '22 19:09

David K