«

»

Set 14

Stampa Articolo

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

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/neopixel-watch-rtc.html

2 comments

  1. Antonio

    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. Mauro Alfieri

      Grazie Antonio,
      leggerò volentieri.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>