RTCSetup

by luca
27 comments

All of you certainly had to configure an RTC chip with the current date and time… today’s project can help to perform that task!

The project

RTCSetup is composed by two elements:

[checklist]

  • a GUI, written in C# and running on the PC
  • sketch running on Arduino, that is connected to the RTC

[/checklist]

GUI and sketch communicate through a serial connection, with a simple protocol. The source for both of them are available in my Github’s repository.

Arduino and RTC

I chose to use the Adafruit’s RTClib library to talk with the DS1307 chip, that is for sure one of the most used RTC in the hobbistic world. The connection between the IC and Arduino is established using the I2C bus:

In the image below the connection is made using the “new” I2C PINs of Arduino Uno; obviously you can still use the A4 and A5 PINs.

For a detailed description of the connection and the use of the library, please refer to the official tutorial.

The Arduino’s sketch receives the commands from the PC, executes them and sends back a response.

Protocol

As I wrote, the communication between the GUI and the Arduino uses a simple protocol made by only 4 commands:

Command: ##

The first command sent after the connection is established, used by the PC to verify that a “compatible” device is connected to the serial port. Arduino must answer with !!

Command: ?V

This command is used to obtain the version of the sketch. Arduino answers with the string defined as a constant at the top of the sketch:

#define VERSION     "1.0"

Command: ?T

This command is used to get the actual date and time, read from the RTC. Arduino answers with a string in the format dd/MM/yyyy hh:mm:ss.

Command: !TddMMyyyyhhmmss

This command is used to set the RTC time. Arduino answers with OK.

GUI

The GUI, developed in C#, talks with Arduino using the protocol above and implements three functionalities:

[checklist]

  • sets the current date and time
  • sets a custom date and time defined by the user
  • gets and displays the actual date and time of the RTC

[/checklist]

First, you must choose the serial port Arduino is connected to and press CONNECT. If the connection is established (commands ## and ?V) the sketch’s version is displayed in the status bar.

The first panel shows the actual time of the PC. With a click on the right button (red arrow) you can configure the RTC with that time:

With the green arrow button you can instead get the actual time of the RTC:

Finally you can, using the date-time picker on the center, choose custom date and time values and send those to the RTC:

Technical details

I used the method described in this tutorial to embed a custom font in the application.

I measured the time (150ms) the sketch takes to set the time when the command is sent by the GUI: this is the reason why in the code you can see that the !T command is sent when the actual milliseconds are 850 and the time passed is the actual one + 1 second.

while (DateTime.Now.Millisecond != 850)
  Thread.Sleep(1);
 
string command = "!T" + time.AddSeconds(1).ToString("ddMMyyyyHHmmss");
serialPort.WriteLine(command);

Related Posts

27 comments

Devin Saturday November 30th, 2013 - 04:01 AM

You are the man! Been waiting for something simple like this for setting my rtc’s. Thanks again for sharing!

Reply
Antonio Tuesday February 18th, 2014 - 01:02 AM

Where I can downloas RTCsetup GUI?
Thanks

Reply
luca Tuesday February 18th, 2014 - 08:13 PM

Hi Antonio, you can download a pre-compiled version of my program from Github:
https://github.com/lucadentella/RTCSetup/tree/master/VisualStudio/RTCSetup/RTCSetup/bin/Debug
(you need only RTCSetup.exe)

Reply
CS Friday March 21st, 2014 - 04:19 PM

Hi, thanks for sharing this nice project – very useful 🙂 May I ask a question?…. I have updated the Arduino Sketch to use the RTC DS3231 which is very similar – the only difference is that ‘day’ in the DS1307 library becomes ‘date’ in the DS3231 library – all compiles fine but the computer end doesn’t successfully set the RTC desite reporting that it has done so – wondernig if there is anything I need to change in the VB code to get this working? Thanks.

Reply
luca Saturday March 22nd, 2014 - 03:01 PM

Hi! well… no if your sketch can correctly “parse” the string my app sends and set the fields in the RTC. I don’t have a DS3231, which library are you using on Arduino side?

Reply
CS Saturday March 22nd, 2014 - 04:22 PM

Hi Again, Whilst I havn’t got this working with the DS3231 yet I have got it working with the DS1307 – very nice.

One cool update might be to automatically update the RTC every second so you can see how this relates to the system time with ease 🙂

Reply
CS Saturday March 22nd, 2014 - 04:29 PM

Hi, Thanks for the reply – the library I’m using is this one: https://gist.github.com/jeje/2021145 – it looks like the day of week element of this library might be tha main difference and is causing the problems?

Reply
CS Saturday March 22nd, 2014 - 04:56 PM

Hi Luca,

OK, it was the Day of Week element that was throwing things out – splicing a ‘0’ into the end of set_time solved that one :-)… would still be great to see RTC time update every second as per System Time…. how do we do that ?

Reply
JH Tuesday September 23rd, 2014 - 05:40 PM

Hi Luca,
thanks for your great job. It works fine on 2 different Arduino Mega 2560.
It doesn’t work on a Pro Micro with ATmega32U4. The ATmega32U4 features build-in USB functionality, instead a additional USB-Controller like the Mega.
Is this already the problem or could it be with the serial buffer size?

Reply
luca Monday September 29th, 2014 - 07:46 AM

Hi JH, unfortunately I don’t have a Leonardo or similar to test the sketch at the moment… did you get any errors?

Reply
Duncan Sunday January 4th, 2015 - 12:59 PM

Am I correct in thinking that this is windows only?

I agree with Devin – this is so incredibly useful but I was forced onto Linux when Windows continued to crash regularly, even after a complete re-install.

