NeoPixel Watch RTC

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.

Neopixel Ring Watch DS3231 on

Se ti sei perso i passaggi precedenti ti consiglio la lettura dei seguenti articoli:

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:

Neopixel Ring Watch saldatura 0

mentre non rappresentano un problema i collegamenti tra gli anelli, arduino ed il DS3231:

Neopixel Ring Watch DS3231 connessioni

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ì:

Neopixel Ring Watch DS3231 elettronica

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.

Neopixel Ring Watch DS3231 elettronica alto

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/neopixel-watch-rtc.html

2 comments

    • Antonio on 10 ottobre 2015 at 16:06
    • Reply

    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.

    1. Grazie Antonio,
      leggerò volentieri.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.