Pages: 1 ... 7 8 [9] 10   Go Down
Author Topic: Time Library added to Playground  (Read 28985 times)
0 Members and 1 Guest are viewing this topic.
Central Europe
Offline Offline
Edison Member
*
Karma: 6
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

There may be a weakness in setTime(). Try to call now() right before you call setTime(). If that solves the problem, let us know it, then we can have it fixed.

Korman
« Last Edit: November 01, 2010, 05:44:24 am by Korman » Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 548
Posts: 46029
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Try to call now() right before you call setTime().
If the value returned by now() is supposed to be set by the call to setTime(), how in the heck is calling now() first going to accomplish anything?
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 6
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No, I mean something like:
Code:
[glow]now();[/glow]
setTime(pctime);
timeStorage = now();

And no, that's not voodoo, it might prevent a potential problem from happening. If everything works fine with the additional now(), we have discovered a bug which will be easy to solve. If it doesn't the thing I imagined to be a problem isn't one and we're barking up the wrong tree.

Korman
« Last Edit: November 01, 2010, 05:59:56 am by Korman » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

That indeed solves the problem. So if I understand it right, to get a precise sync, for the moment, you need to call now() just before setTime() ?

Quote
\0x07Waiting for sync message

\0x07
now() time before syncing = 3
pctime, time that was synced with
= 1288477507
timeStatus() after syncing = 2
now() time after syncing = 1288477507


now() time before syncing = 1288477549
pctime, time that was synce
d with = 1288477507
timeStatus() after syncing = 2
now() time after syncing = 1288477507


now() time before syncing = 1288477534
pctime, time that was sy
nced with = 1288477507
timeStatus() after syncing = 2
now() time after syncing = 1288477507

Code:
/*
 * TimeSerial.pde
 * example code illustrating Time library set through serial port messages.
 *
 * Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
 * you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2010
 T1262347200  
 *
 * A Processing example sketch to automatically send the messages is inclided in the download
 */

#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
unsigned long timeStorage = 0;

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() ;
    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    
        }
      }  
      timeStorage = now();
      Serial.println();
      Serial.print("now() time before syncing = ");
      Serial.println(timeStorage);
      setTime(pctime);   // Sync Arduino clock to the time received on the serial port
      timeStorage = now();
      Serial.print("pctime, time that was synced with = ");
      Serial.println(pctime);
      Serial.print("timeStatus() after syncing = ");
      Serial.println(timeStatus());
      Serial.print("now() time after syncing = ");
      Serial.println(timeStorage);
    }  
  }
}

time_t requestSync()
{
  Serial.print(TIME_REQUEST,BYTE);  
  return 0; // the time will be sent later in response to serial mesg
}

« Last Edit: November 01, 2010, 06:11:12 am by Thomas_de_Graaff » Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 6
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
That indeed solves the problem.

Ok, the bug in the setTime function is that it doesn't reset prevMillis to the value of millis(). So the next time you call now(), the difference between the last call to now() and the current value of millis() will be added to the time you just adjusted with setTime(). If now is called often enough, that isn't a visible problem. However if you call now() only every 5 seconds and use setTime() directly, you get that weird offset you saw.

Next step: Finding out who maintains the Time library and where to post a patch...

Korman
« Last Edit: November 01, 2010, 06:36:26 am by Korman » Logged

London
Offline Offline
Faraday Member
**
Karma: 8
Posts: 6240
Have fun!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks Korman.

I have added the fix and uploaded it to the Playground.
Give it a go and let me know how you get on.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wow, that is a quick bugfix! smiley

It's working just fine now.
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 6
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mem,

it looks good now. Thank you for the quick response. For completeness here's my test program which fails with the old library and works with the new one:
Code:
#include <Time.h>
void setup () {
      Serial.begin (9600);
      delay (10000);
      Serial.println (now());
      delay (10000);
      setTime (123456789);
      Serial.println (now());
}
void loop(){
}

Results with old Time library - highlight is wrong:
Quote
10
1234567[glow]9[/glow]9

Results with new Time library - highlight is ok now:
Quote
10
1234567[glow]8[/glow]9

