«

»

Mar 09

Stampa Articolo

Arduino, led e pulsante

Danilo, un appassionato arduino come te, mi ha scritto in questi giorni per sottopormi il suo progetto ed ha trovato numerosi spunti nel blog per realizzarlo. Ad un tratto mi ha scritto: “… Vorrei aggiungerci appunto un interuttore,per i led ...”

Arduino un led ed un pulsante

Puoi leggere la nostra conversazione come commento all’articolo Tutotorial Arduino e i servo II in cui Danilo ha postato il suo sketch.

E’ probabilmente un problema in cui ti sei trovato anche tu, sembra il più banale dei casi di esempio eppure nasconde qualche insidia.

L’idea di Danilo è di accendere uno o più led con un pulsante e lasciarli accessi fino alla successiva pressione dello stesso pulsante.

Lo sketch che può aiutarti a farlo è più o meno il seguente:

/*
 * Sketch Led e bottone
 *
 * @author: Alfieri Mauro
 * @see:    http://www.mauroalfieri.it
 *
 * @licenze: Creative common
 */

int pinLed=13;
int bottone=2;
int statoLed=LOW;

void setup() {                
  pinMode(pinLed, OUTPUT);  
  pinMode(bottone, INPUT);
}

void loop() {
  int leggiBottone=digitalRead(bottone);

  if (leggiBottone == 1)
  {
     if (statoLed == LOW)
     {

       statoLed=HIGH;
       digitalWrite(pinLed, statoLed);
       delay(1000);

     } else {

       statoLed=LOW;
       digitalWrite(pinLed, statoLed);
       delay(1000);

     }
  }
}

Ecco come funziona:

inizia dalle linee 10-12: in cui definisci tre variabili, la prima pinLed indica a quale pin vuoi collegare il led nel mio caso ho utilizzato il led integrato nella board Arduino; la seconda bottone indica a quale pin colleghi il bottone o pulsante e l’ultima statoLed è la variabile più importante, quella in cui memorizzerai lo stato del led e che cambierà ad ogni pressione del pulsante (LOW spento, HIGH acceso);

linee 15-16: definisci la modalità di funzionamento dei pin pinLed e bottone il primo in OUTPUT perchè deve comandare il led, il secondo in INPUT perchè deve leggere il valore inviato dal pulsante;

linea 20: leggi il valore del pulsante con la funzione digitalRead() e memorizza questa informazione in una variabile definita integer: leggiBottone mi sembra parlante 🙂

linea 22: definisci un controllo sul valore della variabile leggiBottone, nel tipo di collegamento mostrato nella figura in alto il pulsante assume valore 0 a riposo e 1 quando premuto, se colleghi differentemente il pulsante dovrai cambiare questa condizione;

linea 24: verifica il valore della variabile di stato: statoLed, allo start questa variabile vale LOW come definito alla linea 12, per cui se sei a questo punto dello sketch vuol dire che hai premuto il pulsante ( leggiBottone == 1) ed il led è spento (statoLed == LOW);

linea 27: cambia lo stato del led da LOW, in cui sei in questo momento, a HIGH che ti permette di accendere il led;

linea 28: usa la funzione digitalWrite(pin,mode) dove pin è il valore del pin a cui è collegato il led e mode è lo statoLed, in questo momento impostato a HIGH;

linea 29: attendi un tempo di 1000 millisecondi = 1 secondo, più o meno è il tempo dei tuoi riflessi, è il tempo che impieghi a premere e rilasciare il pulsante senza dover fare toccata e fuga, premendolo e rilasciandolo come faresti con un comune interruttore, diciamo che rende più umano lo sketch;

linea 31: definisci la funzione di else, ossia quello che accade se alla pressione del pulsante verificata alla linea 22, lo stato del led non è LOW come si aspetta la linea 24; in pratica la condizione in cui ti trovi adesso, hai premuto e rilasciato il pulsante ed il led è acceso, l’else ti consente di poterlo spegnere con una nuova pressione del pulsante;

linee 33-35: sono come la sequenza 27-29 con la differenza che in questa condizione ti trovi solo se il led è acceso ed hai premuto nuovamente il pulsante, quindi vuoi spegnerlo per cui imposti statoLed a LOW;

Lo sketch è abbastanza semplice se ti è chiaro il concetto di stato, e quindi di variazione di stato utilizzato per comandare il led, se qualcosa non ti è chiara scrivimo commentando questo articolo.

Buon divertimento.

 

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/arduino-led-pulsante.html

91 comments

