Tutorial: accendere 3 led con 3 pulsanti

Usare Arduino per accendere i led è una delle cose che più mi diverte, saranno le lucine o il loro colore 🙂

3 led e 3 pulsanti

oggi voglio riprendere uno sketch presente tra gli esempi forniti con l’IDE di Arduino e ampliarlo un po’, lo sketch è Button.ino o Button.pde.

Ti mostro come ampliare il numero di led e di pulsanti associando ogni pulsante ad un led ed accendendo e spegnendo i led con la pressione del pulsante associato.

Per realizzare questo esperimento ti basta acquistare lo STARTER KIT CON ARDUINO UNO REV3, all’interno della confezione oltre all’arduino uno rev3 ci sono:

  • 5 led rossi di cui ne userai solo 3
  • 3 pulsanti da Circuito Stampato
  • la breadboard
  • i cavetti per le connessioni
  • 4 resistenze da 330Ω

Lo schema dei collegamenti è il seguente:

3 led e 3 pulsanti con arduinoper ogni pulsante devi collegare una resistenza da 330Ω tra il terminale a cui colleghi l’ingresso analogico di Arduino e il pin di massa ( Gnd ).

I 3 led avranno la massa in comune ( catodo ) e connessa alla massa del circuito e di arduino mediante una resistenza da 330Ω.

I terminali positivi dei 3 led sono collegati ciascuno ad un pin digitale di Arduino.

Ecco lo sketch:

#define analog0 A0
#define analog1 A1
#define analog2 A2

#define led0 2
#define led1 3
#define led2 4

int statoLed0 = 0;
int statoLed1 = 0;
int statoLed2 = 0;

void setup()
{
    pinMode( analog0, INPUT );
    pinMode( analog1, INPUT );
    pinMode( analog2, INPUT );

    pinMode( led0, OUTPUT );
    pinMode( led1, OUTPUT );
    pinMode( led2, OUTPUT );

    digitalWrite( led0, statoLed0 );
    digitalWrite( led1, statoLed1 );
    digitalWrite( led2, statoLed2 );
}

void loop()
{

  if ( analogRead(analog0) > 1000 )
  {
    if ( statoLed0 == LOW  ) statoLed0 = HIGH;
    else                     statoLed0 = LOW;
    digitalWrite( led0, statoLed0 );
    delay(200);
  }

  if ( analogRead(analog1) > 1000 )
  {
    if ( statoLed1 == LOW  ) statoLed1 = HIGH;
    else                     statoLed1 = LOW;
    digitalWrite( led1, statoLed1 );
    delay(200);
  }

  if ( analogRead(analog2) > 1000 )
  {
    if ( statoLed2 == LOW  ) statoLed2 = HIGH;
    else                     statoLed2 = LOW;
    digitalWrite( led2, statoLed2 );
    delay(200);
  }

}

Lo sketch è ridondante, nel senso che le righe di codice per gestire un led sono state duplicate per gestire anche gli altri due. Entrando nel dettaglio:

linee 01-03: definisci i tre pin analogici a cui colleghi i tre pulsanti;

linee 05-07: definisci i tre pin digitali a cui colleghi i led;

se ti stai chiedendo come mai non ho collegato anche i pulsanti a 3 pin digitali, visto che utilizzo il loro segnale come digitale, il motivo è semplice i pin analogici sono sempre meno considerati e lasciati inutilizzati nella maggior parte dei progetti, di fatto in questo modo riduci il numero di input possibili e di conseguenza anche di output disponibili. Con questi esperimenti la mia idea è di sensibilizzare anche sull’utilizzo di questi pin in modo che tu possa avere a disposizione più ingressi/uscite digitali;

linee 09-11: definisci tre variabili di tipo integer in cui memorizzerai il valore di stato ( acceso/spento -> HIGH/LOW) di ciascun led;

