Il NeoClock è un progetto semplice e scenografico che puoi appendere in laboratorio o in salotto.
In questo primo articolo vedremo come realizzarlo e come funziona ed in un prossimo articolo analizzeremo il codice per farlo funzionare con un Arduino Uno R3.
L’idea del progetto è nata in occasione della preparazione del webinar Arduino svolto a maggio in collaborazione con Futaracademy e che riproporremo nei prossimi mesi.
Il webinar tratta di neopixel, o led programmabili, e , come progetto di chiusura, per i partecipanti, ho proposto l’idea del NeoClock Arduino.
NeoClock Arduino – Materiale per la realizzazione
Il materiale per la realizzazione del progetto è disponibile sul sito futurashop, ti tiporto l’elenco sotto:
in questa prima versione del progetto vedi l’ArduinoUno R3 ma puoi utilizare anche la nuova Arduino Uno R4 Minima o la Arduino Uno R4 WiFi con cui magari faremo un update prossimamente.
Costruzione del NeoClock Arduino
Inizia con l’assemblaggio del NeoClock Arduino partendo dai due anelli di neopixel, quello da 60 e quello da 24.
L’anello da 60 neopixel è composto da 4 quarti di cerchio:
che dovrai assemblare unendoli a due a due fino a formate una circonferenza da 60 led, nell’esempio vedi come due quarti si montino facilmente:
i pin DIN e DOUT sono messi in modo speculare per agevolare la realizzazione della forma circolare.
Una volta assemblato il cerchio esetrno ( 60 led ) puoi posizionare il cerchio da 24 led al suo interno, cercando di mantenere la concentricità.
Ed eseguire i collegamenti tra i due come in figura:
Avrai notato che:
- la prima connessione ( quello dello 0 o del 60 ) posta in alto a destra mostra i pin 5V e GND connessi tra i due quarti di cerchio ed ai fili rosso ( 5v ) e nero ( Gnd );
- il pin DIN è connesso al cavo giallo;
- il pin DOUT raggiunge il DIN del cerchio a 24 led mediante un collegamento, nel mio esempio ho voluto utilizzare l’ottone per un fattore stetico, ma puoi utilizzare un collegamento con filo in rame se preferisci;
- allo stesso modo i pin 5V e Gnd del cerchio da 60 led sono connessi ai rispettivi pin sul cerchio da 24 led mediante due connessioni in ottone;
In questo modo sia i collegamenti reativi all’alimentazione sia quelli relativi al segnale sono correttamente definiti.
Inoltre: poiché il DOUT del cerchio da 60 led è connesso al DIN di quello a 24 led avrai già dedotto che il primo led del secondo anello ( 24 led ) sarà il numero 60:
60 + 1 – 1 ( si inizia il conteggio dei led da 0 ) = 60;
mentre l’ultimo led del cerchio da 24 sarà l’83esimo:
60 + 24 -1 = 83;
questa informazione ti servirà in fase di programmazione.
Video dell’assemblaggio
Puoi vedere il video completo in cui ho assemblato e testato il progetto NeoClock Arduino sul mio canale youtube:
Connessioni tra arduino e neoClock
Connettere l’anello ed il modulo RTC ad arduino è alquanto semplice:
infatti entrambi gli anelli di led sono connessi al solo pin 2, oltre che al 5v e Gnd, e l’Rtc presenta 4 collegamenti:
Modulo RTC | Arduino |
5v | +5v |
Gnd | Gnd |
SDA | A4 |
SCL | A5 |
Di seguito un dettaglio della connessione nello schema sopra:
Ecco anche un dettaglio del montaggio eseguito per il test del neoClock aruino:
Non resta che passare alla visione d’insieme ed al codice:
Codice del NeoClock Arduino
Il codice del neoClock Arduino è semplice, l’unico calcolo che devi eseguire è quello che hai visto sopra relativo al numero di led:
Notice
primo led del secondo anello ( 24 led ) sarà il numero 60:
60 + 1 – 1 ( si inizia il conteggio dei led da 0 ) = 60;
mentre l’ultimo led del cerchio da 24 sarà l’83esimo:
60 + 24 -1 = 83;
ecco il codice che puoi utilizzare per iniziare:
#include "RTClib.h" #include <FastLED.h> /********** RTC parameters ********************************/ RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char buffer[200] =""; /********** FastLed parameters ****************************/ #define LED_PIN 2 #define NUM_LEDS 84 #define BRIGHTNESS 255 #define LED_TYPE WS2811 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS]; /********** Clock Parameter *******************************/ #define hourColor CRGB::OrangeRed #define minuteColor CRGB::DarkBlue #define secondColor CRGB::DarkGreen /**********************************************************/ void setup() { Serial.begin(115200); if (! rtc.begin()) { Serial.println("Couldn't find RTC"); Serial.flush(); abort(); } //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); delay( 1000 ); // power-up safety delay FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); FastLED.setBrightness( BRIGHTNESS ); for( int i = 0; i < NUM_LEDS; ++i) { leds[i] = hourColor; FastLED.show(); delay(20); } for( int i = 0; i < NUM_LEDS; ++i) { leds[i] = minuteColor; FastLED.show(); delay(20); } for( int i = 0; i < NUM_LEDS; ++i) { leds[i] = secondColor; FastLED.show(); delay(20); } delay(500); for( int i = 0; i < NUM_LEDS; ++i) { leds[i] = CRGB::CRGB::Black; FastLED.show(); delay(20);} delay(1000); leds[0] = hourColor; FastLED.show(); leds[15] = hourColor; FastLED.show(); leds[30] = hourColor; FastLED.show(); leds[45] = hourColor; FastLED.show(); leds[60] = minuteColor; FastLED.show(); leds[72] = minuteColor; FastLED.show(); delay(5000); } void loop() { DateTime now = rtc.now(); Serial.print("Current time: "); sprintf(buffer, "%02d/%02d/%04d (", now.day(), now.month(), now.year()); Serial.print(buffer); sprintf(buffer, "%s", daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(buffer); sprintf(buffer, ") %02d:%02d:%02d", now.hour(), now.minute(), now.second()); Serial.print(buffer); for( int i = 0; i < NUM_LEDS; ++i) { leds[i] = CRGB::CRGB::Black; } leds[now.second()] = secondColor; FastLED.show(); leds[now.minute()] = minuteColor; FastLED.show(); leds[(now.hour()+60)] = hourColor; FastLED.show(); //leds[((now.hour()/2)+60)] = hourColor; FastLED.show(); Serial.println(); delay(500); }
in cui le prime due linee includono le due librerie che ti servono per controllare l’Rtc ed i neopixel leds;
le linee 04-08: definiscono l’istanza rtc con cui interrogherai il modulo RTC e l’array con i nomi delle settimane;
le linee 10-17: definiscono il pin a cui sono connessi i leds, il numero di led 84: da 0 a 83 e le caratteristiche dei led da controllare;
alla linee 21-23: definisci i colori da utilizzare per indicare le ore, i minuti ed i secondi sul tuo orologio;
Setup()
la linea 27: definisce la funzione setup, il cui scopo sarà:
- inizializzare la comunicazione con l’Rtc;
- inizializzare la comunicazione con i due anello neopixel;
- testare il funzionamento corretto dei led;
Iniziamo dalle prime linee 30-34: inizializza l’RTC in modo da ottenere l’orario corrente corretto;
le linee 38-39: inizializza la comunicazione con i led neopixel e impostano la luminosità di base da mantenere per i led;
linea 41: definisci un primo ciclo for da 0 al numero massimo di led -1 in cui accende un solo led per volta del colore definito per le ore con un delay di 20 millisecondi per led;
linee 42-43: fanno la medesima cosa con i colori dei minuti e dei secondi;
linea 45: con un ciclo di colore nero spegne tutti i led del neoClock arduino;
linee 47-52: accende solo alcuni led di controllo: 0,15,30,45,60,72;
Loop()
Alla linea 58: recuperi l’orario corrente;
linee 60-66: scrive sul monitor seriale la data e l’ora corrente recuperata dall’Rtc;
linea 68: con un ciclo di for di colore Black spegne tutti i led;
linee 69: imposta il colore definito per i secondi al led del secondo corrente;
linea 70: imposta il colore definito per i minuti al led del minuto corrente;
infine la linea 71: imposta il colore delle ore corrispondente all’orario corrente al led 60+ora corrente;
la linea 72: ti permette di segnare l’orario sulle 12 ore invece che sulle 24;
puoi decommentare la line 72 e commentare la linea 71 se preferisci vedere la rappresentazione oraria su 12 ore invece delle 24 ore;
L’orologio disegnato
Prima di concludere la descrizione del neoPixel Clock ti lascio con una immagine che ho stampato:
per vedere meglio l’orario corrente in quanto potrebbe non essere semplice, almeno all’inizio, comprendere l’orario.
Puoi scaricare il file da stampare qui:
con cui avrai a disposizione un foglio da applicare sul tuo orologio per avere sempre chiaro che ore siano.
1 commento
Grazie “maestro”!
è un progetto che avevo già in cantiere…
Sarà il prossimo orologio che metterò in casa