Vai al modulo dei commenti

  1. danilog

    grazie! lo sketch è molto chiaro,soprattutto grazie alla tua particolare spiegazione.Ho imparato una nuova cosa 🙂

    1. Mauro Alfieri

      Sono contento, diciamo che è un articolo dedicato alla tua esigenza, ma che tornerà utile a tanti appassionati.
      Quando lo avrai finito mi invii delle foto del tuo progetto, così le condividiamo con tutti gli amici del blog.

      Mauro

  2. danilog

    una domanda..per aggiungere più led basta inserirli come variabili Int e nel setup. il resto rimane invariato?

    1. Mauro Alfieri

      Puoi aggiungere più led in 3 modi:
      1. collegandoli in serie o parallelo, scegli tu in funzione del tipo di led e della corrente da erofìgare, ed usare un solo pin di arduino come in questo sketch;
      2.1 collegare ciascun led ad una uscita e quindi definire pinLedA, pinLedB, pinLedC … poi inizializarli nel setup con pinMode, ed infine scrivere tante volte digitalWrite quanti sono i led;
      2.2 versine elegante della precedente definite int pinLed[] = {2,3,4,5,…} e quindi dei cicli for sia per inizializzarli che per accenderli, trovi degli spunti nei miei articoli “Giochi di luce” scritti in occasione del natale.

      Mauro

  3. mauro

    e per accendere e spegnere due led separatamente con due pulsanti??

    1. Mauro Alfieri

      Hai provato a cercare nel Blog? ci sono tanti esempi, se proprio non ne trovi nessuno che fa al caso tuo, scrivimi bene cosa vuoi realizzare e ti aiuto.

      Mauro

  4. mauro

    in teoria è semplice! poichè devo soltanto accendere e spegnere due led con due pulsanti…che devono funzionare separatamente..un pulsante che controlla un led..e l’altro pulsante che controlla l’altro led..ma quando compilo il programma non so perchè mi da un errore…e non riesco a correggerlo

    1. Mauro Alfieri

      Mi posti lo sketch che stai utilizzando?

      Mauro

  5. mauro

    sto tentando di modificare l’esempio presente nel compilatore di arduino chiamato ”button” per adattarlo a due pulsanti..

    1. Mauro Alfieri

      Nel Blog ci sono tanti articoli che possono essere adattati al tuo caso, ad esempio:
      http://www.mauroalfieri.it/elettronica/tutorial-shield-domotica.html
      Puoi omettere di utilizare la shield relè e collegare direttamente i pulsanti alle entrate 2-7 e i led alle uscite 8-13 con delle resistenze, la 13 ha già una sua resistenza di base.
      In questo tutorial i led e i pulsanti sono 6 ma puoi usarne anche solo 1,2,3,4 o 5.

      Dimmi se fa al caso tuo.

      Mauro

  6. mauro

    siii Questo funziona benissimoo! grazie! 😀 e se invece volessi spegnere dei led??? utilizzando allo stesso modo un pulsante per led???

    1. Mauro Alfieri

      Devi sono cambiare il valore del secondo parametro della funzione digitalWrite da HIGH a LOW ad ogni pressione del pulsante.

      Mauro

  7. mauro

    si lo soo! però nn riesco a farlo! perchè usando come esempio quello che mi hai detto il programma funziona! però nn riesco a modificarlo per far spegnere dei led già accesi…

    1. Mauro Alfieri

      Ciao,
      prova a leggere questo tutorial 😉
      http://www.mauroalfieri.it/elettronica/tutorial-accendere-3-led-con-3-pulsanti.html

      Forse fa al caso tuo.

      Mauro

  8. mauro

    siiii questo va benissimooo finalmente funziona correttamente! grazie mille!! 😀 😀

  9. mauro

    ciaooo scusami se ti disturbo ancora… 🙂 ma volevo chiederti un altra cosa…se volessi usare arduino con uno schermo lcd e un sensore di temperatura, per misurarla e visualizzarla sullo schermo…quindi con la libreria “liquidcrystal” caricata…posso usare gli ingressi liberi per un altro programma totalmente diverso??
    e se si come devo scriverlo?? di seguito, in un altra scheda oppure contemporaneamente all’altro programma??

  10. Matteo

    Ciao.
    Ho un piccolo robot che si attiva alla pressione di un pulsante.
    Vorrei spegnerlo premendo di nuovo il pulsante ma non ci riesco. Come devo fare?
    Grazie.

    1. Mauro Alfieri

      Ciao Matteo,
      devi usare una variabile di stato, di solito boolean, cheti dica se il robot é acceso o spento.
      La pessione del pulsante fa variare lo stato di questa variabile ed il robot si attiva o si spegne in funzione di questo stato.

      Leggi gli articoli del corso arduino on-line per capire come fare.

      Mauro

  11. alberto

    ciao, ho un piccolo problema con il mio programma, il mio intento è quello di accendere e spegnere un led con un pulsante, il problema è che non tutte le volte che premo il pulsante il led si spegne o si accende, alcune volte il led rimane nel suo stato, hai qualche soluzione??
    ti allego il mio programma
    ps questo programma accende e spegne 4 led con 4 pulsanti

    // Led 1-2-3-4 on-off tramite Pulsante 1-2-3-4
    //by Alberto Zotta-Tommaso Lo Verde-Andrea Basilico
    #define LED_1 13
    #define LED_2 12
    #define LED_3 11
    #define LED_4 10// LED collegato al pin digitale 13
    #define BUTTON_1 7
    #define BUTTON_2 6
    #define BUTTON_3 5
    #define BUTTON_4 4 // pin di input dove è collegato il pulsante
    int val1 = 0;
    int val2 = 0;
    int val3 = 0;
    int val4 = 0;// si userà val per conservare lo stato di pin di input
    int stato = 0; // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso
    int in1 = 0;
    int in2 = 0;
    int mela = 0;
    void setup() {
    pinMode(LED_1, OUTPUT);
    pinMode(LED_2, OUTPUT);
    pinMode(LED_3, OUTPUT);
    pinMode(LED_4, OUTPUT);// imposta il pin digitale come output
    pinMode(BUTTON_1, INPUT);
    pinMode(BUTTON_2, INPUT);
    pinMode(BUTTON_3, INPUT);
    pinMode(BUTTON_4, INPUT);// imposta il pin digitale come input
    }

    void loop() {
    val1 = digitalRead(BUTTON_1);
    val2 = digitalRead(BUTTON_2);
    val3 = digitalRead(BUTTON_3);
    val4 = digitalRead(BUTTON_4);//legge il valore dell’imput e lo conserva

    // controlla che l’input sia HIGH (pulsante premuto)
    // e cambia lo stato del led
    if (val1== HIGH) {
    stato = 1 – stato;
    }

    if (stato == 1) {
    digitalWrite(LED_1, HIGH); // accende il led
    }
    else {
    digitalWrite(LED_1, LOW); // spegne il led
    }
    if (val2== HIGH) {
    in1 = 1 – in1;
    }

    if (in1 == 1) {
    digitalWrite(LED_2, HIGH); // accende il led
    }
    else {
    digitalWrite(LED_2, LOW); // spegne il led
    }
    if (val3== HIGH) {
    in2 = 1 – in2;
    }

    if (in2 == 1) {
    digitalWrite(LED_3, HIGH); // accende il led
    }
    else {
    digitalWrite(LED_3, LOW); // spegne il led
    }
    if (val4== HIGH) {
    mela = 1 – mela;
    }

    if (mela == 1) {
    digitalWrite(LED_4, HIGH); // accende il led
    }
    else {
    digitalWrite(LED_4, LOW); // spegne il led
    }
    }

    1. Mauro Alfieri

      Ciao Alberto,
      ad occhio ti manca un delay() sulla pressione del tasto, serve ad evitare che la medesima pressione sia interpretata come spengo-accendo-spengo-accendo-ecc.

      Io di solito negli sketch uso 200 o più dipende da che reazione vuoi che abbia il tuo tasto.

      Mauro

      1. alberto

        grazie io voglio simulare l’accensione di un led con un pulsante, come se questo avvenga tramite un interruttore,
        ok quindi provo con un delay 200 grazie 🙂

        1. Mauro Alfieri

          Ciao Alberto, ciò che vuoi ottenere é:

          premo-lascio = accendo
          premo-lascio = spengo
          premo-lascio = accendo
          premo-lascio = spengo

          giusto?
          Io metterei un delay 200 come minimo dopo l’assegnazione dello stato On od Off

          Mauro

  12. Beppe

    Ciao Mauro,
    seguo spesso le tue lezioni/spiegazioni, per me molto importanti, perche novizio in questo campo.

    Io vorrei poter controllare un motore di una finestra privo di fine corsa, per un certo periodo di tempo fino alla sua completa apertura, dovrei poterlo comandare con due pulsanti uno apre e uno chiude, ma non posso sbagliare pulsante, nel senso: il motore comanda una finestra che se e chiusa e io per sbaglio premo di nuovo il pulsante di chiusura, il motore non deve girare, e viceversa in apertura.

    Quello che mi viene in mente e di usare un controllo sull’ultimo pulsante premuto e salvarlo in una variabile.

    Ma non so come fare.

    Ho scritto uno schecth semplice (teorico) manca la parte del controllo stato pulsante.

    // Azionare un motore per un tempo stabilito
    // alla pressione di un pulsante per ogni senso di marcia

    #define BUTTON1 5
    #define BUTTON2 7
    #define APRE 8
    #define CHIUDE 10

    int durata = 20000; //millisecondi
    int val1 = 0;
    int val2 = 0;

    //
    void setup()
    {
    //
    pinMode(APRE, OUTPUT);
    pinMode(CHIUDE, OUTPUT);
    pinMode(BUTTON1, INPUT);
    pinMode(BUTTON2, INPUT);
    }

    //
    void loop()
    {
    val1 = digitalRead(BUTTON1); // Controlla lo stato del primo pulsante
    if (val1 == HIGH) // Se legge che e stato premuto
    {
    delay(10); // Antirimbalzo
    digitalWrite(APRE, HIGH); // Aziona il motore in apertura
    delay(durata); // Dopo un tempo impostato
    digitalWrite(APRE, LOW); // Ferma il motore

    val2 = digitalRead(BUTTON2); // Controlla lo stato del secondo pulsante
    if (val2 == HIGH) // Se legge che e stato premuto
    {
    delay(10); // Antirimbalzo
    digitalWrite(CHIUDE, HIGH); // Aziona il motore in chiusura
    delay(durata); // Dopo un tempo impostato
    digitalWrite(CHIUDE, LOW); // Ferma il motore

    }
    }
    }

    1. Mauro Alfieri

      Ciao Beppe,
      Innanzitutto ti chiedo di osservare, in futuro, l’invito presente in fondo ai miei articoli: non incollare sketch perché io li ricevo inconsultabili.

      I finecorsa o altro tipo di sensore sono fondamentali in questo tipo di progetto in quanto se per errore Arduino esegue un reset tra la chiusura ed il successivo comando di apertura rischi di distruggere o il motore o la finestra.

      Mauro

  13. Beppe

    Ciao Mauro.
    Grazie per aver risposto, e scusami per non aver letto di non incollare gli schetch qui.

    La tua risposta mi ha fatto piacere e nello stesso tempo mi ha messo un bel po di dubbi sull’affidabilita di Arduino, pensavo si potessero inserire delle sicurezze a livello software.

    Tipo dichiarando alcune variabili sullo stato dell’ultimo pulsante che e stato premuto, e modificando la variabile subito dopo la variazione di stato.
    E anche vero che se si resettasse per cause inaspettate azzererebbe le variabili allo stato iniziale non sapendo piu se e chiusa o aperta.
    Ho scritto uno schetch , se tu potessi dargli un occhiata per vedere se almeno ho capito qualcosa.
    Io l’ho provato e funziona , ma non ho tenuto conto dei reset improvvisi.

    La finestra in questione ha un motore bidirezionale provvisto solo di frizione , con un comando a uomo presente a due pulsanti, pulsante premuto finche non chiude o apre.
    Pensavo di automatizzarla con Arduino, poi leggendo altri tuoi tutorial mi è venuto in mente di aggiungere un rtc in modo che si potesse aprire e chiudere da sola ad una determinata ora.

    Grazie per la pazienza.
    Ciao Beppe

    1. Mauro Alfieri

      Ciao Beppe,
      se hai provato lo sketch e funziona puoi iniziare una fase di test che tenga acceso arduino per qualche giorno e verificare di tanto in tanto il suo funzionamento per assicurarti che non ci siano bug in cui potresti incorrere.

      Mi piace l’idea dell’RTC se hai degli orari fissi a cui far eseguire l’operazione di apertura e chiusura.

      Mauro

  14. Pino

    Ciao Mauro, sto provando ad riadattare il tuo codice a quello che vorrei fare io,
    in prativa vorrei memorizzare il valore nSpeed = 500 presente in una funzione,
    e nella funzione Read cambiarlo in nSpeed = 20 solo se si verifica la condizione
    bJoy == true, quando bJoy == true diventa false nSpeed deve tornare a 500.
    Solo che non funziona.. Dopo il cambiamento di stato rimane sempre a 20.
    Hai qualche idea??
    Grazie in anticipo, ciao
    Pino

    [codice rimosso dal sistema automatico]

    1. Mauro Alfieri

      Ciao Pino,
      il codice è stato rimosso da un sistema automatico, perchè come avrai letto non puoi incollare del codice nei commenti, è scritto negli avvisi in fondo ad ogni articolo.

      Per il problema con le variabili ti consiglio di controllare bene che esistano le condizioni di if ed else posizionate nel punto corretto del tuo sketch e vedrai che funzionerà.

      Mauro

  15. Luca

    Ciao Mauro, vorrei sapere se hai mai pensato a questa alternativa:

    Se nell’arco di 2 secondi il bottone viene premuto 1 volta, fai questo.
    Se nell’arco di 2 secondi il bottone viene premuto 2 volte, fai quest’altro.
    Se nell’arco di 2 secondi il bottone viene premuto 3 volte, fai quest’altro ancora.

    È un comportamento che ho visto fare a casa di un amico che ha implementato la domotica con il sistema homeplc e mi è sembrato veramente interessante: lui premendo una volta l’interruttore della cucina accende/spegne la luce_cucina, se preme lo stesso interruttore due volte accende/spegne la luce_cucina e spegne/accende la luce_corridoio.

    Ovviamente i suoi interruttori sono in realtà pulsanti che vanno sulle porte IN degli slave del sistema homeplc.

    Sono “nuovo” in Arduino quindi non riesco ad immaginare ancora il codice.

    Per evitare quello che mi sembra si chiami effetto bouncing, il delay di 0,2 secondi ho visto che funziona direi perfettamente per un bottone “human-pressed”.

    Grazie,
    Luca

    1. Mauro Alfieri

      Ciao Luca,
      suggerimento interessante.
      Comprendi che di evoluzioni possibili a ciascuno dei miei progetti ce ne sono tante e non riesco a presentarle tutte.
      Lo scopo del Blog è condividere conoscenza ed esperienze per cui se realizzi questa evoluzione e vorrai condividerla io sono a disposizione.

      Mauro

      1. Luca

        Buongiorno Mauro.

        Ho fatto una prova con un Serial write invece di un bottone fisico collegato a un pin di entrata, sembra che mi riconosca bene i due o più eventi nei 2 secondi.

        Condividerei con piacere ma se non posso fare l’attach di codice, mi è un po’ scomodo scrivere tutto a parole.

        Un saluto,
        Luca

        1. Mauro Alfieri

          Ciao Luca,
          sono contento che tu ci sia riuscito.
          Non serve condividere il codice, anche se apprezzo la tua disponibilità, quando avrai terminato il tuo progetto apportando tutte le modifiche e le innovazioni rispetto allo sketch presentato se vorrai potrai scrivere un articolo in cui lo racconti e spieghi il codice da condividere ed io sarò lieto di pubblicarlo.

          Mauro

  16. Edoardo

    Ciao Mauro.
    Sono uno studente quattordicenne appassionato di elettronica. Tempo fa ho acquistato una scheda Arduino UNO R3. Sto lavorando ad un piccolo progetto, una specie di “lancia missili”. Prima di assemblarlo lo ho testato “in piccolo” sulla breadboard, ed ho riscontrato un problema. Praticamente quando viene premuto un pulsante collegato al pin 13, un led verde sul pin 10 comincia a lampeggiare. Successivamente, alla pressione del pulsante collegato al pin 12, un led rosso su 11 si dovrebbe accendere fisso, ma questo non accade. Non è un problema del led, lo ho testato a parte e funziona. Vorrei capire dove ho sbagliato, perché penso di aver scritto male lo sketch, forse ho utilizzato male gli operatori booleani “&&”.

    Sketch: http://pastebin.com/stsEXpJm
    Foto breadboard: http://i57.tinypic.com/10epnd5.jpg
    Foto progetto: http://it.tinypic.com/r/mrb5uu/8
    (scusa lo scotch sui led ma non ho il saldatore 😉 )

    Spero tu mi possa aiutare a correggere lo sketch.
    Grazie mille,
    Edoardo

    1. Mauro Alfieri

      Ciao Edoardo,
      apprezzo il tuo impegno e la tua voglia di realizzare progetti con arduino.
      Ti anticipo che non correggo gli sketch fatti da altri e sopratutto non riesco a leggere uno sketch e capirne il significato senza ricostruire tutto il progetto e capirai che con centinaia di richieste al giorno non posso riprodurre tutti i progetti.

      Se hai il dubbio che il problema siano gli operatori booleani cambiali, non esiste solo il && ma anche altri, li trovi nella reference arduino.

      Io penso che dovresti prestare attenzione a dove verifichi se il primo led sia in lampeggio e dove testi il secondo pulsante.

  17. bita

    ciao….sono bita….ti volevo una domanda…..?
    io cerco un programma solo per accendere led con veri tempi….con sensore pir?
    se potresti rami la risposta precisa ti ringrazzio…….

    1. Mauro Alfieri

      Ciao Bita,
      non ho capito la domanda 🙁
      Cerca nel blog ci sono molti esempi per accendere led con giochi di luce e temporizzazioni ed anche un articolo dedicato al sensore pir.

  18. Daniele

    Ciao!! Prima di tutto, COMPLIMENTI per il fantastico blog…per me il migliore in rete come chiarezza nelle spiegazioni!!
    Premessa che sono un neofita e quindi mi sto documentando e sto facendo piccoli programmi per imparare.
    Volevo chiederti: se io volessi realizzare la stessa logica del circuito sopra ma, invece che, quando premo il pulsante si accende e ripremo si spegne…. Vorrei che si accendesse quando premo e si spegnesse al rilascio. Sono sicuro che è una stupidata per chi ne mastica già di programmazione, ma per me è tutto nuovo!!
    Grazieee

    1. Mauro Alfieri

      Ciao Daniele,
      il funzionamento descritto è più complesso rispetto a quello che desideri realizzare.
      In pratica ti basta eliminare tutta la parte relativa allo stato del led e lasciare un solo if che rileva la pressione del pulsante e accende il led, ed un else che lo spegnerà.

      1. Daniele

        Grazie per la risposta!! siimmaginavo fosse molto più semplice, ma per me è già una conquista!
        io ho lasciato solo
        [ codice rimosso in automatico ]
        con tutte le parentesi e struttura del caso… può andare?

        Grazie ancora

        1. Mauro Alfieri

          Ciao Daniele,
          purtroppo come hai letto in fondo agli articoli il codice non può essere incollato nei commenti.
          In ogni caso se funziona o meno lo puoi provare direttamente con l’arduino, è proprio questo il bello della scheda che se vuoi sapere se funziona o meno un progetto devi solo provarlo 🙂

  19. Daniele

    Oook allora mi metto al lavoro e provo questo mio primo “progettino”.
    Grazie

  20. Michele

    Buonasera, ho appena acquistato Arduino. Il suo sito mi sta tornando utilissimo, ed è molto chiaro. Purtroppo mentre la parte di programmazione mi risulta facile (nei ritagli di tempo faccio il programmatore) purtroppo non è così per quella elettronica. Ho letto più volte il manuale fornito con Arduino ma alcune cose non riesco a capirle. Sembrerò molto ignorante, ma nonostante abbia studiato le basi di elettronica nel primo capitolo del manuale di Arduino non sono riuscito a capire alcune cose che forse vengono date per scontate a allora non riportate:
    1. come faccio a sapere quali sono le resistenze da usare per progetti che esulano dal mero copia/incolla dagli schemi sul web? Se il progetto nasce dal presupposto di potersi creare qualcosa realizzando una propria idea, come identifico quando mi sono necessarie delle resistenze, e quali?
    2. un esempio pratico può essere quello dello schema di cui all’articolo in questione. Perché usare una resistenza per il collegamento a massa? E perché proprio quella?
    La ringrazio in anticipo per il suo tempo e mi scuso per la (forse) banalità della mia richiesta.

    1. Mauro Alfieri

      Ciao Michele,
      per comprendere le regole dell’elettronica non è sufficente il primo capitolo del manuale arduino e … forse … neppure tutto il manuale.
      Ti occorre studiare elettronica con manuali di uso negli istituti tecnici o universitari, dipende dal livello che desideri raggiungere.

      Per capire, ad esempio, il perché delle resistenze a massa o a +5v puoi leggere cosa significa resistenza di pull-up o pull-down, su come calcolarle puoi partire dalla legge di Ohm.

  21. Pietro

    Ciao, perchè la variabile “leggiBottone” è dichiarata nel loop? In quest modo Arduino esegue molte più operazioni se ad ogni ciclo la deve definire.
    Non sarebbe stato meglio dichiararla all’inizio e poi richiamarla nel loop?

    1. Mauro Alfieri

      Ciao Pietro,
      senza dubbio la tua osservazione è corretta, in questo esercizio ho voluto inserirla nel loop() per introdurre il concetto di variabili valide solo all’interno di una funzione e che non impegnano la memoria totale di arduino.
      I tempi in questo esempio sono trascurabili in quanto hai un delay( 1000 ) che annulla ogni risparmio di tempo computazionale che potresti avere spostando la variabile fuori dalla funzione loop().
      Ti consiglio di provare a eseguire lo spostamento della variabile e verificare le differenze tra l’una e l’altra situazione come esercizio sia percettivo sia effettivo 🙂 Sperimentare è sempre bello.

  22. Marco

    Ciao Mauro, volevo chiederti una cosa che, se possibile, farebbe risparmiare molte istruzioni in codici di questo tipo:
    i valori HIGH e LOW sono negabili?
    O occorre sempre fare un IF e ELSE per testare i due casi?
    Perchè potremmo risparmiarci tutto il secondo IF.

    Anche se forse potrebbe funzionare questa istruzione??
    statoLed=abs(statoLed-1);

    1. Mauro Alfieri

      Ciao Marco,
      nello sketch scritto per la Lemontech BlueRelay Shiled spiego proprio come usare lo stato, definito boolean, con la negazione.
      Considera che la tua istruzione ha un peso computazionale elevato quindi è vero che scrivi meno righe ma fai lavorare di più il microcontrollore.

      La soluzione di negazione di una boolen con ! è più semplice e facile da implementare e funziona con digitalWrite.

  23. luca

    Scusate… per favore qualcuno mi risponda che sto impazzendo…..

    [[ codice rimosso in automatico ]]

    con questo codice perchè se premo il pulsante mi si spengne e se non lo premo mi si accende quando dovrebbe accadere l’esatto contrario?!? (il pulsante sono sicuro che è normalmente aperto)

    1. Mauro Alfieri

      Ciao Luca,
      come avrai letto in fondo ad ogni articolo riporto la dicitura per la quale una delle poche regole del blog è che non si può incollare codice nei commenti.
      Ti chiedo la cortesia di rispettarle.

      Il codice è stato rimosso in automatico dal sistema.
      Per risolvere il tuo problema prova ad invertire i valori di digitalWrite in modo che faccia il contrario.

  24. Alberto

    Ciao Mauro
    Ieri sera, copiando uno sketch, alla fine mi è saltato l’errore:
    C:\Users\Administator\Documents\Arduino\libraries\Bounce1\Bounce.cpp:4:22: fatal error: WProgram.h: No such file or directory
    #include “WProgram.h”
    ^
    compilation terminated.
    Praticamente avevo importato al libreria Bounce.h così come era scritto nello skecht copiato. WProgram.h è un’altra libreria? Sembrano esserci problemi con questa.
    Se mi puoi essere di aiuto, grazie.

    1. Mauro Alfieri

      Ciao Alberto,
      in questo sketch non si fa uso della libreria “Bounce” sei certo di aver copiato questo sketch ?

  25. luca

    Buonasera, prima di tutto ringrazio mauro alfieri per queste guide fatte benissimo che mi hanno introdotto al mondo di arduino… ho un piccolo grande problema… vorrei far fare 2 funzioni diverse ad un pulsante (per esempio se premuto 1 volta (500ms) fa accendere un secondo led… su internet si trova poco e quel poco non mi funziona… qualcuno mi potrebbe aiutare? metto il codice (che chiaramente non mi funziona)

    [[ codice rimosso in automatico ]]

    1. Mauro Alfieri

      Ciao Luca,
      il tuo codice è stato rimosso in automatico come indicato da regolamento.
      Se vuoi un esempio che lavori sui tempi di pressione dei pulsanti puoi consultare gli articoli sul Dolly o sull’impostazione ora con arduino.

  26. Daniele

    Salve volevo sapere quale è la funzione della resistenza sul bottone

    1. Mauro Alfieri

      Ciao Daniele,
      è una resistenza di pull-down, trovi la descrizione in molti articoli del corso base e nei manuali di elettronica.

  27. Giuseppe

    Salve, mi serve il vostro aiuto, mi sono avvicinato adesso al mondo di Arduino. Ecco il mio progetto: Ho 4 pulsanti e 8 led (4 verdi e 4 rossi), sono 4 gruppi e ogni uno e composto da un pulsante, un Led Verde e un Led Rosso. Quello che voglio creare io è: il led verde è acceso appena premo il pulsante si spegne il led verde e si accende il rosso e cosi deve rimanere definitivamente, questo per ogni gruppo. mi potete dare una mano? GRAZIE in anticipo.

    1. Mauro Alfieri

      Ciao Giuseppe,
      sembra la base di un gioco luminoso, quello che devi fare è semplicemente memorizzare lo stato del gruppo a cui ti riferisci e accendere il led corrispondente alla pressione del pulsante.

  28. Dimitri

    Ho fatto tutto esattamente come nella Sua spiegazione (in più ho attivato il monitor per mostrarmi lo stato del Pin 2) però il led continua a lampeggiare perché secondo il mio Arduino l’input sul pin 2 è sempre HIGH.
    Ho provato anche a variare il pin di input ma il risultato non cambia. Qualche idea?

    1. Mauro Alfieri

      Ciao Dimitri,
      inverti la condizione alla linea 22, da == 1 a == 0 oppure inverti il collegamento del tuo pulsante.

  29. Maasimo

    Buongiorno, sto studiando molta teoria di Arduino. in passato ho fatto qualcosa con omron, che è più logica elettrica che di linguaggio, tuttavia non riesco neppure a far funzionare il led con 1 pulsantino.
    Mi sto esaurendo senza concludere nulla, sono già over 50, forse è anche quello che influisce: come posso fare?
    Saluti

    1. Mauro Alfieri

      Ciao Massimo,
      il mio consiglio è di iniziare per step dal corso on-line gratuito arduino.
      Se proprio non riesci neppure con quello puoi partecipare ad un mio corso in aula e di persona possiamo affrontare le sfide ben più complesse del singolo led 🙂

  30. marco

    Buona sera Mauro,

    la seguo con interesse da mesi fin da quando ho letto di Arduino sul web…
    Volevo realizzare un piccolo esercizio per mia figlia volevo realizzare con questo semplice sketch una funivia giocattolo, ma ho capito che non riesco ad andare oltre che l’esercizio del semaforo!
    Ho provato e riprovato questo sketch ma quando premo il bottone se sono fortunato il led si spegne e se non tengo premuto il bottone continua a lampeggiare, ho anche inserito un delay di 250 ms ma non funziona…
    Pensavo di riuscire a usare questo programma anche con il controllo in pwm per fare un accelerazione dolce e una dolce fermata ma missà che con l’orto mi trovo megli! 😉

    Grazie Marco

    1. Mauro Alfieri

      Ciao Marco,
      l’accensione e successivo spegnimento del led, effetto lampeggio, è dovuto ai tempi tra la pressione del pulsante ed il suo rilascio.
      Arduino, come hai letto, lavora per cicli continui a 16MHz ( molto rapidi ) per cui ti invito a ragionare partendo da questo concetto.
      Strano che 250 millisecondi non siano sufficienti come antirimbalzo, prova ad aumentare tale tempo.

      In merito allo spostamento della funivia ti invito alla lettura degli articoli per il controllo dei motori.

  31. Alexnder

    Buona sera mauro,
    Ma se uso un’ interruttore da pannello devo mattere anche a lui la resistenza o posso farne a me , perche’ serve la resistenza? devo usare il pulsante per escitare il rele che deve accendere una ventola.

    1. Mauro Alfieri

      Ciao Alexander,
      la resistenza serve sempre, il perché è spiegato in tanti articoli del blog.

  32. Gianni

    Buona sera, complimenti per il blog è molto ben fatto e utile.
    Volevo chiedere è possibile accendere il led per un determinato periodo di tempo utilizzando il pulsante solo come impulso di accensione anche se questo rimane premuto. Perchè ho visto che il tempo del delay inizia dopo che ho rilasciato il pulsante.
    Grazie Gianni

    1. Mauro Alfieri

      Ciao Gianni,
      si puoi, porta il delay fuori dalla condizione di pressione del pulsante o mettilo come alternativa alla pressione del pulsante.

      1. Gianni

        Grazie mille, stasera provo.

  33. DIsi

    salve volevo sapere se era possibile far diventare deviatori i due pulsanti, per accendere da un pulsante e dall’altro spegere.

    1. Mauro Alfieri

      Ciao Dlsi,
      certo puoi farlo.

  34. Giovanna

    Salve a tutti, mi servirebbe un aiuto!
    Io dovrei far accendere un ed attraverso un pulsante, e alla sua accensione debba iniziare a lampeggiare, una volta che ripremo il pulsante si spegne il led… ho fatto un paio di tentativi, ma con millis è più complicato

    1. Mauro Alfieri

      Ciao Giovanna,
      posso consigliarti di leggerti i miei tutorial del corso base arduino/genuino gratuito on-line.
      Troverai degli esempi sia di controllo led con il pulsante, come questo, sia di lampeggio e tutti descritti riga per riga.

  35. Luigi

    Ciao Mauro, volevo innanzitutto complimentarmi con te, per quello che fai e per il sito.
    Sto provando a riprodurre un arduino con l’atmega328, ho fatto il bootloader e riesco a caricare al suo interno gli sketch. Ho provato con lo sketch blink e tutto è andato bene, allora ho voluto provare a controllare un led con un pulsante, ma quando premo il pulsante il led rimane spento. La cosa mi sembra un pò strana visto che con arduino lo stesso schema funziona.
    ps. mi baso su questo schema:
    Sapresti darmi una dritta?
    Ti ringrazio

    1. Mauro Alfieri

      Ciao Luigi,
      la prima cosa che mi viene in mente è che il numero di pin del led o del pulsante non corrispondano.
      Prova a verificare con il monitor seriale se legge la variazione del segnale.

    2. Luigi

      Ho capito dove ho sbagliato e ho risolto, al posto di mettere i digital pin come nello schema mettevo i numeri delle piedinature.. mi vergogno pure a dirlo ahahha

      1. Mauro Alfieri

        Ciao Luigi,
        è ottimo che tu abbia capito l’errore e lo abbia corretto, tutti commettiamo errori negli sketch.

  36. Antonio

    buongiorno, sono un nuovo appassionato che si è appena affacciato sul mondo arduino, ho preso questoi esempio per fare pratica, ho compilato tutto lo sketch e collegato la scheda in immagine, solo che alla pressione del pulsante il led prima di rimanere acceso fa un lampeggio, la stessa cosa quando rischiaccio per spegnere, come mai?

    1. Mauro Alfieri

      Ciao Antonio,
      potrebbe essere il classico esempio di rimbalzo elettronico che ti si verifica a causa di una non perfetta pressione del pulsante o di un contatto imperfetto di quest’ultimo.
      Ti consiglio di provare aumentando i tempi di delay dopo la pressione.

  37. Cristian

    Grazie semplice e chiaro ! Pensare che era così semplice, eppure non riuscivo ad arrivarci…
    Complimenti per il sito !

    1. Mauro Alfieri

      Ciao Cristian,
      sono contento che i miei articoli ti possano essere stati utili.

  38. Manolo

    Ciao Mauro, ecco il quesito.
    Vorrei sapere come (e se fosse possibile) pilotare l’intensità luminosa di 10/15 led ad alta luminosità G4 già premontati sulle schedine rotonde (da faretto per intenderci), tenendo presente che il faretto avrà una sua alim. esterna di 12V. Vorrei creare l’effetto luminoso da minimo a max con questo tipo di led. Utilizzo sempre la Arduino Mega.

    Grazie mille!

    1. Manolo

      Preciso che l’alimentazione esterna di 12V la fornisco grazie ad un battery pack.
      Le schedine luminose che vorrei utilizzare sono quelle semplici (5050 SMD) con i due reofori per connettere la Vin.

      1. Mauro Alfieri

        Ciao Manolo,
        vedi risposta precedente.

    2. Mauro Alfieri

      Ciao Manolo,
      perdonami ma non ho compreso che tipo di componenti stai utilizzando.
      Se i driver per led che possiedi supportano un pin PWM di controllo da 0 a 5v puoi utilizzarlo.
      Se non lo supporta ma i faretti sono comunque dimmerabili devi trovare una shield di controllo con le caratteristiche di tensione e corrente adatte.

      1. Manolo

        Ok, cerco un po in giro.
        Grazie Mauro!

  39. Arteno

    Arteno.

    Scusa Mauro, ma dopo aver scritto tale e quale lo sketch “led e bottone”, dopo la verifica e compilazione mi esce un errore.
    Ho pure riscritto lo sketch facendo copia/incolla da quello da te scritto ma il risultato è lo stesso:

    “collect2.exe: error: 1d returned 5 exit status
    exit status 1
    Errore durante la compilazione per la scheda Arduino/Genuino”
    Ho verificato e riverifiacto tutto diverse volte.
    Sto però usando Arduino 1.8.1……
    forse questo è il problema?

    Grazie….sto cercando di imparare!
    Saluti

    1. Mauro Alfieri

      Ciao Arteno,
      francamente l’errore che ti restituisce è la prima volta che lo vedo, a me non è mai capitato.
      Sembra un errore di installazione/conflitto dell’IDE, hai provato con il semplice Blink degli esempi se riesci a compilare e trasferire lo sketch?

  40. Marco

    Il Progetto sul quale sto lavorando è totalmente diverso, ma il mio problema penso si possa risolvere basandomi su questo articolo, anche se non riesco ad iniziare. L’idea era quella di realizzare un braccio meccanico che potesse essere comandato in 3 diversi metodi premendo tre diversi pulsanti, ora mi spiego meglio.
    modo 1 : attraverso un comando bluetooth con smartphone
    modo 2 : attraverso dei potenziometri
    modo 3 : il braccio meccanico esegue sempre lo stesso movimento “all’infinito” (spostare un oggetto).
    Premetto che i tre sketch li ho già e funzionano separatamente. Il mio problema è questo dunque: come fare a dire ad Arduino che se premo un pulsante deve eseguirmi un certo sketch, se premo il secondo deve eseguire il secondo sketch e così anche per il terzo. Ovviamente bisognerà riassumere tutto in un solo sketch aggiungendo i pulsanti ecc. ma non so come fare.

    1. Mauro Alfieri

      Ciao Marco,
      hai ragione, non è molto inerente questo articolo.
      Puoi prendere il concetto di pulsanti e lettura degli stessi, anche se, avendo tu realizzato gli altri sketch dovresti avere abbastanza confidenza con la programmazione per fare quello che ti serve.
      Il modo migliore, a mio avviso è ridurre a funzioni i tre sketch che possiedi e richiamarli da una loop in funzione del pulsante premuto.

      1. Marco

        In che senso ridurre a funzioni?

        1. Mauro Alfieri

          Ciao Marco,
          intendo trasformare in funzioni i tre sketch e richiamarli dal loop()

Lascia un commento

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

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>