linea 31: testa il valore letto sull’ingresso analogico 0 ( A0 ) e se questo vale più di 1000 entra nella condizione if ed esegui le linee che seguono. Il suo funzionamento si basa sul fatto che un contatto normalmente aperto come quello del pulsante non premuto invia un segnale nullo ( zero ) all’ingresso analogico corrispondente. La pressione del pulsante collega al positivo il pin analogico, generando sul convertitore ADC di arduino il valore 1023. Riassumendo la pressione del pulsante viene vista da arduino con un valore letto sull’ingresso analogico di 1023, quindi maggiore di 1000;

linea 33-34: verifica che lo stato corrente del led 0 sia LOW, se verificato lo porta a HIGH, ossia inverte lo stato del led, in caso sia già HIGH lo porta a LOW ( linea 34 );

linea 35: invia il valore di stato appena impostato al pin digitale a cui è collegato il led;

linea 36: attende un tempo di 200 millisecondi prima di proseguire rilevando la pressione di un altro pulsante o dello stesso, questo serve ad evitare di dover premere il pulsante alla velocità di 1 millesimo di secondo, di contro se non ci fosse sarebbe molto difficile riuscire a fissare lo stato acceso o spento alla pressione del pulsante. Puoi aumentare questo tempo se il modo in cui intendi far lavorare i pulsanti è più lento, diminuirlo se più veloce;

linee 39-45: eseguono le stesse cose delle linee 31-37 ma per il secondo led;

linee 47-53: eseguono le stesse cose delle linee 31-37 ma per il terzoo led;

Ho realizzato anche un piccolo filmato dimostrativo:

Buon divertimento.

 

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/tutorial-accendere-3-led-con-3-pulsanti.html

36 comments

