Ultima modifica il 18 Febbraio 2024 by Adriano
In precedenti articoli, sono stati descritti un anello con 16 led RGB a comando digitale e in modulo con un pulsante di navigazione tattile a 5 direzioni.
Vediamo ora un esempio di utilizzo dei due dispositivi

Indice
Descrizione dei Componenti utilizzati
Anello RGB LED
Anello a tecnologia NeoPixel con 16 diodi LED RGB tipo WS2812B che possono essere gestiti individualmente. Ognuno può produrre 256 tonalità del proprio colore, determinando un totale di 16.777.216 colori.
Il canale dati per la comunicazione è seriale di tipo One-Wire e può essere controllato con microcontrollori come Arduino, PIC, Mbed, ecc.
È possibile impostare a piacimento la frequenza di refresh, in modo da rendere impercettibili determinati giochi di luce. E’ anche possibile collegare più anelli in cascata per realizzare vari effetti.
L’alimentazione è di 5V.
Specifiche tecniche
Sigla: WCMCU-WS2812B-16 (CJMCU-WS2812B-16)
Numero di LED: 16
Colori di base: rosso, verde blu (risoluzione RGB a 24 bit)
Modello chip LED: SMD5050
Alimentazione: CC
Tipo di LED: SMD
Numero modello: chip LED WS2812b
Tensione: 4 V-7 V CC
Consumo energetico massimo (W): 0,24 W x 16 = 3,84 W
Dimensioni: ∅ esterno 68 mm , ∅ interno 54 mm , Spessore 3,1 mm.
Peso: 5,9 g
Per altre informazioni vedere l’articolo Anello con 16 led RGB a comando digitale
Pulsante di navigazione a 5 direzioni
Modulo di piccole dimensioni , circa 4×2,5 cm su sono presenti:
- un pulsante di navigazione tattile a 5 direzioni: clic su, giù, sinistro, destro e “seleziona” ottenuto premendo verso il basso;
- Due pulsanti (con serigrafia SET e RST) configurabili dall’utente;
- Pin strip a 8 poli per il collegamento;
Caratteristiche
- Nome: Modulo pulsante di navigazione a cinque direzioni
- Numero di I/O: 7
- Tensione di esercizio: 2,0 ÷ 9,0 V
- Dimensioni: 25 x 41mm
- Temperatura di esercizio: -40 ÷ +85 °C
Per altre informazioni vedere l’articolo Pulsante di navigazione a 5 direzioni
Video relativo al progetto
Materiale occorrente
Vediamo prima di tutto il materiale occorrente:
- La scheda Arduino UNO o sul clone, in questo caso, è stata utilizzata una scheda Keyestudio PLUS. Completamente compatibile con l’ambiente di sviluppo Arduino IDE. Contiene tutte le funzioni della scheda Arduino UNO R3 e alcuni miglioramenti che ne rafforzano notevolmente la funzione;
- Un modulo pulsante di navigazione a cinque direzioni;
- Un Anello con 16 led RGB tipo WS2812;
- n° 8 cavi con intestazioni Femmina/Maschio.
Scheda Keyestudio PLUS |
|
Anello con 16 led RGB tipo WS2812 |
Cavi di collegamento |
Dove trovare il materiale
Anello con 16 led RGB tipo WS2812
Il componente potrà essere acquistato su vari siti online.
Presso il sito Homotix, NeoPixel WS2812 5050 RGB 16 LED codice DLS0281216D
Altra possibilità è presso il sito Futura Elettronica, Anello con 16 LED RGB WS2812 e driver integrato codice 2846-RING16NEOPIXEL
Il led è disponibile anche su modulo singolo, vedere per esempio l’articolo WS2812B LED RGB a controllo digitale.
Modulo Pulsante di navigazione a 5 direzioni
Il modulo potrà essere trovato su vari siti online come: AMAZON, AliExpress
Schema dei collegamenti
Sotto è riportato lo schema dei collegamenti tra l’anello LED RGB e il pulsante tattile.

| No. | Pin Arduino | Pin modulo | Anello RGB |
|---|---|---|---|
| 1 | GND | COM | GND |
| 2 | D8 | UP | |
| 3 | D7 | DWN | |
| 4 | D6 | LFT | |
| 5 | D5 | RHT | |
| 6 | D4 | MID | |
| 7 | D3 | SET | |
| 8 | D2 | RST | |
| 9 | D9 | DI | |
| 10 | +5V | +5V | +5V |

Foto del montaggio per il test del modulo per comando anello RGB

Dettaglio del montaggio per il test del modulo per comando anello RGB

Dettaglio dei collegamenti sulla scheda di controllo

Vista dall’alto dei collegamenti sulla scheda di controllo
Libreria di gestione tramite Arduino
Per la gestione del led si utilizzerà la libreria NeoPixel realizzata dalla ditta Adafruit.
Per caricarla si dovrà inserire nel campo ricerca “neopixel” , quando apparirà basterà premere il tasto Installa,

La scritta “INSTALLED” segnalerà l’avvenuta installazione della libreria.
Per maggiori informazioni vedere l’articolo Anello con 16 LED RGB WS2812B
Codice del programma
Sotto è riportato il codice del programma utilizzato. All’interno sono presenti dei commenti che dovrebbero rendere abbastanza semplice comprenderne il funzionamento.
A seconda della direzione in cui è premuto il tasto si accenderanno sull’anello i LED che nei indicheranno visivamente la direzione. Prima del cambiamento del colore dei led, tutti saranno accesi di colore Blu

