Arduino – Uso di LED RGB – approfondimento

Scrivo questa lezione come approfondimento della guida realizzata tempo fa: Arduino – lezione 09: uso di LED RGB in cui mostravo come funzionano e come si gestiscono i LED RGB con Arduino. Negli esercizi proposti utilizzavo un LED ad ANODO comune. In questa nuova lezione utilizzerò un diodo a CATODO comune e mostrerò tre esempi, nel primo ripropongo in una modalità diversa l’esercizio della prima lezione in cui faccio alcuni approfondimenti sull’uso della direttiva #define, mentre nel secondo e terzo esercizio viene mostrato come impostare il colore emesso dal LED RGB mediante input da tastiera su Serial Monitor richiamando con questi esempi l’uso del qualificatore const per una variabile e l’utilizzo della funzione parseInt(). Come sempre nei commenti, all’interno del codice, trovate la spiegazione del funzionamento di ogni parte dello sketch.

Esempio 01

Variazione colore continuo di un LED RGB secondo lo schema:

ROSSO > VERDE, VERDE > BLU, BLU > ROSSO

Scema di collegamento

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 01
    Variazione colore continuo
    di un LED RGB secondo lo schema:

    ROSSO > VERDE, VERDE > BLU, BLU > ROSSO

*/

/* Utilizzo della direttiva #define per definire una costante
   La direttiva viene utilizzata per definire una MACRO ovvero
   un simbolo.

   La sintassi per la definizione di una macro è:
   #define nome-MACRO  valore_MACRO

   Per convenzione il nome della macro viene scritta in maiuscolo.

   Il preprocessore legge la definizione di ogni MACRO e ogni volta che
   ne incontra il nome all'interno del programma (file sorgente) sostituisce
   al simbolo il valore corrispondente, senza che venga effettuata la verifica
   della correttezza sintattica dell'espressione risultante.
*/

#define VERDE 9
#define BLU 10
#define ROSSO 11

// tempo di dissolvenza tra i colori
#define tempoRitardo 10

void setup()
{
  // impostazione ad OUTPUT dei pin
  pinMode(ROSSO, OUTPUT);
  pinMode(VERDE, OUTPUT);
  pinMode(BLU, OUTPUT);

  // all'avvio viene emesso il colorore ROSSO
  digitalWrite(BLU, LOW);
  digitalWrite(VERDE, LOW);
  digitalWrite(ROSSO, HIGH);
}

// definizione di variabili
int valoreRosso;
int valoreVerde;
int valoreBlu;

void loop()
{
  // Impostazioni variabili per avere partire con LED:
  // ROSSO accesso, VERDE spento, BLU spento.
  valoreRosso = 255;
  valoreVerde = 0;
  valoreBlu = 0;

  // partendo dal ROSSO si sfuma al VERDE pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreRosso -= 1;
    valoreVerde += 1;

    // L'intensità del ROSSO viene diminuita ad ogni ciclo, mentre
    // l'intensità del VERDE viene aumentata ad ogni ciclo
    analogWrite(ROSSO, valoreRosso);
    analogWrite(VERDE, valoreVerde);
    delay(tempoRitardo);
  }

  // Impostazioni variabili per avere partire con LED:
  // ROSSO spento, VERDE acceso, BLU spento.
  valoreRosso = 0;
  valoreVerde = 255;
  valoreBlu = 0;

  // partendo dal VERDE si sfuma al BLU pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreVerde -= 1;
    valoreBlu += 1;

    // L'intensità del VERDE viene diminuita ad ogni ciclo, mentre
    // l'intensità del BLU viene aumentata ad ogni ciclo
    analogWrite(VERDE, valoreVerde);
    analogWrite(BLU, valoreBlu);
    delay(tempoRitardo);
  }

  // Impostazioni variabili per avere partire con LED:
  // ROSSO spento, VERDE spento, BLU acceso.
  valoreRosso = 0;
  valoreVerde = 0;
  valoreBlu = 255;

  // partendo dal BLU si sfuma al ROSSO pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreBlu -= 1;
    valoreRosso += 1;

    // L'intensità del BLU viene diminuita ad ogni ciclo, mentre
    // l'intensità del ROSSO viene aumentata ad ogni ciclo
    analogWrite(BLU, valoreBlu);
    analogWrite(ROSSO, valoreRosso);
    delay(tempoRitardo);
  }
}

Esempio 02

Inserimento da Serial Monitor dei valori di intensità del colore. La stringa di richiesta inserimento dei valori RGB viene ripetuta una sola volta e ad ogni nuovo inserimento non viene stampato sulla serial monitor il valore inserito.

Lo schema di collegamento è il medesimo dell’esempio 01.

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 02
    Inserimento da Serial Monitor dei valori
    di intensità del colore.
    La stringa di richiesta inserimento viene ripetuta una sola volta.
    Ad ogni nuovo inserimento non viene stampato sulla serial monitor
    il valore inserito.

    L'inserimento dei tre valori potrà essere effettuato
    in una delle due modalità:
    1. separando i tre numeri con spazio
    2. separando i tre numeri con la virgola
*/

/*
   Una variabile const indica al compilatore che il valore della
   variabile non può essere modificato durante l'esecuzione del programma.
   Una variabile const viene inizializzata nel momento della dichiarazione,
   se ciò viene fatto in un momento successivo il compilatore rileverà un
   errore che segnalerà anche errore in ogni operazione che comportano la
   modifica del valore dell avariabile definita come const
*/

const byte pinRosso = 11;
const byte pinBlu = 10;
const byte pinVerde = 9;

void setup() {
  // Inizializzazione della comunicazione seriale
  Serial.begin(9600);

  // Impostazione dei pin come OUTPUT
  pinMode(pinRosso, OUTPUT);
  pinMode(pinBlu, OUTPUT);
  pinMode(pinVerde, OUTPUT);

  // Messaggio sulla serial monitor
  Serial.println("Inserisci i valori R G B (es. 125, 50, 255)");
  Serial.println("-------------------------------------------");
  delay(1000);
}

void loop() {

  // Controlla se è disponibile almeno un carattere sulla seriale
  // La Serial.available() restituisce
  // 1 se presente un cattere,
  // 0 se non è presente un carattere

  // per maggior informazioni sull'uso di parseInt() consultare il link:
  // https://wp.me/p4kwmk-4Ah

  if (Serial.available()) {
    // memorizzazione dei colori nelle variabili
    int rosso = Serial.parseInt();
    int verde = Serial.parseInt();
    int blu = Serial.parseInt();

    // impostazione del PWM
    analogWrite(pinRosso, rosso);
    analogWrite(pinVerde, verde);
    analogWrite(pinBlu, blu);
  }
}

Esempio 3

Inserimento da Serial Monitor dei valori di intensità del colore.
Il valore inserito verrà stampato sulla Serial Monitor e ad ogni invio verrà richiesto di inserire un nuovo valore.

Lo schema di collegamento è il medesimo dell’esempio 01.

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 03
    Inserimento da Serial Monitor dei valori
    di intensità del colore.
    Il valore inserito verrà stampato sulla Serial Monitor e ad ogni
    invio verrà richiesto di inserire un nuovo valore.

    L'inserimento dei tre valori potrà essere effettuato
    in una delle due modalità:
    1. separando i tre numeri con spazio
    2. separando i tre numeri con la virgola
*/

/*
   Una variabile const indica al compilatore che il valore della
   variabile non può essere modificato durante l'esecuzione del programma.
   Una variabile const viene inizializzata nel momento della dichiarazione,
   se ciò viene fatto in un momento successivo il compilatore rileverà un
   errore che segnalerà anche errore in ogni operazione che comportano la
   modifica del valore dell avariabile definita come const
*/

const byte pinRosso = 11;
const byte pinBlu = 10;
const byte pinVerde = 9;

// per stampare una sola volta il messaggio sulla Serial Monitor
bool abilitaMessaggio = 0;

void setup() {
  // Inizializzazione della comunicazione seriale
  Serial.begin(9600);

  // Impostazione dei pin come OUTPUT
  pinMode(pinRosso, OUTPUT);
  pinMode(pinBlu, OUTPUT);
  pinMode(pinVerde, OUTPUT);
}

void loop() {
  // consente di visualizzare sulla Serial Monitor
  // una sola stampa delle stringa
  if (abilitaMessaggio == 0) {
    // ritardo che evita la doppia stampa del messaggio
    delay(200);
    Serial.print("Inserisci i valori R G B (es. 125, 50, 255): ");
    abilitaMessaggio = 1;
  }

  // Controlla se è disponibile almeno un carattere sulla seriale
  // La Serial.available() restituisce
  // 1 se presente un cattere,
  // 0 se non è presente un carattere

  // per maggior informazioni sull'uso di parseInt() consultare il link:
  // https://wp.me/p4kwmk-4Ah


  if (Serial.available()) {
    // memorizzazione dei colori nelle variabili
    int rosso = Serial.parseInt();
    int verde = Serial.parseInt();
    int blu = Serial.parseInt();
    Serial.print(rosso);
    Serial.print(", ");
    Serial.print(verde);
    Serial.print(", ");
    Serial.println(blu);
    Serial.println("-------------------------------------------");

    // impostazione del PWM
    analogWrite(pinRosso, rosso);
    analogWrite(pinVerde, verde);
    analogWrite(pinBlu, blu);

    // abilita alla stampa di una nuova stringa:
    // "Inserisci il ritardo in millisecondi: "
    abilitaMessaggio = 0;
  }
}

Esercizi per i miei studenti

Esercizio 1

Utilizzare tre pulsanti che funzionino come interruttori che permettono di accendere e spegnere un solo LED alla volta:

  • pulsante 1: LED ROSSO
  • pulsante 2: LED VERDE
  • pulsante 3: LED BLU

Ogni cambiamento di stato deve essere segnalato sulla Serial Monitor.

Esercizio 2

Utilizzare due pulsanti in gredo di realizzare la seguente automazione:

  • pulsante 1: attivare/disattivare la modalità di variazione continua del colore, così come esposta nell’esempio 01
  • pulsante 2: attivare/disattivare la generazione casuale di un colore

Ogni cambiamento di stato deve essere segnalato sulla Serial Monitor.

Esercizio 3

Utilizzando la Serial Monitor come unico strumento per inviare comandi ad Arduino, realizzare un menù di selezione che permette di impostare le funzionalità dell’esercizio 01 e dell’esercizio 03.

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.