It might run under Wine I guess but, so far, I haven’t had a lot of success with that.

Your ENC28J60 tutorial series is also proving to be incredibly helpful and, as far as I have got with it, everything has worked ‘straight out of the box’.

Thanks Luca…

Reply
luca Thursday January 8th, 2015 - 09:43 AM

Hi Duncan

thanks for your feedback! I developed the RTCSetup client using .Net, maybe you can run it on Linux using Mono. I’m going to develop my next projects using Java so they should be more portable on different OSes.

Reply
Duncan Monday January 12th, 2015 - 05:00 PM

Thanks Luca
I took a look at Mono but didn’t understand a word of it (in my 60s and no background in computing, but techie in the days of valves!).
Could you add this to your list of Java projects – It really is an incredibly useful.
If it could set all the RTCs on the network, using Ethernet or WiFi (it’s just easier sometimes if things have their own RTC to act at certain intervals) that would be a real killer, but I doubt it’s possible.
Keep the tutorials coming…

Reply
ARE Tuesday June 23rd, 2015 - 07:21 PM

Hola que tal. mira traté de correr tu boceto pero me marca un error donde dice que el RTC_sd1307 no tiene un miembro begin en la libreria.no eh podido corregirlo. Utilizo arduino uno.

Reply
luca Wednesday June 24th, 2015 - 08:48 PM

Hi! Did you install the RTClib from Adafruit?

Reply
MileNS Thursday June 25th, 2015 - 10:03 PM

I really have some bad luck…
I doesn’t work for me bcs some reason RTC app crash. it does connect to board, it does read (wrong) time/date from ds1307 but when I hit SET button it goes to “not responding”…

Reply
Antonio Saturday October 10th, 2015 - 04:19 PM

Luca,
è possibile per far girare la una GUI in C# sul Mac?
Grazie

Reply
Harry H. Arends Wednesday November 18th, 2015 - 04:24 PM

Hi Luca,
I installed the GUI and uploaded the sketch.
The sketch works fine if i use the IDE terminal, it responds on all commands.
Using the GUI is gets the correct version (1.0) and the RTC time.
But when i want to write the new time using the GUI it seems that GUI ‘hangs’.
The mouse cursor keeps waiting for the program to finisch.
I am using Windows8.1
Harry

Reply
Gavin Andrews Sunday October 30th, 2016 - 12:17 PM

Just wanted to say thanks for this. The clocks had changed and I needed to update the time and didn’t have the time myself. Downloaded this, changed to DS3231 and worked first time.

Perfecto!

(Must add DCF77 to my new clock!)

Reply
angelo Sunday October 30th, 2016 - 09:26 PM

salve luca,
il mio nome è angelo. ho realizzato il tuo rtcsetup mami sono accorto che manca del passaggio in automatico dell’ora legale/solare. come posso risolverlo?

Reply
luca Wednesday November 2nd, 2016 - 11:36 AM

Ciao Angelo, purtroppo visto che la data di cambio ora varia ogni anno, l’unica possibilità è aggiungere qualche controllo manuale (pulsanti…) per cambiare l’ora manualmente.

Reply
Mic Thursday July 13th, 2017 - 12:55 PM

Hi
very nice projet thank you 🙂
I have a small clock based on a RTC PCF8563,
Can you make an adaptation of your setup program for the PCF8563 because I do not know the Visual C but I know how to program in Pascal Delphi is that the adaptation to this language is difficult?
To help me, you can quote me the methods of dialogue between the RTC and your setup program in the program Source C.

Reply
luca Thursday July 13th, 2017 - 01:04 PM

Hi Mic, you have to change the Arduino sketch, the VisualC program only communicates with Arduino, it doesn’t know which RTC is connected.

Reply
mauro Tuesday January 2nd, 2018 - 11:17 AM

Ciao,stavo utilizzando questo tuo progetto ,ma quando imposto l’orario il tempo della conferma varia da 3 a minuti e il modulo rtc è di conseguenza sempre in ritardo,nvece quando richiedo l’ora è immediato.
Utilizzo arduino uno R3 con il modulo tiny rtc v1.1 basato su ds1307.
La cartella visual studio l’ho solo scompattata,non devo installare niente penso?
Grazie

Reply
luca Tuesday January 2nd, 2018 - 03:50 PM

Ciao Mauro, no, dovrebbe essere sufficiente lanciare il programma… strano che impieghi 3min per configurare l’orario, da me è istantaneo

Reply
mauro Wednesday January 3rd, 2018 - 08:17 AM

Ciao,potrebbe un problema di sistema operativo,io utilizzo windows 8.1.Se volessi inviare la stringa tramite terminale,mi riesci a dire la stringa perchè ci provo,ma non mi funziona .Grazie

Reply
John Benedict Sunday October 28th, 2018 - 03:21 PM

Updated, simple improvements and fixed crash.

serialManager.disconnect();
connected = false;
updateUI();
}
lbRTCTime.Text = serialManager.getRTCTime();
}

public void btGet_Click(object sender, EventArgs e)
{
lbRTCTime.Text = serialManager.getRTCTime();
}

private void btSetSystem_Click(object sender, EventArgs e)
{
lbSystemTime.Text = DateTime.Now.ToString(“dd/MM/yyyy HH:mm:ss”);
dtpCustom.Value = DateTime.Now;
serialManager.setRTCTime(dtpCustom.Value);
lbRTCTime.Text = serialManager.getRTCTime();
}

Reply

Leave a Reply to JH Cancel Reply

4 + 7 =