NeoClock Arduino

Il NeoClock è un progetto semplice e scenografico che puoi appendere in laboratorio o in salotto.

neoClock arduino cover

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:

neoClock arduino first neopixel parts assembly

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:

neoClock arduino assembled back

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:

neoClock arduino schema

neoClock arduino schema

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:

neoClock arduino schema details

neoClock arduino schema dettaglio

Ecco anche un dettaglio del montaggio eseguito per il test del neoClock aruino:

neoClock arduino detailsNon resta che passare alla visione d’insieme ed al codice:

neoClock arduinoCodice 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:

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:

neoClock arduino in funzione qudrante bianco

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.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/neoclock-arduino.html

1 commento

    • Tiziano il 28 Agosto 2024 alle 12:24
    • Rispondi

    Grazie “maestro”!
    è un progetto che avevo già in cantiere…
    Sarà il prossimo orologio che metterò in casa

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.