Who needs a Software Real Time Clock?

mem:
Good news. I had done what you suggested and it still did not run on 0011. But I moved to 0012 and it just ran correctly overnight! I will investigate and see if I see anything further on 0011, but probably just
move to 0012 for this project. Thanks for your help.

mem:
After an absence I got back to this project and this time was able to get it working on a different mac with no problem on arduino 11. It runs for days with no problems. Now I cannot get it to compile on arduino 12 as it consistently is giving stdlib.h errors. I have tried the newest playground files. Anything you could point me to would be appreciated.

Hi hotcarrier, the code in the playground compiles without problem under 0012 on my machine. Have you tried to compile the playground example sketch? If that compiles ok then perhaps post your sketch, it maybe something there causing the problem.

Good Luck!

I am sure that I am doing something dumb here... but I am running into a mental block or some such craziness trying to get the hour component to show up in 12hr increments rather than the 24hr setup.
The Date Time code is working quite well - so I know it is something I am not doing right - I have tried to assign the DateTime.hour like so:

hours = (DateTime.Hour);
if (hours > 12) {hours = hours - 12;}

So... I am pretty sure it is something dumb I am doing, but at this point I cant figure it out.

I have the minutes and seconds working well - I am breaking out the tens and ones of each one, and displaying on a 7 segment LED setup.

Help is greatly appreciated! :smiley:
Thanks

to convert to 12 hour format you do the following:
between 0000 and 0059, add 12 hours
between 0100 and 1159, straight conversion to AM
between 1200 and 1259, straight conversion to PM
between 1300 and 2359, subtract 12 hours

Here is a function you can put in your sketch that will convert the 24 hour format from the library to 12 hour format

byte hours24To12(byte hours){
  if( hours == 0 )
    return 12; // 12 midnight
  else if( hours  > 12)
    return hours - 12 ;
  else
    return hours ;
}

Determining AM/PM is easier, if the 24 hour value is < 12 its AM , otherwise its PM

I will add these functions to the next release of the library, let me know how you get on.

Thanks for the code :slight_smile:

edit - fixed my code, and it works great now! :smiley:

Greetings! I'm just starting to mess around with the Arduino and I ran into a problem with the SetArduinoClock example from the DateTime library. Specifically, the Processing part of the example that reads a time code back from the Arduino to display a small analog clock on screen seems to be mangling the timecode header byte. The byte is sent from the board as 255 but ends up getting mangled by the call to myPort.readStringUntil(LF);

I came up with some alternate code that works and I wanted to share it.

void serialEvent(Serial p) {
byte[] inBuffer = myPort.readBytesUntil(LF);
if(inBuffer == null || inBuffer.length == 0) {
return;
}
if(inBuffer[0] == byte(TIME_HEADER)) {
int val = 0;
long time = 0;
for(int i = 1; i <= 10; i++)
time = time * 10 + (inBuffer - '0');

  • UpdateClock(time);*
  • } else {*
  • print(new String(inBuffer));*
  • } *
    }[/font]
    I'm running Processing V. 1.03 on a Mac. I'm posing this here as the DateTime wiki page linked to this forum. I also couldn't send a direct message to the PM contact as I have a posting count of 0...until I click Post in 3, 2 , 1.... :slight_smile:

Hi Dave, what symptoms are you seeing? I am running processing 1.01 (on windows) and the playground code works fine for me. But I am happy to make the change from strings to a char array if it fixes the problem for you. I am curious however to know what exactly is the problem.

i'm working on arduino severino
it have serial input, so i changed baud rate to 9600
i'm able to upload successfully, but no output from serial port is coming

You don't say if you get output with other sketches.

Try adding a print statement in setup to see if you can get that output
Serial.println("Setup Complete");

If you see that but nothing else then your Arduino is detecting the message to set the time. Make sure both sides are using 9600 baud and that you have selected the correct com port in Processing

I'm still waiting for my first Arduino in the post, so excuse my ignorance...

I'm looking to use the software real time clock in my first project as I need to trigger a function twice a day at certain times. I'm also looking at using the watchdog timer and sleep functions to save energy (http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/).

Are the two compatible, or is there some way to make them compatible? I realise that I might need to use a different sleep mode than that used in the example linked to above (maybe "power save" mode instead of "power down" mode).

Any help would be appreciated!

I had some free time today so I finally got around to allowing my Arduino to sync the DateTime over the internet using the wiznet module. It grabs the time from the NIST server which gives a response like this:

54964 09-05-13 21:01:33 50 0 0  14.3 UTC(NIST) *

From that it was a little bit of work figuring how to convert to unix time, but I got it sorted. The nice thing about using NIST is that it also indicates if it is daylight savings or standard time so the time will always be correct. No adjustment needed or watching for specific dates. I currently update the time every twelve hours. With the price of the wiznet module around $16 I think this trumps having a RTC because of the other things you can do with ethernet.

Currently, this is in a pretty large program on my Sanguino. If there's interest I could put together an example sketch that simply updates the time from NIST.

Are the two compatible, or is there some way to make them compatible?

The majority of the sleep modes on the AT90USB162 processor seem to shut off all the timers (except the watchdog timer). This means millis stops running.

Hopefully this will help...
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1240918097

Good luck,
Brian

