RTCSetup

luca 27/11/2013 13

A tutti sarà capitato di dover configurare un chip RTC con l’orario corrente… il progetto di oggi risolve questa esigenza!

Il progetto

RTCSetup è formato da due elementi:

  • una GUI, scritta in C# e in esecuzione sul PC
  • uno sketch in esecuzione su Arduino, il quale è collegato all’RTC

GUI e sketch comunicano via seriale tramite un semplice protocollo. I sogenti di entrambi gli elementi sono disponibili nel mio repository su Github.

Arduino e RTC

Ho scelto di utilizzare la libreria RTClib di Adafruit per interfacciarmi ai chip RTC DS1307, sicuramente i più diffusi in ambito hobbistico. Il collegamento tra Arduino e l’integrato avviene via bus I2C:

Nell’immagine viene mostrato il collegamento utilizzando i “nuovi” PIN per I2C di Arduino Uno; è naturalmente possibile utilizzare anche i PIN A4 e A5.

Per una spiegazione dettagliata del collegamento e del funzionamento della libreria, vi rimando al tutorial ufficiale.

Lo sketch Arduino riceve i comandi dal PC via seriale, li esegue e restituisce una risposta.

Protocollo

Come detto, la comunicazione tra la GUI e Arduino avviene tramite un semplice protocollo composto da 4 comandi:

Comando: ##

Il primo comando inviato dopo la connessione, serve al PC per verificare che ci sia collegato un dispositivo “compatibile”. Arduino deve rispondere con !!

Comando: ?V

Comando per ottenere la versione dello sketch in esecuzione. Arduino risponde con la stringa definita come costante iniziale:

#define VERSION     "1.0"

Comando: ?T

Comando per ottenere l’orario attuale letto dall’RTC. Arduino risponde con una stringa nel formato dd/MM/yyyy hh:mm:ss.

Comando: !TddMMyyyyhhmmss

Comando per impostare l’orario dell’RTC. Arduino risponde con OK.

GUI

La GUI, sviluppata in C#, dialoga con Arduino utilizzando il protocollo descritto sopra e ha tre funzionalità:

  • imposta data/ora corrente
  • imposta data/ora scelte dell’utente
  • ottiene e visualizza data/ora attuali dell’RTC

Per prima cosa è necessario selezionare la porta seriale alla quale è connesso Arduino e premere CONNECT. Se la connessione ha esito positivo (comandi ## e ?V) nella barra di stato verrà visualizzata la versione dello sketch.

Il primo display è sempre allineato all’orario corrente del PC. Cliccando sul pulsante a destra (freccia rossa) è possibile configurare l’RTC con tale orario:

Utilizzando invece il pulsante con la freccia verde, è possibile ottenere l’orario corrente dall’RTC:

Infine è possibile, tramite il controllo date-time picker centrale, selezionare data/ora a piacere e inviare tale orario all’RTC:

Note tecniche

Ho utilizzato il metodo descritto in questo mio tutorial per utilizzare un font custom e includerlo nell’applicazione.

Ho misurato il tempo impiegato (150ms) dallo sketch Arduino per impostare l’orario una volta inviato il comando dalla GUI: per questo il codice C# invia il comando !T passando l’orario attuale + 1 secondo quando i millisecondi attuali sono 850.

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

13 Comments »

  1. Devin 30/11/2013 at 04:01 - Reply

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

  2. Antonio 18/02/2014 at 01:02 - Reply

    Where I can downloas RTCsetup GUI?
    Thanks

  3. CS 21/03/2014 at 16:19 - Reply

    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.

    • luca 22/03/2014 at 15:01 - Reply

      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?

  4. CS 22/03/2014 at 16:22 - Reply

    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 :-)

  5. CS 22/03/2014 at 16:29 - Reply

    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?

  6. CS 22/03/2014 at 16:56 - Reply

    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 ?

  7. JH 23/09/2014 at 17:40 - Reply

    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?

    • luca 29/09/2014 at 07:46 - Reply

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

  8. Duncan 04/01/2015 at 12:59 - Reply

    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…

    • luca 08/01/2015 at 09:43 - Reply

      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.

      • Duncan 12/01/2015 at 17:00 - Reply

        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…

Leave A Response »