Il termometro che sto realizzando avrà dei led RGB sotto ogni nixie in modo da poterle illuminare di diversi colori.
Ho scelto di utilizzare dei moduli già pronti, che includono sia il led RGB, sia i componenti a corredo:
I led utilizzati contengono al loro interno il chip di controllo WS2812 (datasheet) che offre 16M di colori, 256 livelli di luminosità e una frequenza di refresh minima di 400Hz.
E’ possibile controllare i driver WS2812 tramite un semplice protocollo seriale: i vari led sono collegati in cascata (DOUT -> DIN) e il primo è collegato ad un PIN digitale di Arduino tramite il quale vengono inviati i comandi.
Adafruit ha reso disponibile una comoda libreria (NeoPixel) installabile direttamente dal Library Manager:
Vediamo il suo utilizzo.
Per prima cosa, è necessario definire un oggetto di tipo Adafruit_NeoPixel passando alcuni parametri:
#define PIXEL_PIN 3 #define PIXEL_COUNT 10 Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800); |
Il primo identifica il PIN di Arduino a cui sono collegati i led in cascata e il secondo il numero di led.
Il terzo parametro configura alcuni aspetti della libreria e dipende dal driver che state utilizzando. Sono definiti due aspetti:
[checklist]
- la sequenza con cui vengono inviati i colori primari (NEO_GRB o NEO_RGB o NEO_RGBW)
- la frequenza di invio dei dati (NEO_KHZ400 o NEO_KHZ800)
[checklist]
All’interno del setup() è indispensabile inizializzare la libreria:
strip.begin(); |
E’ quindi possibile cambiare colore ad ogni led con il comando:
strip.setPixelColor(#led, red, green, blue); |
dove il primo parametro identifica il numero del led (0 indica il led più “vicino” ad Arduino) e i rimanenti tre il valore (0…255) di ogni colore primario.
Le modifiche vanno infine inviate ai led con il comando:
strip.show(); |
Ho preparato uno sketch (Github) che invia ai led una sequenza di colori predefinita e configurata all’interno di una matrice:
uint8_t colors[8][3] = { {0,0,0}, {255,0,0}, {0,255,0}, {0,0,255}, {255,255,0}, {255,0,255}, {0,255,255}, {255,255,255}, }; |
Ad ogni pressione di un pulsante, viene inviato il colore successivo:
Nel testare lo sketch, mi sono accorto che l’uscita a 5V dell’alimentatore per nixie scelto non era in grado di alimentare anche i led. Per questo ho aggiunto al prototipo un regolatore lineare (7805) che fornisce 5V sia ad Arduino che ai led: