Accensione anello LED RGB con pulsante tattile

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

anello LED RGB pulsante tattile

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.

anello LED RGB pulsante tattile

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

Pulsante di navigazione 5 direzioni

Video relativo al progetto

Materiale occorrente

Vediamo prima di tutto il materiale occorrente:

Scheda Keyestudio PLUS

Pulsante di navigazione a 5 direzioni

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 HomotixNeoPixel WS2812 5050 RGB 16 LED codice DLS0281216D

Altra possibilità è presso il sito Futura ElettronicaAnello 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: AMAZONAliExpress

Schema dei collegamenti

Sotto è riportato lo schema dei collegamenti tra l’anello LED RGB e il pulsante tattile.

anello LED RGB pulsante tattile

No.Pin ArduinoPin moduloAnello RGB
1GNDCOMGND
2D8UP
3D7DWN
4D6LFT
5D5RHT
6D4MID
7D3SET
8D2RST
9D9DI
10 +5V+5V+5V

anello LED RGB pulsante tattile

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

anello LED RGB pulsante tattile

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

anello LED RGB pulsante tattile

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,

RGB WS2812B ESP32 Devkit

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);
  }
}