Arduino: Controllo della luminosità (Dimmer) Led via seriale

Controllo della luminosità (Dimmer) Led con Arduino Genuino via seriale

Possiamo pilotare il valore del PWM di Arduino, e quindi la luminosità del led, in diversi modi.
Un esempio, perlopiù accademico che realmente utile, è quello di scrivere il valore direttamente da pc, via porta seriale inviando dei comandi specifici che Arduin dovrà interpretare come “Accendi”, “Spegni”, “Aumenta luminosità” o “Diminuisci luminosità”.

Iniziamo con la partlist e lo schema elettrico:

Partlist

  • Arduino UNO
  • Breadboard
  • Filo rigido (va bene del doppino telefonico o un vecchio cavo di rete di recupero, purchè sia rigido)
  • 1 resistore da 220Ohm, codice colore Rosso, Rosso, Marrone (Cos’è un resistore)
  • 1 LED rosso

Schema elettrico

Lo schema è molto semplice, accostiamo arduino UNO non alimentato alla breadboard e posizioniamo i fili, il led e la resistenza come in figura.

arduino genuino led dimmer serialeAttenzione: i LED sono dei diodi luminosi e i diodi hanno una polarità, ciò significa che a differenza di una comune/vecchia lampadina a incandescenza, esiste un polo positivo e un polo negativo da rispettare. Se si inverte la polarità si rischia di danneggiare il componente.
Inoltre Arduino UNO lavora a 5V mentre il led rosso, come da specifiche, può essere alimentato al massimo a 1,8V poi rischia di bruciarlo. Per questo nel circuito si introduce un resistore. Il resistore infatti limita il passaggio di corrente e previene che il led subisca danni.

una volta verificato che il circuito sia correttamete montato possiamo alimentare Arduino UNO collegandolo al computer per eseguire la programmazione.

Programmare Arduino

Come precedentemente accennato, questo esercizio è utile per imparare a prendere dimestichezza sia con la componentistica che con le basi di programmazione di Arduino in linguaggio Wiring.

Iniziamo con l’introduzione delle variabili. Dobbiamo spiegare ad Arduino come deve comportarsi in certe condizioni, per fare ciò dobbiamo definire delle variabili che “rispecchiano il mondo esterno”


// Dichiaro la variabile LED un numero intero che corrisponde al pin digitale di Arduino/Genuino
int LED = 9;

// Imposto valore iniziale del PWM
int ValorePWM = 0;

// dichiaro variabile per carattere che arriva dalla seriale
char Carattere;

In questo pezzo di codice abbiamo detto ad Arduino che andremoad operare sul pin 9 della board. l’etichetta “LED” associata alla variabile serve solo a oi per comodità e semplicità di lettura del codice.
Abbiamo dichiarato che useremo una variabile di tipo intero per gestire il valore di luminosità. Questo numero andrà da 0 a 255.
Per cocludere abbiamo dichiarato una variabile di tipo carattere che verrà usata dalla porta seriale per ricevere i comandi di accensione, spegnimento e modifica luminosità.

Terminata la fase di dichiarazione variabili, passiamo alla funzione di setup.


void setup() {
    // imposto la velocità di comunicazione che arduino utilizzerà per comunicare con il PC
    Serial.begin(9600);

    // dico ad Arduino che il pin 9 dell'omonima scheda sarà usato come OUTPUT
    pinMode(LED, OUTPUT);
}

Nel setup definisco la velocità di comunicazione che Arduino utilizzerà per comunicare. Questa velocità dovrà essere adottata anche dal PC per poter comunicare correttamente.
Definisco inoltre che il pin9 della scheda Arduino sarà usato come OUTPUT

Arrivo quindi alla funzione di loop. La funzione di Loop verrà richiamata all’infinito da Arduino. Il loop viene eseguito finchè c’è tensione e finchè non si manifesta un errore o un eventomparticolare che ne sospende, blocca l’esecuzione. Nel nostro caso il loop sarà infinito.


