Galleria fotografica della realizzazione di un orologio a tubi Nixie, funzionante con Arduino Nano e RTC (link articolo)
È stata realizzata una scheda elettronica su cui montare tutti i componenti necessari e una scatola di legno per nascondere i circuiti:
Si noti l’Arduino Nano come cuore del circuito, e le connessioni verso l’esterno per RTC e alimentazioni a 5V e 170V.
Gli integrati a sinistra sono drivers appositamente realizzati per i tubi Nixie, ricevono un input digitale a 4 bit 5 Volt, alimentazione sempre a 5V e mettono il pin selezionato a massa (motivo per cui tutto il circuito ha masse comuni tra alta e bassa tensione).
Mentre i vari catodi dei tubi vengono tenuti scollegati oppure messi a massa a seconda della cifra da accendere, la cassa dell’anodo o potenziale comune è collegato a 170V tramite 10kΩ di resistenza di protezione.
Creazione della scheda
Il disegno dello schema elettrico e della scheda stampata sono stati realizzati su EasyEDA gratuitamente. Successivamente è stata acquistata per riceverla a casa.
Fase di montaggio dei componenti. Gli integrati sono drivers con cui i pin digitali di Arduino pilotano i catodi dei tubi. Questo non può essere fatto direttamente perché mentre il microcontrollore lavora a 5V, i display si alimentano a 170V.
Scheda inserita nella sua scatola insieme ai due alimentatori switching step-up e step-down, che forniscono le due alimentazioni a 5V e 170V partendo dal jack che fornisce 24V.
In questo articolo vedremo un componente elettronico che può essere usato insieme a un microcontrollore per misurare il tempo, un real time clock (RTC).
Questo vi permetterà di costruire orologi accurati in grado di restare a punto anche mentre il vostro progetto è spento.
In particolare ora vedremo come programmare e usare il DS3231 con una scheda Arduino, usando la libreria di Adafruit “RTClib 1.10.0”.
Se siete amanti dei delay(1000); levatevi di torno.
Il componente si presenta su una scheda di supporto con altri componenti necessari come regolatori di alimentazione e una batteria montata sul lato inferiore, questa entra in funzione quando il resto del circuito si spegne e l’alimentazione a 5V viene a mancare, dato che nessun sistema può contare il tempo senza una fonte di energia.
Nella figura si notano anche i due contatti per comunicazione seriale I2C, che andranno direttamente all’Arduino, e anche due uscite da 32kHz e 1Hz, utilizzabili ma non necessarie per costruire un orologio.
Programmazione:
DateTime viene usata sia come funzione sia come variabile:
– Usata come variabile, è una struttura in grado di contenere una data;
– Usata come funzione, calcola una data prendendo in input dati di tempo, inseriti dal più significativo al più preciso, cioè in ordine di anni, mesi, giorni, ore, minuti e secondi, per poi salvarli su una struttura DateTime.
Dove X è una variabile di tipo DateTime che indica l’istante un secondo prima di capodanno 2021.
In alternativa si possono usare due funzioni dell’applicazione di Arduino, ossia __DATE__ per la data e __TIME__ per l’orario, questi due ” #define speciali ” al momento della compilazione dello sketch vengono sostituiti con data e ora del computer in uso.
Esempio:
DateTime Y = ( DateTime( F(__DATE__) , F(__TIME__) ) );
Dove Y è una variabile di tipo DateTime che indica l’istante in cui è stata lanciata la compilazione del codice.
Suggerisco di eseguire la sincronizzazione dell’orologio del computer prima di lanciare la compilazione.
Un’altra funzione è TimeSpan e serve per “spostarsi” avanti o indietro nel tempo a partire da un punto di riferimento, definito da un’altra variabile DateTime. Questa funzione prende in ingresso 4 valori, cioè giorni, ore, minuti e secondi, (non mesi o anni dato che hanno durata irregolare/indefinita).
Esempio:
DateTime Z = ( X + TimeSpan( 0 , -1 , 0 , 10 ) );
Dove Z è una variabile di tipo DateTime che indica l’istante 59 minuti e 51 secondi prima di capodanno 2021, cioè 59 minuti e 50 secondi prima di X.
DateTime K = ( X + TimeSpan( 0 , -1 , 60 , 0 ) );
Modo inutilmente complicato per creare una copia di X.
Messa a punto iniziale tramite Arduino:
Per mettere in funzione la scheda bisogna prima scrivere un codice di messa a punto e realizzare un semplice circuito con 4 fili tra TRC e Arduino (5V, gnd, SCL, SDA), collegarli al computer tramite USB, inserire una batteria nel retro dell’RTC e assicurarsi che l’orario del computer sia a punto.
Per sapere quali pin dell’Arduino corrispondono a SCL e SDA consultare il datasheet (variano tra Uno, Mega, Nano e Micro).
Utilizzo:
Ovviamente il codice dipenderà dal vostro progetto, ma qui sotto potete trovare un esempio di chiamata per la lettura del dato dall’RTC.
Come potete osservare, il componente dispone anche di un termometro. Questa funzione è presente per via della grossa dipendenza della frequenza di oscillazione del quarzo dalla sua temperatura. Il DS3231 è provvisto di un meccanismo di bilanciamento automatico, che lo rende un orologio più preciso di molti altri digitali moderni. È molto più preciso del mio portatile.
L’RTC restituisce i mesi e i giorni della settimana come numeri interi. Per sostituirli con le parole italiane corrispondenti, invece di fare maree di if, si può fare in modo che il valore ricevuto in seriale sia indice di un vettore che contiene le parole desiderate.
Nota:
Il circuito non gradisce letture troppo frequenti, consiglio un minimo di qualche decimo di secondo tra una lettura e l’altra.
Fusi orari:
Dopo aver detto tutto questo bisogna far presente che il DS3231 non calcola automaticamente i passaggi tra orari legale e solare, quindi per evitare di dover mettere a punto il vostro progetto due volte all’anno potete adottare varie possibili soluzioni, come ad esempio lasciare l’RTC a punto con l’orario solare tutto l’anno, ma riportando un’ora in più in uscita se il microcontrollore calcola di essere in estate.
Cambio di orario in Italia:
Alle 2 di notte dell’ultima Domenica di Marzo, si spostano gli orologi un’ora avanti e si ha quindi un giorno di 23 ore.
Per tutta l’estate è in vigore l’orario LEGALE. (Coordinated Universal Time + 2 ore)
Alle 2 di notte dell’ultima Domenica di Ottobre, si spostano gli orologi un’ora indietro e si ha un giorno di 25 ore.
Per tutto l’inverno è in vigore l’orario SOLARE. (Coordinated Universal Time + 1 ora)
Se ipotizziamo che il nostro RTC resti impostato sull’orario solare tutto l’anno, allora Arduino, a ogni lettura, prima di mandarla in output dovrà calcolare se aggiungere un’ora extra oppure no.
Per fare ciò occorrerà una serie di if-else in cascata per restringere il campo attorno alle date di cambio orario, fino al livello di precisione che si vuole ottenere.
Altro:
-Pin “32K”, attivo di default (onda quadra 32000 Hz):
rtc.disable32K(); Per disattivare il pin
rtc.enable32K(); Per riattivare il pin
Serial.println( rtc.isEnabled32K() ); Restituisce 0 se spento o 1 se acceso
-Pin “SQW”, disattivo di default (onda quadra 1 Hz):
rtc.writeSqwPinMode( DS3231_OFF ); Per disattivare il pin
rtc.writeSqwPinMode( DS3231_SquareWave1Hz ); Per attivare il pin