Skip to comment form

    • Andrea on 8 giugno 2013 at 10:14
    • Reply

    ciao mauro stò provando a utilizzare 2 pulsanti come interrutori come nel video che lei ha fatto, però con due pulsanti non ci riesco può darmi qualche consiglio ?? questo è il programma è esatto ??? il programma funzione però non mi riesce a accendere e spegmnere i due servo a rotazione continua , riesco a farlo funzione tutto solo con il pulsante premuto , premetto che ci sono 2 pulsanti uno quando è premuto fà funzione tutto ‘latro quando è premuto spegne tutto .

    int servo1=9;
    int servo2=10;
    int w=0;
    int y=0;
    int p1=12;
    int p2=13;
    int a=6;
    int b=7;
    int zio=0;
    void setup(){
    pinMode (servo1,OUTPUT);
    pinMode (servo2,OUTPUT);
    pinMode (p1, INPUT);
    pinMode (p2, INPUT);
    pinMode (a, OUTPUT);
    pinMode (b, OUTPUT);
    }

    void loop (){
    w= digitalRead(p1);
    y= digitalRead(p2);
    if ((w==HIGH)&&(y==LOW)&&(zio==0))
    {

    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    digitalWrite(servo2,HIGH);
    digitalWrite(servo2,LOW);
    digitalWrite(servo1,HIGH);
    delay(1.5);
    digitalWrite(servo1,LOW);
    delay(10);

    zio=1;
    delay(1000);

    }
    if ((w==LOW)&&(y==HIGH)&&(zio==1)){
    {

    digitalWrite(a,LOW);
    digitalWrite(b,LOW);

    digitalWrite(servo1,HIGH);
    delay(2.5);
    digitalWrite(servo1,LOW);

    delay(10);
    zio=0;
    delay(1000);
    }
    }}

    1. Ciao Andrea,
      lo sketch é completamente errato, ti invito a leggere dei tutorial sui servo e a comprenderei bene prima di provare, non guardare solo i video, trovi i miei tutorial spiegati riga per riga proprio per aiutarti.

      Se avessi letto avresti capito molte cose sia degli errori che hai fatto sia di non inserire nei commenti gli sketch.

      Mauro

    • Vito on 7 settembre 2013 at 16:38
    • Reply

    Ciao Mauro, ho copiato il tuo progetto dei 3 led con 3 pulsanti e ne ho aggiunto un quarto che deve spegnere tutti e tre i led contemporaneamente ,come si fa in un impianto domotico.
    Il mio problema arriva quando devo implementare una fotoresistenza per creare un crepuscolare da abbinare a uno dei pulsanti esistenti.
    In pratica il pulsante forza l’accensione dell’uscita solo quando c’è luce e non ha alcun effetto di sera.In questo caso il pulsante che ho aggiunto io non dovrebbe avere effetto di notte quando lo uso per spegnere tutto
    Se poi si riusciva a resettare il pulsante nel caso lo si abbia lasciato acceso di giorno sarebbe meglio.

    Io ho usato sia il ciclo if..else dando le condizioni e il ciclo while ,ma non sono arrivato a niente. Puoi darmi qualche idea su come risolvere il tutto?

    1. Ciao Vito, hai letto il mio articolo sulle fotoresistenze?
      Penso tu possa ottenere tutto ciò che vuoi semplicemente mettendo la condizione di IF sul l’accensione di ciascuna luce.

      In pratica, indipendentemente dal pulsante, se c’é luce non fai accendere nulla; questo comporta che se ti sei dimenticato qualcosa acceso all’alba si spegne.

      Mauro

        • Vito on 15 settembre 2013 at 15:12
        • Reply

        Grazie per l’aiuto. Sono riuscito a risolvere quel problema così.Ora non mi resta che creare il codice per gestire una scala generata dalla luce minima e massima, per ottenere così un comando per capire quando è tornata la luce e spegnere il tutto

        1. Bene Vito, sono contento … continua a sperimentare é divertente !!

  1. Ciao Marco,
    Certo, puoi ottenere lo spegnimento dei led tenendo premuto il pulsante corrispondente, dovrai modificare lo sketch ed usare la funzione milllis() per tener traccia del tempo che passa.

    Potresti anche spegnere ciascun led con un tempo di pressione differente dagli altri.

    Mauro

    • Di Loreto Vincenzo on 19 marzo 2014 at 19:44
    • Reply

    ciao Mauro grazie per i tutorial , volevo chiederti come posso fare tutto questo dal web ? accendere e spegnere i 3 led con pulsante Grazie ancora

    1. Ciao Vincenzo,
      non è semplicissimo ma ci sono dei tutorial in cui spiego come fare con diverse tecniche.
      Ti anticipo che dovrai studiare sia programmazione, sia networking e configurazioni di rete.

    • Andrea on 20 aprile 2014 at 16:24
    • Reply

    Ciao Mauro, è tutto chiaro ma non trovo il comando nello sketch dove tenendo premuto il led lampeggia, come nel filmato…

    1. Ciao Andrea,
      ciascuno dei blocchi 31-37, 39-45, 47-53 provvede sia ad accendere e spegnere i led corrispondente sia ad eseguire il lampeggio se mantieni premuto il pulsante corrispondente. E’ la logica del loop() e dei delay(200) che alternando gli stati creano l’effetto lampeggio 🙂

    • Fabrizio on 11 maggio 2014 at 23:12
    • Reply

    Ciao Mauro, sono nuovo di arduino, e vorrei realizzare un temporizzatore dove ho un ingresso aperto/chiuso che mi agisce su due uscite di arduino.
    La modalità dovrebbe essere questa: alla chiusura del contatto d’ingresso mi aziona subito l’uscita “A”, e dopo circa 20 secondi mi attiva anche l’uscita “B”.
    All’apertura del contatto d’igresso viceversa mi disattiva subito l’uscita “B” e dopo circa 20 secondi mi disattiva anche l’uscita “A”.
    Purtroppo di programmazione in C+ non ne so molto, mi potresti dare una mano magari scrivendo uno sketch a riguardo?
    Comunque complimenti per il tuo sito dove trovo molti spunti e ispirazione per i miei progettini.
    Cordiali Saluti.

    1. Ciao Fabrizio,
      ho scritto, e continuo a scrivere, articoli in cui spiego linea per linea il codice perché chiunque con buona volontà possa imparare a creare i propri progetti.
      Se invece preferisci affidarmi un lavoro su commissione posso valutare il progetto se mi invii sulla casella info del blog tutti i dettagli di quello che stai realizzando e come deve funzionare.

    • Giorgio on 25 luglio 2014 at 10:21
    • Reply

    Ciao sono Giorgio,
    mi ritrovo tra le mani un arduino uno, perchè non smanettarci un po’??
    Ho provato a scrivere il programma per comandare un solo led con un pulsante, ma una volta premuto il pulsante il led si mette a lampeggiare per un paio di secondi, poi si spegne da solo.
    il programma è il seguente:

    [ codice rimosso in automatico ]

    Se puoi dare un occhiata mi faresti un grande piacere perchè sto impazzento per una stupidata!
    Grazie per le guide ben chiare!

    1. Ciao Giorgio,
      è bello che tu voglia imparare ad utilizzare arduino e ti consiglio di partire da cose semplici e dai primi articoli presenti nel corso arduino on-line gratuito che trovi nel blog.
      Prima di tentare sketch più complessi è bene aver chiare le basi.

      Ti chiedo di rispettare la regola che trovi in fondo ad ogni articolo: non incollare codice nei commenti.

        • Giorgio on 25 luglio 2014 at 16:34
        • Reply

        Ok, ho risolto, grazie lo stesso

    • vito on 13 ottobre 2014 at 15:49
    • Reply

    Salve, sono nuovo del forum e avrei bisogno dei suoi consigli su come creare uno sketch,
    parto dicendo che so poco o niente di programmazione e di arduino, però sono molto testardo e l’argomento mi affascina.
    passo subito a spiegare che tipo di sketch mi serve:
    mediante un unico pulsante, ad ogni pressione dello stesso deve cambiare l’effetto di luce di due led,
    es. 1) lampeggio singolo (prima un led poi l’altro)
    2) lampeggio simultaneo di entrambi i led
    3) lampeggio effetto 4 freccie (emergenza)
    come creare gli effetti lo so fare il problema è il pulsante e come metterlo in ordine.
    non voglio lo sketch già fatto ma solo come impostarlo.
    Grazie

    1. Ciao Vito,
      ti consiglio di usare una variabile con valore impostato da 0 a 2 ( 0,1,2 ) ed uno switch in cui controlli il valore che incrementi ad ogni pressione del pulsante.
      Quando vale 0 applichi il primo lampeggio, ad uno il secondo ed a due il terzo.
      Ricorda di mettere un controllo che riporti a 0 il valore dopo aver raggiunto il 2 per evitare il 3,4,5,6… che non avrebbero effetto.

    • Matteo on 26 aprile 2015 at 15:00
    • Reply

    Ciao Mauro! Premetto che sto ancora imparando ad usare Arduino, però per una ricerca a scuola devo realizzare un circuito che al premere di uno dei 26 tasti, faccia comparire una specifica lettera su uno schermo lcd. Il problema è che non riesco a far funzionare più di un bottone per volta.Ogni volta che premo un pulsante, Arduino interpreta come se avessi premuto tutti i pulsanti, e quindi non fa partire una singola azione ma tutte le azioni di tutti gli IF che ho scritto. Potresti per caso dirmi quindi come faccio a far leggere ogni pulsante come singolo?
    P.S. Ho seguito tutti i consigli sia sul circuito che sul codice presenti in questo articolo, ma lo stesso non funziona

    1. Ciao Matteo,
      26 tasti sono difficili da leggere con un arduino uno, come hai letto ha solo 6 pin analogici e 14 digiali, dei quali, immagino, tu ne abbia usato almeno 8 per il display.
      Se hai seguito lo schema alla lettera controlla con il monitor seriale se premendo i primi 6 pulsanti connessi ad A0-A5 riesci a percepire la pressione del singolo.

    • Andrea on 9 settembre 2015 at 18:50
    • Reply

    Ciao Mauro,
    ho comprato da poco un Arduino UNO e sto seguendo il tuo corso, devo complimentarmi, mi è davvero di grande aiuto, sono riuscito a capire molte cose.
    Ma nel realizzare questo progetto di accesione con dei 3 Led con 3 pulsanti, ho deciso di scrivere lo sketch da solo, discostandomi leggermente…e anche se leggermente, si sono verificati dei problemi, uno dei led all’inizio lampeggia e gli altri due si accendono ma lampeggiano in modo fioco.
    Le uniche differenze circuitali sono nell’avere utilizzato resistenze da 470 ohm, ma non credo sia un problema.
    Mentre le differenze software sono nel fatto che ho utilizzato degli ingressi digitali anche per i pulsanti, in quanto il loro risulato oscilla tra 0 o 1.
    Ti posto lo sketch in modo da aiutarmi a capire cosa c è che non va :
    [[ codice rimosso in automatico ]]

    Ti ringrazio in anticipo!

    1. Ciao Andrea,
      innanzitutto, come avrai letto in fondo ad ogni mio articolo, non è possibile inserire sketch nei commenti.
      Ti chiedo la cortesia di rispettare le poche regole del blog per ricevere aiuto.

      I pulsanti devono sempre avere una resistenza di pull-up o pull-down come leggi negli altri articoli del corso.

    • Andrea on 9 settembre 2015 at 19:21
    • Reply

    Ciao Mauro,
    ho notato che c’è un errore nel progetto, anzi forse due.
    Le resistenze sui pulsanti non vanno collegate a GND in quel modo, altrimenti non funzionano come resistenze di pull-down ma vanno collegate in serie al pin d’ingresso e a massa, altrimenti l accenzione dei led risulta anomala e in più credo che ci sia un altro errore nel collegare i pulsanti agl’ingressi analogici, visto che funzionano in logica digitale a differenza dei potenziometri.
    Cmq sto seguendo i tuoi tutorial, sono molto interessanti, complimenti continua cosi, mi sono di grande aiuto.

    1. Ciao Andrea,
      il collegamento in pull-down è corretto, i pulsanti che uso io sono NC lungo la verticale per cui il pin a cui è connessa la resistenza è il medesimo a cui è collegato il pin arduino.
      In merito all’uso dei pin analogici al posto dei digitali è descritto in alcuni articoli sia la differenza sia il perché in questi progetti uso i pin analogici al posto dei pin digitali.

    • alceste on 3 novembre 2015 at 19:20
    • Reply

    Buona sera sto cercando un sketch che mi accende un led per tot secondi tenendo premuto il pulsante, potresti cortesemente aiutarmi? grazie anticipatamente

    1. Ciao Alceste,
      nel blog esempi simili ce ne saranno centinaia, cerca tra i primi articoli del corso base.

    • Damiano on 16 novembre 2015 at 22:36
    • Reply

    Buonasera,
    verrei realizare visto il suo progetto di accendere 3 led con 3 pulsanti.
    Vorrei eseguire per la segante modifica:
    poter accendere i tre led singolarmente emettendo un suono magari preso da una cartella del PC e quando sono tutti accessi si mettono a lampeggiare e avere un 4 suono differente.

    Pulsante1 – Led1 – Suono1
    Pulsante2 – Led2 – Suono2
    Pulsante3 – Led3 – Suono3

    Pulsante1-2-3 premuti – Led 1-2-3 Lampeggiano – Suono4

    1. Ciao Damiano,
      prendere un suono dal Pc ti richiede una interazione con qualche sw che dovrai cercare ed installare sul Pc.
      Potresti usare la libreria tone.h, descritta in altri tutorial, per generare il suono direttamente sul’arduino.

      In un articolo ho decritto anche come eseguire melodie natalizie.

    • Marco on 20 novembre 2015 at 20:59
    • Reply

    Salve mi chiamo Marco, sono alle prime armi con arduino , ho visto i suoi vari progetti… molto interessanti .
    Vengo al dunque non capisco come poter creare dei blocchi di programma, mi spiego meglio vorrei cerare una serie cioè per dare un’uscita dovrei avere due ingressi, se manca una di queste condizioni il led rimane spento.
    Come faccio che non ci riesco.
    Spero in una sua risposta saluti

    1. Ciao Marco,
      segui le lezioni del corso Base arduino online gratuito.
      La risposta è già nelle prime lezioni.

    • daniele on 14 ottobre 2016 at 08:31
    • Reply

    buon giorno.
    sono Daniele Negrato e avrei una domanda da farle: esiste un programma/simulatore di PLC per programmare Arduino?
    E’ da un po di tempo che ci provo ma non ho trovato nulla che mi soddisfi.
    Siccome è da una vita che programmo PLC di tutte le marche, faccio fatica ad abituarmi e a imparare ad utilizzare il sistema di sviluppo di Arduino.
    Mi può aiutare?
    La ringrazio.
    Buona giornata

    1. Ciao Daniele,
      purtroppo non conosco il mondo dei PLC.
      Ho letto di un progetto chiamato arduinoplc ma non l’ho mai provato, verifica se hanno sviluppato qualcosa in tal senso.

    • lele poletti on 19 novembre 2016 at 15:59
    • Reply

    Buongiorno, sto cercando di realizzare una Finish Line per 6 corsie, per la pista di macchine per mio figlio
    inutile dirti che non sono assolutamente del settore elettronica, ma avendo in casa una scheda arduino uno, usata per un progetto midi, ho seguito il tuo schema, copiato il codice ed ok … funziona tutto.
    per me gia un gran successo… anche se sono solo tre led.
    Ho integrato i tuoi tre led con le mie 6 corsie… quindi sei contatti sei led ecc.ecc..
    ora però le mie limitate conoscenze bloccano la possibilità di risolvere due problemi/ necessità…
    la prima è che il primo Led che si accende deve escludere gli altri 5 (così da identificare solo la prima macchinina che oltrepassa il traguardo).
    la seconda è sapere se c’è un modo per tenere il led acceso prolungatamente per x tempo, il contatto iene fornito con 6 pulsanti, quindi se lascio il pulsante il led si spegne.
    intanto consulterò il tuo corso online, ti ringrazio.

    grazie Lele

    1. Ciao Lele,
      i tuoi dubbi puoi risolverli con un unico approccio: fai in modo che il primo pulsante, che viene premuto, accenda il led corrispondente e contemporaneamente disabiliti il proseguire dello sketch.
      Puoi ottenerlo in due modi:
      1) semplice: metti un delay molto alto 1000000000000;
      2) stilistico: crei un ciclo while infinito ( vedi esempi in altri sketch )

      In questo modo potrai usare il pulsante di reset per far ripartire il programma .. e … la gara.

    • Luca155 on 2 giugno 2018 at 20:13
    • Reply

    Salve Mauro, complimenti per i tanti progetti sviluppati… desideravo porle alcune domande su questo progetto,
    posso impiegare un Arduino Mega? e posso utilizzare dei tasti touch, al posto dei pulsanti? Ringraziandola infinitamente per il tempo che ci dedica!!!
    Cordiali saluti

    1. Ciao Luca,
      si puoi, dovrai adattare il codice alla lettura/ricezione dei pulsanti touch a meno che quelli che desideri utilizzare non possieda già un uscita in pull-up o pull-down

Lascia un commento

Your email address will not be published.

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