// Ripeti queste istruzioni all'infinito:
void loop() {

    // Se riceve comandi validi da seriale allora aggiorna ValorePWM
    if (Serial.available() > 0) {
    Carattere = Serial.read();

    // se trovo '+' allora incrementa di 15 il valore PWM
    if(Carattere=='+' && ValorePWM<255){
        ValorePWM = ValorePWM+15;
    }

    // se trovo '-' allora decrementa di 15 il valore PWM
    if(Carattere=='-' && ValorePWM>0){
        ValorePWM = ValorePWM-15;
    }

    // se trovo '1' allora porta a 255 (massimo) il valore PWM
    if(Carattere=='1'){
        ValorePWM = 255;
    }

    // se trovo '0' allora porta a 0 (minimo) il valore PWM
    if(Carattere=='0'){
        ValorePWM = 0;
    }

    Serial.print('Ricevuto:');
    Serial.println(ValorePWM);
    analogWrite(LED, ValorePWM);
    }
}

Considerando che tutto quello che è contenuto dentro la funzione loop viene continuamente eseguita, possiamo dire che per prima cosa il programma va a verificare continuamente se Arduino ha ricevuto un carattere dal PC. Se non c’è un carattere allora cotinua a riverificare finchè non arriva qualcosa.
Se viene rilevato un carattere allora lo script fa una serie di controlli del tipo: se è il carattere “+” allora attivo la parte di codice che aumenta il valore della luminosità di “15 punti” fino a un massimo di 255.
Se incontra il carattere “-” allora abbassa la luminosità di “15 punti” fino ad arrivare al minimo che è 0.
Se viene invece rilevo il carattere “1” allora Arduino porta subito la luminosità al massimo, ovvero 255 e al contrario se rileva il carattere 0 porta la luminosità a “0”.

Ecco il codice completo:


/*
Dimmer LED Seriale (Author: Matteo Dalle Feste - matteo@dallefeste.com - info@ciaobit.com - https://ciaobit.com )
Libero utilizzo a fini non commerciali e mantenendo i crediti dell'autore
You can use this script for free. Not for commercial use. Keep author credits
*/

// Dichiaro la variabile LED un numero intero che corrisponde al pin digitale di Arduino/Genuino
int LED = 9; 

// Imposto valore iniziale del PWM
int ValorePWM = 0; 

// dichiaro variabile per carattere che arriva dalla seriale
char Carattere;

void setup() {
   // imposto la velocità di comunicazione che arduino utilizzerà per comunicare con il PC
   Serial.begin(9600);
   // dico ad Arduino che il pin 9 dell'omonima scheda sarà usato come OUTPUT
   pinMode(LED, OUTPUT); 
} 

// Ripeti queste istruzioni all'infinito: 
void loop() {

  // Se riceve comandi validi da seriale allora aggiorna ValorePWM
  if (Serial.available() > 0) {
    Carattere = Serial.read();
    
    // se trovo '+' allora incrementa di 15 il valore PWM
    if(Carattere=='+' && ValorePWM<255){ ValorePWM = ValorePWM+15; } // se trovo '-' allora decrementa di 15 il valore PWM if(Carattere=='-' && ValorePWM>0){
      ValorePWM = ValorePWM-15;
    }

    // se trovo '1' allora porta a 255 (massimo) il valore PWM
    if(Carattere=='1'){
      ValorePWM = 255;
    }

    // se trovo '0' allora porta a 0 (minimo) il valore PWM
    if(Carattere=='0'){
      ValorePWM = 0;
    }
    
    Serial.print('Ricevuto:');
    Serial.println(ValorePWM);
    analogWrite(LED, ValorePWM); 
  }

} 

Un articolo simile che tratta sempre la luminosità di un led controllata con Arduino lo trovi qui: Regolare la luminosità di un LED con il PWM e Arduino Genuino

Se ti è piaciuto l’articolo condividilo! Grazie 🙂

Riguardo Matteo Dalle Feste

Web Designer e Developer presso una nota testata giornalistica sul turismo. Appassionato di domotica, nel tempo libero, cura la realizzazione sia hardware che software di piccoli progetti domotici fai da te.

Guarda anche

RFLink Gateway e Arduino Mega2560: trasmettere e ricevere a 433Mhz

Cos’è RFLink Gateway RFLink Gatrway è un progetto gratuito che implementa la comunicazione via radio …

Un commento

  1. Ottimo e semplice progetto.Complimenti!!

Lascia un commento

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