E’ finalmente giunto il momento di realizzare il tuo NeoPixel Watch RTC con il DS3231 ed i due anelli neopixel da 60 e 12 led.
Se ti sei perso i passaggi precedenti ti consiglio la lettura dei seguenti articoli:
- Neopixel Ring Watch
- Neopixel Ring Watch – seconda parte
- Neopixel Ring Watch – terza parte
- RTC DS3231
Tutti gli articoli ti portano a costruire il tuo NeoPixel Watch passo passo fino al progetto descritto in questo articolo e che farai evolvere nei prossimi articoli.
Come quasi tutti i miei progetti, anche il Neopixel watch RTC, sarà oggetto di future evoluzioni a cui sto già lavorando in questi giorni.
Collegamenti del Neopixel watch RTC con DS3231
I collegamenti non sono complessi ma ti richiedono un po di attenzione per la saldatura dei 4/4 di anello da 60 neopixel e dell’anello da 12 neopixel:
mentre non rappresentano un problema i collegamenti tra gli anelli, arduino ed il DS3231:
come vedi l’RTC DS3231 necessita dei soliti 2 cavi in I2C su SDA ed SCL mentre i neopixel sono collegati al pin 6 di arduino.
Nota la combinazione dei pin di alimentazione che puoi collegare tutte ad arduino in quanto i pin Gnd ce ne sono 2 disponibili ed i die moduli sono alimentati con tensioni differenti:
- il modulo RTC è alimentato a 3,3v
- i neopixel necessitano di 5v
Il progetto al montaggio provvisorio si presenta così:
il foglio mi permette di visualizzare l’orario senza essere abbagliato, provvederai in seguito a realizzare una cover per l’orologio che ti permetta di vedere l’ora senza perdere l’uso della vista 🙂
Lo sketch del Neopixel watch rtc
Lo sketch che analizzi oggi è simile per molte linee a quello già visto in occasione dell’orologio simulato con i neopixel ed a quelle utilizzate per il test del DS3231, analizzerai l’unione tra due sketch e la visualizzazione dell’orario:
#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC #include <Time.h> //http://www.arduino.cc/playground/Code/Time #include <Wire.h> #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 6 #define NUMPIXELS 72 #define DEBUG Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 1000; int colH[] = {150,0,0}; int colM[] = {0,150,0}; int colS[] = {0,0,150}; byte H = 0; byte M = 0; byte S = 0; void setup() { pixels.begin(); // This initializes the NeoPixel library. Serial.begin(9600); for ( int i=0; i<NUMPIXELS; i++ ) { pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); delay( 5 ); } setSyncProvider(RTC.get); // the function to get the time from the RTC if(timeStatus() != timeSet) Serial.println("Unable to sync with the RTC"); else Serial.println("RTC has set the system time"); } void loop() { H = hour(); M = minute(); S = second(); #ifdef DEBUG digitalClockDisplay(); #endif pixels.setPixelColor((S-1), pixels.Color(0,0,0)); pixels.setPixelColor((M-1), pixels.Color(0,0,0)); pixels.setPixelColor((60+H-1), pixels.Color(0,0,0)); pixels.setPixelColor(S, pixels.Color(colS[0],colS[1],colS[2])); pixels.setPixelColor(M, pixels.Color(colM[0],colM[1],colM[2])); if ( S == M ) { col0 = colS[0]+colM[0]; col1 = colS[1]+colM[1]; col2 = colS[2]+colM[2]; pixels.setPixelColor(S, pixels.Color(col0,col1,col2)); } if ( S == 0 || M == 0 ) { pixels.setPixelColor(59, pixels.Color(0,0,0)); // pixel 59 off } pixels.setPixelColor((60+H), pixels.Color(colH[0],colH[1],colH[2])); pixels.show(); delay( delayval ); } void digitalClockDisplay(void) { // digital clock display of the time Serial.print(H); printDigits(M); printDigits(S); Serial.print(' '); Serial.print(day()); Serial.print(' '); Serial.print(month()); Serial.print(' '); Serial.print(year()); Serial.println(); } void printDigits(int digits) { // utility function for digital clock display: // prints preceding colon and leading 0 Serial.print(':'); if(digits < 10) Serial.print('0'); Serial.print(digits); }
Avrai già riconosciuto i singoli blocchi di codice, alle linee 01-04: includi le librerie necessarie al funzionamento dell’Neopixel watch rtc;
linee 06-08: includi la libreria avr/power.h se definita la costante __AVR__;
linea 10: imposta il pin a cui hai collegato i neopixel;
linea 11: imposta il numero di led di cui è composto il neopixel watch rtc;
linea 12: definisci una costante DEBUG che ti servirà per attivare o disattivare il monitor seriale nello sketch;
linea 14: inizializza l’oggetto pixels come istanza della libreria Adafruit Neopixel;
linee 17-24: definisci alcune variabili necessarie ad impostare il colore dei led nelle singole fasi di funzionamento e le variabili in cui memorizzerai i valori dei secondi, minuti e ore;
linea 27: attiva l’uso della libreria Neopixel;
linee 29-33: per ciscun neopixel di cui è composto il tuo neopixel watch rtc imposta il colore a 0,0,0 ossia spento, esegui il comando con il metodo show() ed attendi 5 millisecondi prima di passare al neopixel successivo;
linea 34: recupera dal DS3231 l’orario corrente impostato;
linee 35-38: verifica la corretta eseguzione dell’operazione precedente, in caso di corretta sincronizzazione con l’RTC scrivi sul monitor seriale “RTC has set the system time”;
linee 42-44: assegna a ciascuna variabile H,M ed S il corrispondente valore recuperato dall’RTC;
linee 46-48: se la costante DEBUG è definita invoca la funzione digitalClockDisplay() per visualizzare sul monitor seriale i valori recuperati dall’RTC;
linee 50-52: conosci già queste linee dai precedenti articoli e sono quelle che si preoccupano di spegnere i led prima dell’accensione dei led correnti;
linee 54-55: accendi i led corrispondenti ai secondi e minuti correnti;
linee 57-62: quando i minuti ed i secondi coincidono, ad esempio alle 08:05:05 ottieni che per un secondo il led dei secondi non si vede in quanto assume il colore dei minuti che è l’ultimo in ordine di impostazione alle linee 54-55. Per evitare questa situazione ho deciso di sommare i valori relativi ai colori delle singole componenti per R,G e B sia dei minuti sia dei secondi e visualizzare, in questo caso, il colore risultante.
linee 63-65: quando uno dei due valori per S o per M raggiunge il valore 0 la formula, presente alle linee 50 e 51, restituisce il valore -1, tuttavia il led -1 è inesistente e lascia accesso il led 59. Per ovviare a questo errore logico ho deciso di aggiungere un controllo che spegne il led 59 quando arrivi al secondo 0 od al minuto 0;
linea 67: analogamente a come avviene alle linee 54-55 questa linea si preoccupa di accendere il led relativo all’ora attuale riportata dal Neopixel Watch RTC;
linea 68: invia tutto ai led neopixel mediante il metodo show();
linea 70: attendi il tempo impostato alla linea 17 prima di procedere ad un nuovo ciclo di loop();
linee 73-86: la funzione digitalClockDisplay() non è cambiata rispetto a quella già vista per il test dell’RTC DS3231;
linee 88-96: medesimo discorso per la funzione printDigits() che resta invariata.
2 commenti
Molto, molto interessante…come del resto tutti i progetti da te suggeriti!
Non so se già la conosci, ma nel caso prova a dare un’occhiata alla libreria FastLed (http://fastled.io) che tra l’altro ha una comunità molto attiva.
Dai test condotti qui (http://www.tweaking4all.com/hardware/arduino/arduino-ws2812-led/) FastLed sembra più performante di NeoPixel; io l’ho usata in alcuni progetti…in effetti è molto efficace.
Autore
Grazie Antonio,
leggerò volentieri.