Chiarimento sui pulsanti

Ciao a tutti,
mi sto cimentando nei primi progetti, e dopo aver fatto alcuni giochetti con successo mi trovo, uscendo dal seminato, ad avere i primi dubbi.
Voglio fare un’applicazione in cui mi occorrono diversi pulsanti. Ho trovato lo schema per un singolo pulsante (schema “a” in figura, con una resistenza da 220ohm a proteggere il pin e una da 10kohm di pulldown), e per estensione l’ho applicato a due pulsanti (schema “b” in figura). Mi sono accorto però che non può funzionare, in quanto è evidente, dallo schema “c”, che premendo indifferentemente uno dei due pulsanti non si può sapere a quale pin stiamo dando tensione…

Chi mi illumina?

Per il momento mi rispondo da solo: le resistenze di pulldown devono essere una per pulsante. Giusto?

Se predisponi in Setup l'ingresso come pinMode(Pin, INPUT_PULLUP) hai il grande vantaggio di non avere bisogno di resistori esterni. Infatti, questo modo impone che l'ingresso digitale sia "pulled up" con un resistore da 20k interno ad Arduino.

L'unica accortezza è quella di far chiudere il pulsante verso massa (ground), anziché verso i +5V.

In pratica metti tutti i pulsanti con un capo verso massa e l'altro sull'ingresso digitale corrispondente.

Ovviamente il pulsante chiuso corrisponderà ad un LOW, mentre se aperto corrisponderà ad un HIGH.

Dai anche un’occhiata alle schede che trovi in ABC sotto Megatopic.
In una delle schede trovi come collegare quattro pulsanti ad un solo ingresso analogico.
E’ abbastanza semplice ed usi un solo pin.

@paulus, grazie, ho già letto qualcosa ma preferivo procedere per gradi, senza complicarmi troppo la vita. Anche se, a dire il vero, per il progetto che ho in mente avrei già finito gli ingressi digitali....

@cyberhs, grazie della soluzione. Una domanda: ci sono "controindicazioni"? Se non dovessi attivare per errore la resistenza di pull-up interna si rischia qualche cosa (a parte che non funzioni?). Scusate la bassezza degli argomenti, ma sono alle prime armi.

ci sono “controindicazioni”? Se non dovessi attivare per errore la resistenza di pull-up interna si rischia qualche cosa (a parte che non funzioni?).

Assolutamente no, anzi. E’ preferibile che un interruttore chiuda verso massa anziché verso i +5V: se per errore sbagli pin tutta la corrente possibile circola dai +5V nel circuito che hai chiuso.

Se il pin sbagliato è configurato come uscita digitale (che normalmente è LOW) si crea un cortocircuito, cosa che non succede se chiudi il circuito verso massa. Naturalmente, se il pin fosse in stato HIGH (ma devi averlo settato come tale, non ci va da solo!) ottieni anche in questo caso un corto.

Per risolvere il problema del rischio corto se si sbaglia pin, e' sempre buona norma mettere una resistenza anche in serie al pin (ed un condensatorino verso massa per eliminare i disturbi ed i rimbalzi ;) ) ... basta una resistenza da 470 ohm o simile, e se per sbaglio si chiude un pin HIGH a massa, ci passera' una corrente di una decina di mA, non sufficente a bruciarlo, mentre con un pull-up da 20K (o anche esterno da 10K), 470 ohm sono comunque piu che sufficenti per darti un livello LOW sull'ingresso ;)

470 non è un pò troppo? Forse una 220 basterebbe.

Si, avresti circa 20mA di corrente mandando a massa un'uscita, ma non dovrebbe comunque bruciarsi ... in ogni caso, anche 1K, con una pull-up di 20K, ti darebbe un LOW chiaramente leggibile ;)

Dovrò usare gli input analogici a cui connettere i miei 3 pulsanti e 3 microswitch a levetta. Posso seguire la stessa strada? A rigore di logica nell'input analogico non dovrei mettere una resistenza, perchè non farei altro che alzare la soglia di lettura, giusto?

Per la cronaca: il progetto mi "serve" per automatizzare il depuratore dell'acqua che ho in casa. I tre pulsanti mi servono per aumentare o diminuire il tempo di apertura delle elettrovalvole (e premendoli insieme per memorizzarlo nella eprom), nonchè per far partire l'erogazione. I microswitch per sentire la presenza delle tre bottiglie, infine ho un modulo con 4 relè (di cui ne userò 3) per azionare le valvole. Il display mi segna il tempo di erogazione. Il relè che mi avanza potrebbe essere usato per accendere la luce dello sgabuzzino, inserendo un contatto magnetico su un altro pin (ma questo è optional) Sono quindi a corto di ingressi e uscite, e sono costretto a mettere i pulsanti e i microswitch sugli ingressi analogici

Ma i pin analogici li vuoi usare come? Come ingressi analogici, appunto, o come ingressi digitali? Se devi collegarti degli switch, immagino li voglia usare come ingressi digitali perché a te servirà solo sapere se lo switch è attivato oppure no.

Sì, come ingressi digitali!

Scusa, se setti gli ingressi come digitali, non ci campioni una tensione, ci rilevi un uno o uno zero (high o low), quindi la resistenza ci va lo stesso ;) (o meglio, non e' che sia obbligatoria, ma se c'e' e' meglio)

Non se setto la resistenza di pullup interna, giusto? Ho letto in qualche post che anche i pin analogici hanno la possibilità di averla impostata, con digitalwrite (npin, HIGH);

Ieri comunque facendo u po' di prove (e dimenticandomi di impostare la resistenza di pullup....) tutto il mio precedente sketch non funzionava! Solo stamattina ho avuto "l'illuminazione": quando imposto i pulsanti in quella maniera (utilizzando la resistenza di pullup e collegandoli alla massa) devo invertire il funzionamento del programma: quando prima era HIGH metto LOW e viceversa. Spero di non aver fatto danni, proverò stasera. Uno dei punti che mi preoccupano è che, alla pressione di entrambi i pulsanti, lo sketch mi andava a memorizzare nella eprom il tempo che avevo impostato (con un delay di 1000 msec subito dopo la lettura). Avendo messo i pulsanti in pullup ho visto che il display era impazzito e segnava tempi a caso, e la lettura della eprom non mi segnava più quello che avevo memorizzato, ovvero ho riscritto la eprom non so quante volte. Spero che il delay abbia funzionato e mi abbia salvato, altrimenti in quei pochi minuti che l'ho tenuto attaccato ho riscritto la eprom qualche centinaio di migliaio di volte.....