RTCSetup

luca 27/11/2013 10

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

10 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?

Leave A Response »