Thanks Brian,
I've worked out a new control algorithm that doesn't require date/time, so now I just need to put the arduino to sleep and wake it every few minutes to conserve energy. Looks like the thread you've linked to will do the trick.

Cheers,
Todd

I've been looking at this code and there are two general questions I have about it, one technical and one non-technical.

The technical issue is that unless I'm missing something there doesn't seem to be any support for time zones, even implicitly.

The most simple solution to this would be to simply add an offset field in the structure which would be used when calculating the more calendar friendly time structure.

A more complete but complex solution would be to add a simplified time zone function per zone. This wouldn't have the historical time zone information (ie it wouldn't work for past times) but would be "good enough" and relatively small.

Thoughts on either?

The non-technical question is that the code itself has a copyright with all rights reserved, and then no subsequent license that I could find. Is that an oversight or by design?

Thanks

Hi emacsen,

The lack of license statement is oversight. It is licensed under the GNU LGPL and I will add that into the source files when I upload the next version.

In my own code I handle time zone offset when needed by adding the offset value to calls to DateTime.sync. But usually I don't need it because the clock on the computer that sets the time is already compensated for the local time zone.

If you think it would be useful to have a timezone property that contained the offset in hours from UTC then I can easily add that.

If you are thinking about displaying multiple time zones, I wonder if it would help if I added something like the following method:

boolean SetTimeZone(int offsetFromUTC)
// set the time zone offset to the given value
// if time has been synced, refresh time properties and return true
// else return false

This would result in calls to DateTime.hour, DateTime.Day etc reflecting the given time zone offset.

I'd never considered the idea that the computer would be giving the arduino the time in epoch seconds, but not in UTC. This may be the difference between operating system assumptions. On a Unix system it's fairly common (ie the standard case) for the platform to always have the time in UTC, and then a configuration specifies the local time zone.

I generally feel that handling time zones correctly is a to go down the rabbit's hole. You can't just have offsets because of daylight savings. Where I live (East coast of the US) we're +5 hours from UTC, but sometimes we deviate with daylight savings. So if you have your clock running w/o a computer for an extended period, you're going to end up with the wrong time (just like my bedroom clock and microwave).

And to make matters worse, that deviation changes with time. I think it was just a year ago they changed daylight savings time in the US so it's 3 weeks off from where it was, hence my comment about not being able to correctly display historical times. That's why the zoneinfo files are so large. I'm not advocating that; but I'm wondering about the utility of a set of functions which look at the date and make the adjustment accordingly for the timezones as they are at this moment.

Probably the right answer is for that to be a separate library, much like the DateTimeStrings are separate.

It's just a thought. It doesn't impact what I'm doing with the library right now.

It's a nice library, so thanks for clearing up the license question too.

The processing sketch in the library distribution that sets the time does handle local time zone offset and daylight savings time, so the Arduino is set to the correct local time. Of course, the Arduino code is currently oblivious to time zones and DST so it will ignore any changes in daylight savings wile disconnected until its resynched again from the computer.

The change proposed my previous post would provide a local correction for the displayed time but because the system time is not affected, date math will still be correct – i.e. not affected by changes in offsetFromUTC.

I will probably add the function to display time from a given offset in next release, but will see how many people demand onboard DST correction before thinking any more about that.

I agree about the rabbit hole comment :wink:

Thanks for your interest.

Have fun!

Hello! another novice here.

I have been using Arduino for about a month and the DateTime and DatreTimeString libraries are the first I have tried to add myself.

I am getting warnings the first time I start the Arduino programming interface (v 0016) on my computer (Windows XP).

Errors:

[color=#ff0000]
DateTimeStrings.cpp:32: warning: only initialized variables can be placed into program memory area
DateTimeStrings.cpp:33: warning: only initialized variables can be placed into program memory area
DateTimeStrings.cpp:34: warning: only initialized variables can be placed into program memory area
   .
   . (numbering sequence continues - just did not want to bore anyone <grin> )
   .
DateTimeStrings.cpp:64: warning: only initialized variables can be placed into program memory area[/color]

then I load the DateTime.pde. (since I am a n00b I did not know if the errors were expected or not)

clicked verify and no errors were reported, then I uploaded it, and again no errors, however there is no responce, either from the onboard LED or from the serial monitor set to 19200 baud.

I copied the top part of the DateTime.pde code as it appears in my programmer incase the coloring difference in the include lines means anything to anyone.

I am working on a project based on Garduino from dirtnail.com that uses the date functions for automating a greenhouse's growing environment. I believe I can get away from using the DateTimeStrings library but I can see where t would be great for other projects I have in mind and am currently clueless how to correct the problem. Any help is appreciated.

-Michael (Endante)

// DateTime.pde
// example sketch for the DateTime library

#include <DateTime.h>
#include <DateTimeStrings.h>

#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER 255 // Header tag for serial time sync message

void setup(){
Serial.begin(19200);
pinMode(13,OUTPUT); // we flash the LED each second
}

The example sketch only starts outputting the time after the clock has been set. In that example, this is done by sending a time string to the arduino serial port. There is an example Processing sketch that does this but if you want to test Arduino code without running the Processing sketch, you can add the following line to the Arduino code at the end of setup:

DateTime.sync(1230768000);

This will start the clock from Jan 1 2009 when the sketch begins.

Once you have this working you can add the appropriate code to set the clock for your application.