Libreria Arduino anti rimbalzo

Salve 🙂
Questo è il primo articolo che scrivo qui su overpowered!

Presento una libreria che ho scritto in qualche giorno piovoso, serve ad evitare il rimbalzo del segnale elettrico tramite software, e contiene anche una piccola utility per gestire il multi-task su Arduino.

Citando Wikipedia:

Il circuito anti-rimbalzo viene utilizzato in elettronica per produrre un solo impulso stabile in presenza di un ingresso che risulti elettricamente rumoroso.
L’origine dei suddetti disturbi in presenza di pulsanti o interruttori è dovuta al fatto che la lamina di contatto non garantisce, una volta commutata, un impulso immediatamente stabile.

Come si usa ?

Prima di tutto aggiungiamo la libreria tra quelle di Arduino (download a fondo pagina), inserendola nella cartella libraries, es: C:\Program Files (x86)\Arduino\libraries\.

Dopo di che la includiamo nel nostro sketch aggiungendola all’inizio del file

Vediamo le funzionalità

Inizializzazione

Il primo argomento indica il Pin digitale a cui è collegato il pulsante.
Il secondo indica lo stato di attivazione, se attivo basso (FALSE / LOW) o attivo alto (TRUE / HIGH).
Le uscite digitali vengono automaticamente configurate non è necessario altro codice.

Gestire i Click

L’attesa di base è impostata su 10 millisecondi, sufficienti per pulsanti a membrana, mentre per quelli a lamelle consiglierei di impostarli attorno ai 150 ms.

Il secondo parametro, anche questo opzionale, serve a gestire più istanze di click per lo stesso pulsante, ad esempio se volessimo due trigger separati sia su 100 ms che su 500 ms di pressione.

Esempio

NOTA: il singolo click viene attivato sul fronte di pressione! Se necessiti del fronde di rilascio vedi la funzione Keep, la quale ha un doppio utilizzo.

Il Doppio Click

Anche gestire il doppio click con Arduino sarà molto semplice, è sufficiente utilizzare questa funzionalità, gli argomenti possono essere anche trascurati come detto precedentemente

first = tempo pressione minima del primo click
second = tempo pressione minima del secondo click
i = multi istanza per gestire più eventi
sep = tempo di attesa massimo dopo il primo click, se viene superato, l’evento si annulla

Esempio

Mantieni Premuto

Questa funzione a differenza delle altre non ritorna VERO o FALSO, ma un intero che indica il tempo trascorso, se returnwhileactive è impostata su TRUE la funzione ritorna il tempo di pressione ad ogni chiamata mentre il pulsante è ancora premuto, in ogni caso quando viene rilasciato verrà restituito il tempo di pressione totale.
Se ad esempio la soglia minima, come in questo caso di 1000 ms, ed il pulsante viene premuto per 5 secondi, come valore di ritorno avremo >= 5000 e verrà eseguito il codice all’interno della condizione. Se il tempo di pressione minimo non viene superato l’evento non si attiva nemmeno con returnwhileactive su TRUE.

Esempio

Nel secondo caso, ‘t’ viene reimpostata continuamente

Aspetta aspetta! – Gestiamo il ‘multi-task’

Molte volte la funzione delay() di base è un ostacolo, infatti se abbiamo necessità di svolgere azioni con tempistiche diverse dobbiamo adottare altre soluzioni.

La funzione Wait permette di eseguire determinate azioni solo una volta ogni X millisecondi, senza bloccare il ciclo di istruzioni,
potremmo definirlo una specie di multi-tasking agricolo 😄

Esempio

 

Se ad esempio abbiamo bisogno di aggiornare l’LCD il quale non può essere aggiornato più di 6~7 volte al secondo, e gestire altri input/output con maggiore frequenza, questa funzionalità diventa indispensabile!

Ecco lo sketch di esempio pronto da testare

Attenzione!

Ricorda che…

I Pin digitali impostati come ingressi, se non collegati entrano in uno stato di floating, cioè commutano da 0 a 1 in continuazione!
È quindi necessario utilizzare una resistenza di pull down!

Se il pulsante è ATTIVO BASSO, è possibile usufruire della resistenza di pullUP interna del microcontrollore, disponibile dalla versione 1.4 di TPush. In questa modalità non è possibile utilizzare il pin 13! Documentazione.