Se si sposta il tasto tattile verso l’alto si accenderanno 3 led di colore rosso nella parte alta

Premendo il tasto tattile si accenderanno 4 led di colore verde

Nel caso sia premuto il tasto SET si accederanno 5 led di colore magenta sul lato destro, nel caso sia premuto il tasto RST si accederanno 5 led di colore giallo sul lato sinistro.
const int buttonPin_RST = 2; // Pin pulsante RST
const int buttonPin_SET = 3; // Pin pulsante SET
const int buttonPin_MID = 4; // Pin pulsante Centrale
const int buttonPin_RHT = 5; // Pin pulsante Destra
const int buttonPin_LFT = 6; // Pin pulsante Sinistra
const int buttonPin_DWN = 7; // Pin pulsante Giù
const int buttonPin_UP = 8; // Pin pulsante Su
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
//Pin a cui è collegato l'anello di led
#define PIN 9
// Numero led dell'anello
#define NUMPIXELS 16
//Impostazione dei parametri
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
//Attiva le resistenze di PULLUP interne
pinMode(buttonPin_RST, INPUT_PULLUP);
pinMode(buttonPin_SET, INPUT_PULLUP);
pinMode(buttonPin_MID, INPUT_PULLUP);
pinMode(buttonPin_RHT, INPUT_PULLUP);
pinMode(buttonPin_LFT, INPUT_PULLUP);
pinMode(buttonPin_DWN, INPUT_PULLUP);
pinMode(buttonPin_UP, INPUT_PULLUP);
pixels.begin(); // Si inizializza la libreria NeoPixel.
pixels.setBrightness(5); //Si regola la luminosità
//Accende tutti i led di rosso
colorWipe(pixels.Color(255, 0, 0), 50); // rosso
}
void loop()
{
if (digitalRead(buttonPin_RST) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
RST();
while (digitalRead(buttonPin_RST) == LOW);
}
if (digitalRead(buttonPin_SET) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
SET();
while (digitalRead(buttonPin_SET) == LOW);
}
if (digitalRead(buttonPin_MID) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
MID();
while (digitalRead(buttonPin_MID) == LOW);
}
if (digitalRead(buttonPin_RHT) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
RHT();
while (digitalRead(buttonPin_RHT) == LOW);
}
if (digitalRead(buttonPin_LFT) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
LFT();
while (digitalRead(buttonPin_LFT) == LOW);
}
if (digitalRead(buttonPin_DWN) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
DWN();
while (digitalRead(buttonPin_DWN) == LOW);
}
if (digitalRead(buttonPin_UP) == LOW) {
delay(250);
colorWipe(pixels.Color(0, 0, 255), 50); // Blu
UP();
while (digitalRead(buttonPin_UP) == LOW);
}
}
void UP()
{
// Accende 3 led ROSSI in alto
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
pixels.setPixelColor(1, pixels.Color(255, 0, 0));
pixels.setPixelColor(2, pixels.Color(255, 0, 0));
pixels.show(); // Aggiorna colore
}
void RHT()
{
// Accende 3 led ROSSI a destra
pixels.setPixelColor(4, pixels.Color(255, 0, 0));
pixels.setPixelColor(5, pixels.Color(255, 0, 0));
pixels.setPixelColor(6, pixels.Color(255, 0, 0));
pixels.show(); // Aggiorna colore
}
void DWN()
{
// Accende 3 led ROSSI in basso
pixels.setPixelColor(8, pixels.Color(255, 0, 0));
pixels.setPixelColor(9, pixels.Color(255, 0, 0));
pixels.setPixelColor(10, pixels.Color(255, 0, 0));
pixels.show(); // Aggiorna colore
}
void LFT()
{
// Accende 3 led ROSSI a sinistra
pixels.setPixelColor(12, pixels.Color(255, 0, 0));
pixels.setPixelColor(13, pixels.Color(255, 0, 0));
pixels.setPixelColor(14, pixels.Color(255, 0, 0));
pixels.show(); // Aggiorna colore
}
void MID()
{
//Accende 4 led VERDI
pixels.setPixelColor(3, pixels.Color(0, 255, 0));
pixels.setPixelColor(7, pixels.Color(0, 255, 0));
pixels.setPixelColor(11, pixels.Color(0, 255, 0));
pixels.setPixelColor(15, pixels.Color(0, 255, 0));
pixels.show(); // Aggiorna colore
}
void RST()
{
//Accende 5 led GIALLI a sinistra
pixels.setPixelColor(2, pixels.Color(255, 255, 0));
pixels.setPixelColor(3, pixels.Color(255, 255, 0));
pixels.setPixelColor(4, pixels.Color(255, 255, 0));
pixels.setPixelColor(5, pixels.Color(255, 255, 0));
pixels.setPixelColor(6, pixels.Color(255, 255, 0));
pixels.show(); // Aggiorna colore
}
void SET()
{
//Accende 5 led MAGENTA a destra
pixels.setPixelColor(10, pixels.Color(255, 0, 255));
pixels.setPixelColor(11, pixels.Color(255, 0, 255));
pixels.setPixelColor(12, pixels.Color(255, 0, 255));
pixels.setPixelColor(13, pixels.Color(255, 0, 255));
pixels.setPixelColor(14, pixels.Color(255, 0, 255));
pixels.show(); // Aggiorna colore
}
// Riempie uno dopo l'altro i led con un colore
void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < pixels.numPixels(); i++) {
pixels.setPixelColor(i, c);
pixels.show();
delay(wait);
}
}






Anello con 16 led RGB tipo WS2812


