Arduino – Pulsanti programmabili

Vediamo come usare Arduino per una piccola applicazione domestica.
Il problema: comandare una tenda (SU e GIU) con un pulsante simile a quello della foto sotto,

La funzione richiesta va oltre il semplice click. E’ richiesto il supporto al singolo, doppio e triplo click:

singolo click: la tenda sale o scende per il tempo in cui il tasto è premuto;

doppio click: la tenda sale o scende per 10 secondi;

triplo click: la tenda sale o scende per un tempo maggiore, es:40 secondi, sufficienti a portarla tutta su o tutta giù.

Come fare?

Materiali: Uso Arduino 2009 ed il semplice ed economico shield che vedete sotto.

Questo shield si può trovare digitando su google (arduino keyes relays miniinthebox)

Lo shield contiene due relay da 10A, e si comanda in modo semplicissimo: un pin per l’alimentazione, un pin per ognuno dei due relay, uno per la massa

Sulla scheda inoltre esistono tre led smd. Uno indica l’alimentazione, e gli altri due l’attivazione di ognuno dei due relay.

Alle due morsettiere che vedete a destra, che corrispondono alle uscite dei relay, collego i cavi necessari a comandare la tenda. (o qualsiasi altro apparecchio, chiaramente. La tenda è solo un esempio applicativo).

Ecco lo sketch: Arduino - Sketch per pulsante programmabile. Modifica della libreria SimpleOneButton (1244) Nota: codice compilato con Arduino IDE ver. 1.0.1

La libreria Arduino OneButton Library supporta il doppio click e la pressione lunga del pulsante, ed il funzionamento è modellato dal seguente automa a stati finiti:

La libreria modificata ed usata in questo progetto invece supporta il singolo, il doppio ed il triplo click, ed il funziomento è modellato dall’automa seguente:

Il singolo click, in realtà, è implementato per mezzo dell’evento press() per il quale è stato impostato un “timeout” molto breve.

Per le spiegazioni riguardo il funzionamento rimando alla home page del progetto OneButton Library.

Questo è lo schema:

E qualche foto:

32 Replies to “Arduino – Pulsanti programmabili”

  1. Ciao, complimenti per il codice, molto funzionale, mi chiedevo una cosa.
    avrei necessità di utilizzare un pulsante per comandare salita e discesa, mi spiego meglio
    1 click veloce STOP
    1 click da 2 secondi APRI TENDA
    1 click da 4 secondi CHIUDI TENDA
    ho provato a fare qualche esperimento ma non trovo soluzioni decenti, sapresti venirmi in aiuto?

  2. Compliemnti Tonino, facile e direi…. intuitivo.
    c’e’ solo da raccapezzarsi un poco con le variabili, ma Veramente complimenti.
    Roberto

  3. Complimenti Tonino, volevo solo dirti che hai un’ottimo metodo di spiegazione, e che mi sono sorpreso su come possa essere facile ed intuitiva una programmazione con questo sitema.
    Sono un nuovo utilzzatore e anche grazie alle tue spiegazioni, mi sembra tutto fin troopo semplice.
    Grazie e continua cosi’

  4. Buonasera, se io volessi chiuderla a meta’.. ovvero do un impulso e lo tolgo dopo un tempo che non conosco, arduino puo’ calcolare il tempo del funzionamento del motore in discesa ed utilizzarlo per farla risalire, quinfi riportarla allo stesso punto? Saluti, Danilo

    • Empiricamente, si. Puoi solo basarti sui tempi.

  5. Ciao, una domanda…posso gestire con un unico arduino 2 tasti?
    Grazie

    • con due tasti intendo due tapparelle

    • Si, non è difficile.
      Basta modificare lo sketch raddoppiando le parti necessarie, ed ovviamente usando pin differenti!

      • Ciao Tonino, grazie per la risposta. Ho provato come da te consigliato, e tutto funziona, se non per questo:

        durante il doppio, o triplo click di un pulsante inteso come tapparella, non riesco ad effettuare lo stesso sull’altro. Posso solo azionarla manualmente ovvero tenendo premuto il pulsante.

        E’ come se l’evento doppio click, inibisse il funzionamento dell’altro.
        Grazie.

        • Ho provato a raddoppiare alcune parti dello sketch ma non funziona. Come faccio a far funzionare più tasti

  6. Ciao,
    vorrei capire come comandare con Arduino 4 Relay (FIN27018230) connessi ognuno a 2 pulsanti, per poter pilotare le luci di casa sia tramite i pulsanti che tramite Arduino. Se ho ben capit mi servirà un modulo 4 relay, la parte della tua guida per il singo
    lo click, ma non mi è chiaro come collegare il tutto al mio impianto di casa.
    Grazie Simone

    • Ciao Simone, il codice di cui si parla nell’articolo non va bene per le tue esigenze.
      Ti consiglio di dare un’occhiata a Souliss, che è un framework per la domotica che fa questo e molto altro.
      Dentro Souliss gli elementi che descrivono una funzione si chiamano TIPICI.
      Tu concentrati sul TIPICO 11, che è quello che gestisce un semplice interruttore.
      Puoi usare anche il solo Arduino e pochissime righe di codice.
      Se hai modo di aggiungere una scheda ethernet W5100 (le trovi a pochi euro su ebay) potrai usare anche la relativa App.
      Sbircia nella sezione DOMOTICA, li troverai le informazioni di cui hai bisogno.
      Fammi sapere, se ne hai bisogno possiamo preparare uno sketch per le tue esigenze.
      Tonino

      • Grazie Tonino, ma è corretto utilizzare un modulo 4 relay da collegare in parallelo ai miei pulsanti per pilotare le 4 luci, ognuna connessa ad un Relay passo passo a 3 connettori con la 220v (FIN27018230)?
        Vorrei potere comandare sia via software(arduino) che via hardware(pulsanti).
        Appena capito questo pensavo di comandare Arduino tramite comandi vocali con EasyVR.

        • Si potrebbe andare bene ma in questo caso i relè collegati ad Arduino devono dare l’impulso ai relè passo passo.

          Se ti interessa Souliss devi usare il Tipico 18.
          Trovi delle discussioni a riguardo qui: https://groups.google.com/forum/#!searchin/souliss/T18/souliss/8Gy5xsGJCpA/5a0G-WNTvZoJ
          Nell’immagine trovi lo schema di collegamento nell’ipotesi di utilizzo di un relè passo passo a doppio contatto. Il secondo contatto viene usato per dare il feedback ad Arduino sullo stato della luce (ON-OFF).
          In questo caso, come potrai leggere in qualche discussione, c’è il problema dei disturbi, perciò probabilmente dovrai inserire un filtro antidisturbo sulla linea 220 V nel pressi del relè.

          • Pensavo non si potesse sapere lo stato della luce (ON-OFF), così è ancora meglio. Scusa la mia ignoranza ma nel rele a doppio contatto VCC dove va connesso? I disturbi dove li ho esattamente, perchè pensavo di mettere ArduinoshieldRele distante dai miei rele passo passo.
            Ciao e grazie

  7. Ciao, complimenti ancora per la funzione. Funziona alla perfezione. Ho una domanda…
    Sto interfacciando il comando delle tapparelle anche da web. Il problema è che se il tasto non viene premuto, setti sempre i pin dei rele sempre a LOW (o HIGH).
    In questo se setto un pin ad HIGH, istantamente viene posto a LOW. Ci vorrebbe una condizione ulteriore in questo punto

    case STOP: // Tenda Ferma
    digitalWrite(UPPin, HIGH);
    digitalWrite(DOWNPin, HIGH);
    pressed=false;
    doubleClickFlag=false;

    che eviti l’uso esclusivo dei pin a questo case.

    Grazie.
    Gabriele

    • Ciao, alla fine ho risolto. Anche se volevo fare una piccola osservazione. Pilotare un motore per tapparelle non è banalissimo, o meglio bisogna porre attenzione al tempo con cui si commutano i sensi di marcia. In poche parole, i relè non devono commutare istantaneamente, poiché si innescano meccanismi che possono far incollare il contatto. Per evitare ciò tra lo spegnimento e l’accensione devono trascorrere almeno 300 ms (che ho risolto inserendo nel tuo codice degli interrupt sui pin 2 e 3). Detto questo..un’altro aspetto importante…la prevenzione della rottura di uno dei due relè che può far innescare l’avvio di una fase, e l’interazione dell’utente innescando il senso di marcia opposto può compromettere il motore stesso. Una soluzione è utilizzare i due relè in configurazione interblocco come in figura. Tale soluzione evita l’accensione contemporanea dei due sensi di marcia.
      Ciao.

      • Giusta la tua osservazione. L’inversione istantanea del senso di marcia si può ottenere dando il doppio o triplo click in un senso e poi il doppio o triplo click nel senso opposto. Sarebbe il caso di modificare lo sketch prevedendo sempre il passaggio dallo stop.
        Se ti va di mandarmi la tua modifica la pubblico.
        Per quanto riguarda lo schema…
        La soluzione che hai disegnato prevede che per F1 vengano attivati due relè contemporaneamente?
        C’è qualcosa che non mi torna.
        Non è meglio collegarli come nella foto sotto? In questo modo anche se in uno dei due relè si incolla il contatto l’altro non può partire.

        • Ciao, il realtà l’ho disegnato di fretta..

          Generalizzando…per descrivere lo scenario di motore spento, i relè dovrebbero trovarsi nello stato normalmente chiuso (relè non eccitati)

          Nel tuo caso su F2, se (1,3) è normalmente chiuso è ok.
          Su F1 se (4,6) è normalmente chiuso è ok, anche se per essere precisi, avrei usato come comune il pin 5 e non il 4 (cosi come per F2).

          Per quanto riguarda il codice, per me ok. Come posso contattarti in privato? Cosi evitiamo di inondare la bacheca di prove…magari si posta il codice definitivo.

  8. Ciao, ho provato il tuo codice, ma credo abbia un Bug. Al 12esimo click, il led rimane sempre acceso. Nessun’altra operazione è possibile. Probabilmente c’è qualche variabile che rimane spuria…riesci ad identificare il problema?

    Grazie,
    Gabriele

    • Lo sketch che ho pubblicato è lo stesso che ho caricato io sulla scheda che vedi nelle fotografie, e che uso senza alcuna sosta da novembre 2012.
      Prova a fare il debug, inserendo
      Serial.println(voltage);
      uno o più volte subito dopo le variabile delle quali vuoi eseguire il debug. Questo stamperà a video (nella finestra “Monitor Serial” dell’IDE Arduino) il valore della variabile da controllare.

      Succede sempre al 12° click?
      Sei sicuro che non sia un problema di alimentazione o di disturbi elettrici?
      Come hai eseguito il test?

      • Ciao Beppe, staserà proverò a “debuggare”. Considera inoltre che pa piattaforma è un Arduino UNO Rev3.
        Il test l’ho eseguito semplicemente effettuando una serie di singoli click.Ho fatto il test un paio di volte. E’ come se si freezasse l’esecuzione del codice.

        Ho provato a variare la sequenza dei click, per entrare nei diversi rami di codice…ma anche in questa situazione giocando un po con il bottone, il led va in HIGH e tutto si blocca.

      • Ciao Tonino,
        ho riprovato a fare il test. Con SINGOLO click, quindi nessuno dei casi da te gestiti, dopo il 13 click, il pin led rimane in stato HIGH (o LOW, dipende dalla configurazione scelta).
        Fare il debug per me diventa un problema..non conoscendo tutti gli statement, e quindi fare reverse engineering ….diventa ostico…puoi fare qualche prova?

    • RISOLTO!!! Stupidamente non mi ero accorto che il led era connesso al pin 13!! Grazie!! Hai fatto un ottimo lavoro!

  9. Ciao a tutti.

    ho seguito passo passo la guida e ho assemlbato il tutto, ma ho un problema che sinceramente non sono in grado di risolvere,

    i pin 3 e 4 si trovano in stato HIGH appena alimento , e se premo il pulsante passano in LOW eseguendo il programma, dovrei farlo funzionare al contrario.

    premetto che i pulsanti li ho collegati con il gnd, se uso la configurazione 5v/pulsante input/gnd i pin 3 e 4 passano in LOW ma non esegue il programma, cioe funziona la singola pressione fino al rilascio ma la doppia e la tripla non va.

    se qualcuno potesse aiutarmi.

    Grazie
    Saluti

    • Ciao.
      Hai provato ad eseguire il debug? Il “Monitor Seriale” dell’IDE può darti qualche indicazione sul funzionamento del codice.
      Noto adesso una piccola imprecisione nello schema. Non è stato disegnato il collegamento a GND dei pulsanti.
      Comunque c’è la possibilità di farli funzionare in entrambi i modi.
      Individua la parte di codice seguente:
      // Setup a new OneButton on pin A1.
      OneButton buttonUP(UPPinButton, true);
      OneButton buttonDOWN(DOWNPinButton, true);

      Se il secondo parametro della funzione è TRUE allora i pulsanti devono essere collegati a GND.
      Se invece è FALSE allora i pulsanti devono essere collegati a Vcc. (Si intende un pin ad arduino e l’altro a Vcc).

      I pin 3 e 4 vengono posti immediatamente a LOW da codice, perchè il sistema assume lo stato STOP. E’ strano che tu abbia lo stato HIGH.
      Facci sapere così ottieni dal debug.

      • Ciao grazie per la tempestiva risposta.

        Allora, io ho controllato la parte di codice e effetivamente come hai detto tu,
        cioe cosi:// Setup a new OneButton on pin A1.
        OneButton buttonUP(UPPinButton, true);
        OneButton buttonDOWN(DOWNPinButton, true);

        ma il problema per poco che ne capisco io non e nel codice, perche prima di assemblare il tutto l’ho provato su una breadboard con due mosfet e due motorini cc per simulare il movimento della tenda, e funziona perfettamente.

        secondo me e la scheda rele, nel momento in cui la alimento i pin 3 e 4 passano in HIGH come se prendessero tensione dall’alimentazione della scheda rele.

        Puo essere?……..

        io non sono molto avanti per quanto riguarda la programmazione, e se ti devo dire la verita non so nemmeno come si fa un Debug del programma.

        Come posso risolvere la cosa secondo te?

        Ciao e grazie

        Beppe

        • Qual’è la scheda relè? Hai qualche specifica?
          Io farei qualche prova andando per passi. Stacca la scheda relè ed assicurati, magari collegando al volo dei led, che Arduino funzioni a dovere anche nel montaggio finale.
          Fatto questo, prova la scheda relè da sola, senza alcun collegamento. Se separatamente funzionano bene allora il problema è nel collegamento, e dovrai trovare il modo di isolarli. Potresti avere bisogno di un paio di optoisolatori.

          • Ciao.
            ho controllato la scheda rele, che a prima vista e identica a quella usata da te, l’unica differenza che nelle specifiche ce scritto: 2 Channel 5V Low Level Trigger Relay Module for Arduino.

            Vuol dirre che si eccita con un basso livello cioe LOW e si diseccita quando lo stato passa ad HIGH ?

            Colpa mia non sono stato attento durante l’acquisto.

            Secondo te posso modificare la scheda rele? che so, escludendo i componenti e utilizzando un transistor per pilotare direttamente i rele?

            Comunque grazie, alla fine il codice e perfetto.

            Sono io che devo imparare.

            Ciao
            Beppe

          • Sicuramente la scheda eccita i relè quando l’ingresso è nello stato LOW,
            Se è così allora è semplicissimo, ti basta modificare il codice ed invertire qualche valore.

            Prendi il file: SimpleOneButton.ino

            Individua questa parte di codice:
            //movimentoTenda -> 0:STOP, 1: UP, 2: DOWN
            switch (movimentoTenda) {

            case STOP:

            case UP:

            case DOWN:

            INVERTI TUTTI I VALORI BOOLEANI DEI “CASE” CHE HO INDICATO
            dove trovi LOW LOW modifichi in HIGH HIGH,
            dove trovi HIGH, LOW modifichi in LOW, HIGH
            etc…

            Non ho provato, ma non dovrebbero essere necessarie altre modifiche.
            Tonino

          • Ciao Tonino

            sei un mago,ho eseguito le modifiche da te suggerite, e funziona alla perfezione.

            che dire , ti devo una birra, davvero grazie per la tua pazienza.

            io sono dalle parti di torino se ci fosse la possibilità te la offrirei volentieri.

            ciao
            Beppe

Lascia un commento

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

wp-puzzle.com logo