Download

TPush
TPush
TPush 1.5.zip
Version: 1.5
3.6 KiB
815 Downloads
Dettagli

Alla prossima!

Potrebbero interessarti anche...

  • Franco

    Faccio i complimenti per la libreria, semplice e ben spiegata. Chiedo se è possibile utilizzarla con più pulsanti (2, 3, 4 ..)

    • Certo, puoi utilizzare tutti i pulsanti che vuoi, basta dichiarare nuove variabili:

      • Franco

        Ringrazio per la risposta, avevo utilizzato lo stesso sistema, non riesco a farla funzionare, sicuramente sbaglio qualche cosa. Ti chiedo se puoi scrivere il resto per accendere tre led con la pressione dei rispettivi pulsanti. Ti ringrazio tanto.

        • Ciao, ho fatto e testato questo sketch, funziona

          Mi sono accorto solo ora che pinMode INPUT non era presente di base nella libreria ma andava impostato nello sketch, ora l’ho aggiornata, puoi scaricarla nuovamente (altrimenti imposta il pinMode come sopra).

          Utilizzi Arduino UNO o altro? Ho notato che sul Nano v3 (non originale) vengono attivati i click all’avvio del micro controllore, mentre nella scheda originale non accade.

          • Franco

            Non impostavo pinMode INPUT,domani provo. Utilizzo ArduinoUno comp Sparkfun

          • Franco

            Ho provato il programma, niente, non vuole funzionare. Con il singolo pulsante tutto regolare, con due non funziona.
            IDE: 1.6.1
            Scheda Sparkfun Arduino Uno compatibile
            Lunedì provo con la scheda originale
            La ringrazio per l’attenzione e la collaborazione

          • Ciao Franco, ho rivisto e corretto la libreria! Puoi scaricarla nuovamente ora funziona senza problemi.
            Ti ringrazio per la segnalazione!

          • Franco

            Adesso funziona, gestisce senza problemi quattro pulsanti
            Ancora Grazi e complimenti.
            Questo il programma completo
            // Controllo 4 pulsanti e 4 LED con libreria antiribalzo

            #include
            TriggerButton pulsante1, pulsante2, pulsante3, pulsante4;
            int ledverde = 8;
            int ledgiallo = 9;
            int ledrosso = 10;
            int ledblu = 11;
            int tempo=70; // tempo antirimbalzo 70 ms
            void setup()
            {
            // Impostazione pulsanti sui pin 2, 3, 4 e 5 (attivi bassi)
            pulsante1.setUp(2, LOW);
            pulsante2.setUp(3, LOW);
            pulsante3.setUp(4, LOW);
            pulsante4.setUp(5, LOW);
            pinMode(ledverde, OUTPUT);
            pinMode(ledgiallo, OUTPUT);
            pinMode(ledrosso, OUTPUT);
            pinMode(ledblu, OUTPUT);
            }
            void loop()
            {
            if (pulsante1.Click(tempo))
            {
            digitalWrite(ledverde, !digitalRead(ledverde));
            }
            if (pulsante2.Click(tempo))
            {
            digitalWrite(ledgiallo, !digitalRead(ledgiallo));
            }
            if (pulsante3.Click(tempo))
            {
            digitalWrite(ledrosso, !digitalRead(ledrosso));
            }
            if ( pulsante4.Click(tempo))
            {
            digitalWrite(ledblu, !digitalRead(ledblu));
            }
            }

  • Davide Raimondi

    ciao, sto cercando di imparare ad usare questa libreria ma sto incontrando alcune difficoltà. non riesco ad utilizzare Double.click.
    Praticamente ho provato, con un click si accende il led, con un altro click s spegne e con un doppio click dovrebbe lampeggiare. ma non mi funziona. Riusciresti a farmi vedere come dovrebbe essere il codice? grazie
    ps: sono un novellino in questo ambiente

    • Ciao, prova così: http://codepaste.net/py4rez, provato con circuito 🙂

      Ho aggiornato la libreria alla versione 1.5 avevo trovato un bug (quando si premeva velocemente e ripetutamente il pulsante) consiglio di scaricare la nuova rev

      fammi sapere se è tutto ok! 😉

      • Davide Raimondi

        provo grazie mille.
        non funziona, cioè funziona male.
        si accende anche se premo una sola volta e si spegne un po come gli pare.

        • Ci sono un bel po’ di errori..

          Le variabili ‘val’ e ‘lamp’ devono essere di tipo bool non int o short.

          vuole come parametro il PIN, comparando val con HIGH ottieni solo true/false.
          https://www.arduino.cc/en/Reference/DigitalRead

          Non hai bisogno del timer per far lampeggiare il led puoi usare Button1.wait(100); // 100 millisecondi
          Come nell’esempio che ti ho fatto, prova a caricarlo

          • Davide Raimondi

            grazie provo, ma non capisco cosa sia doubleTap e come funzioni.

          • È la variabile vero/falso dove indico se attivare il lampeggio del led o disattivarlo, l’ho rinominata per far si che si capisca meglio, ricontrolla sempre dal link di codepase

            Questo vuol dire: Imposta lo stato su VERO se prima era FALSO (e viceversa (Imposta lo stato su FALSO se prima era VERO), sarebbe l’operazione booleana NOT, una commutazione.

            Nota che è importante che dentro la condizione di if (Btn1.DoubleClick()) il led sia impostato a seconda dello stato (come nell’esempio che ho linkato precedentemente) per far si che non rimanga sempre acceso in caso si voglia disattivare il lampeggio .

            Nel caso in cui AbilitaLampeggio sia VERO (quindi il led deve lampeggiare) ed OGNI 100ms, COMMUTO lo stato del led.

            In realtà è più facile di quello che sembra, spero di essermi spiegato 🙂

          • Davide Raimondi

            Scusa ma nel commento sotto di Franco usa la libreria triggerButton…ma da dove l’ha presa ? È sempre la stessa?

          • Sìsì era il nome vecchio, l’ho rinominata

          • Davide Raimondi

            ah ok grazie mille per la disponibilità sto cercando di imparare il + possibile.
            provo e ti dico.

      • Davide Raimondi

        questo il mio sketch. non riesco a farlo spegnere dopo che lamppeggia, continua a lampeggiare senza sosta.

        #include

        #include

        TPush Button1;

        int led=13;

        int val= LOW;

        int cont=0;

        short lamp=false;

        void setup() {

        // Button1 è posizionato sul pin 2 ed è attivo basso

        Button1.setUp(2, LOW);

        Timer1.initialize(100000); //scatta ogni 100ms

        Timer1.attachInterrupt (lampeggio);

        Serial.begin(9600);

        pinMode(led, OUTPUT);

        }

        void loop() {

        if (Button1.DoubleClick()){

        lamp=true;

        Serial.println(“lampaggio Led 1 sec”);

        }

        val=digitalRead(led);

        if (Button1.Click()) {

        Serial.println(“Button1 Pressed!”);

        digitalWrite(led, !val);

        if (digitalRead(val==HIGH)){

        Serial.println(“Led Acceso”);

        }

        else {

        Serial.println(“Led Spento”);

        cont=0;

        }

        }

        }

        void lampeggio(){

        if(lamp==true){

        cont=cont+1; //conto fino a 10 e accendo il led

        if(cont==10){

        digitalWrite(led,HIGH);

        cont=0;

        }

        else{

        digitalWrite(led,LOW);

        }

        }

        }

  • matteo piras

    ciao,dove posso scaricare la libreria ” #include ”
    grazie

    • Ciao, puoi scaricarla dal fondo dell’articolo, praticamente TPush è triggerbutton, ho solo rinominato la libreria.
      purtroppo ho creato un po’ di confusione

  • Mauro

    Ottima libreria! Mi ha risolto un sacco di problemi.

  • Mauro

    Ciao, funziona tutto ma non mi è chiaro

    if (t = Button1.KeepHold(1000))

    che il compilatore di segnala warning, dato che per il confronto if si dovrebbe usare == e non = che è di assegnazione. Ma se uso == non funziona più

    • Ciao, sì infatti è proprio una assegnazione, sarebbe come scrivere

      t viene impostata sul valore di ritorno della funziona KeepHold, poi viene controllato se quel valore è diverso da 0

      • Mauro

        Grazie! Gentilissimo!