Libreria Buttons

Ciao Ragazzi/e !!

Qualcuno di voi ha già usato questa libreria??

http://www.arduino.cc/playground/Code/Buttons

Sapete darmi qualche info?? Devo far si che il mio programma riconosca la pressione del pulsante, e metta in attivo l'uscita per 20 ms, anche se il tasto resta premuto più a lungo, quale comando è giusto usare... e come??? :-[ Grazie!

Personalmente non ho usato questa libreria per cui non so come funzioni ma.... tu... cosa vuoi fare?

Dalla mia (breve per altro...) esperienza con Arduino mi sono accorto di due cose:

  • Arduino fa migliaia di operazioni al secondo
  • quando premiamo un pulsante, per quanto rapidamente, teniamo premuto il bottone per almeno 20 o 30 operazioni di Arduino

Per questo motivo, quando gli dai la lettura di un PIN al quale è collegato il bottone, se il programma nota che il bottone è stato premuto (è in HIGH) devi poi aspettare qualche millisecondo prima di fargli fare un'altra lettura.
Per me un valore buono sono 300ms.
A mio avviso per la maggior parte delle esigenze può andare bene così...

La libreria che hai postato (l'ho vista in un soffio per cui potrei sbagliarmi) ti da possibilità a livello di sottigliezze inerenti il bottone...

Devo far si che quando premo il pulsante, mi invii un impulso per 20 ms, anche se tengo premuto il tasto per un secondo. non posso però mettere un ritardo e basta nella lettura del segnale, in quanto, per capirsi, se premo la prima volta il bottone per 1/2 sec, lui invia il primo impulso di 20 ms, poi rilascio il bottone per un tempo ignoto ( potrebbe essere qualche ms come decine di secondi) e lo premo nuovamente pur un tempo più o meno lungo, ma lui deve sempre e solo inviare un impulso di 20 ms in output

il delay a mio avviso è sempre da evitare.
guarda questo esempio per vedere come si puo evitare l'uso di delay usando la funzione millis

@uccio beh, non c'è che dire... Non ci avevo pensato. Effettivamente l'esempio che hai postato sembra interessante.
L'avevo premesso che non ho molta esperienza no? ;D

@Fabry a questo punto, usando la funzione millis() ed usando l'esempio che ha linkato uccio, puoi risolvere il tuo problema.

risolvo in parte il problema... come si comporta il programma se mantego premuto per 5 secondi per esempio?? sarebbe sempre vero

millis() - time > debounce

e ad ogni ciclo del programma avrei un segnale in uscita...

se sbaglio correggetemi...

Attenzione a cosa c'è scritto:

if(reading == HIGH && previous == LOW && millis() - time > debounce)

ovvero:
se leggo che il pulsante è premuto e precedentemente non lo era ed è passato un tot di millisecondi...

quindi a occhio direi che la risposta è no perchè precedentemente il pulsante era premuto e quindi...

Hai perfettamente ragione.... perchè cambia lo stato dopo la prima attivazione :

// ... invert the output
if (state == HIGH)
state = LOW;
else
state = HIGH;

per invertire lo stato non basta:

state =! state;

??

non credo che gli operatori booleani (come il NOT) funziono sui valori HIGH e LOW.
ma comunque provare per credere

nel mio programma funziona