Korman
« Last Edit: November 01, 2010, 02:40:17 pm by Korman » Logged

London
Offline Offline
Faraday Member
**
Karma: 8
Posts: 6240
Have fun!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

loomi, sorry I missed your post about parsing dates. Date strings are supported in the current library so your sketch could use something like this:

Code:
// function to return the numeric month from a given 3 character month string
// Jan is returned as 1, December as 12
int getMonth(char *mnthStr)
{
   for( int mo = 1; mo <=12; mo++)
   {    
      if(strcmp( mnthStr, monthShortStr(mo)) == 0)
         return mo;        
   }    
   return 0;
}

Have a look at Datestrings.cpp in the Time library directory if you want to look at the monthShortStr function
« Last Edit: November 01, 2010, 03:55:49 pm by mem » Logged

Auburn, CA, USA
Offline Offline
Newbie
*
Karma: 2
Posts: 20
Arduino pebbles
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Is there any particular interest in having the DS3231 specific features (such as forcing a temperature conversion, reading the temperature value, toggling the 32KHz pin, etc) added? I've already got the first two there finished, although I can't actually test them.
Logged

London
Offline Offline
Faraday Member
**
Karma: 8
Posts: 6240
Have fun!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi  ccfreak2k, I would be interested to hear the responses to your question. Why not start a new thread for discussion of your library when you have had a chance to get it tested and place a link here so people can find it..

I would be happy to include a DS3231 library with the Time library distribution  if this is something people want.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I am trying to use this library, and can't see to get past what appears to be a simple error, using Ard0021 on OS X.

I have unpacked the zip, and so now have

Sketches
  - Libraries
       - Time (dl from playground)
       - TinyGPS (was there already)
       - NewSoftSerial (was there already)

Sketches in the Sketches folder seem to have no problem using header files from the TinyGPS or NewSoftSerial folders, but whenever I try to include Time.h, I get this:

TimeGPS.cpp:7:18: error: Time.h: No such file or directory

The include line looks like this:

#include <Time.h>

I've reviewed the Arduino instructions several times, and can't see what I'm doing wrong.  Time.H is shown in the list of available libraries when I select Sketch - Import Library (along with NewSoftSerial and TinyGPS).

I copied the TimeGPS example to the Sketches folder, and it can find the TinyGPS and NewSoftSerial.h no problem (they turn orange in the editor), but can't find the Time.h, even though it's in the same place.  Time.h doesn't turn black.

I must be doing something wrong - can anyone point me in the right direction, please?
Logged

London
Offline Offline
Faraday Member
**
Karma: 8
Posts: 6240
Have fun!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

SeanC, did you try to open  the TimeGPS example sketch by navigating:  File->Examples->Time->Examples->TimeGps

If you can open and correctly compile that sketch,  click  File->Save As to your sketchbook directory and after the IDE copies the sketch, see it that also compiles okay.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 2
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks for your reply!  I unpacked the archive again, opened the

TimeGPS example sketch with :  File->Examples->Time->Examples->TimeGps

and it still fails the same way.  Interestingly, I can see it's going to fail, because the Time.h in the sample code is all black in the editor, whereas the two found libraries, TinyGPS and NewSoftSerial are orange.

#include <Time.h>
#include <TinyGPS.h>    
#include <NewSoftSerial.h>  

I closed and re-opened the arduino ide, and still can see Time in the Sketch-Import Libraries menu.

Any help would be appreciated!
Logged

London
Offline Offline
Faraday Member
**
Karma: 8
Posts: 6240
Have fun!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I think the coloring is a red herring. Arduino libraries use a syntax coloring file to enble the IDE to highlight keywords. Tinygps and NewSoftSerial are Class names that are used within the sketch so they are in the Syntax coloring file. The Time class name is not explicitly used in a sketch so its in the syntax coloring file and is not highlighted.

Something else is causing your problem. Are you quite sure that the Time library folder location is  correct and that all the files are there?

I don't use OS X, perhap someone that does can check if they have any problems compiling the Time library example sketches.

« Last Edit: November 07, 2010, 01:44:24 pm by mem » Logged

Pages: 1 ... 7 8 [9] 10   Go Up
Jump to: