Azioni in base al tempo(pressione tasto)

ciao, vorrei eseguire determinate funzioni in base al tempo che intercorre tra il primo click e il secondo, ad esempio se clicco due volte il pulsante in meno di mezzo secondo esegue una funzione...
Mi sapreste dire come posso farlo con delle semplici funzioni?

Ivan2000:
Mi sapreste dire come posso farlo con delle semplici funzioni?

NON esistono funzioni già fatte e pronte all'uso ... te le devi scrivere tu ... oltre, naturalmemte, a fare un po' di ricerche qui sul forum e su Google, dato che sicuramente è argomento già discusso.

Comunque, di sicuro, devi studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che applicando correttamente i concetti imparati puoi risolvere facilmente :wink:

Guglielmo

ah scusami mi sono espresso male…non volevo dire funzioni…cmq grazie!

Potresti partire da un vecchio esempio che avevo postato tempo fa, per fare due operazioni diverse con pressione del tasto i piu o meno di mezzo secondo (modificabile a piacere)

// Esempio per diverse operazioni con pressioni di durata diversa (piu o meno 
// di mezzo secondo, in questo esempio, ma puo essere qualsiasi intervallo di tempo)
// Ovviamente, in questo caso le operazioni sono eseguite solo al rilascio del tasto

   st = digitalRead(pin)	 //leggi ingresso pulsante
   if ((st != stp) && (stp == 0)) // pulsante appena premuto
   {
      stp = st; 	//setta flag per pulsante premuto
      millis_p = millis();	//setta variabile controllo tempo
   }
   if ((st != stp) && (stp == 1)) //pulsante appena rilasciato
   {
      stp = st; 	//resetta flag per pulsante rilasciato
      if (millis() - millis_prec <= 500) //pulsante premuto per meno di mezzo secondo
      {
      //qui ci vanno tutte le operazioni da compiere al RILASCIO del tasto, 
      //UNA SOLA VOLTA, se il tasto e' rimasto premuto per meno di 500mS
      }
      else
      {
      //qui vanno tutte le operazioni da compiere al RILASCIO del tasto, 
      //UNA SOLA VOLTA, se il tasto e' rimasto premuto per piu di 500mS
      }
   }

Non fa quello che vuoi tu (se ti postassi il codice gia fatto, Guglielmo mi bacchetterebbe :smiley: … ma questo l’avevo gia postato comunque) … pero’ puoi prendere esempio da alcune delle sue parti, ad esempio il come bloccare la lettura ripetitiva dell’ingresso da parte del loop fino al rilascio mediante una flag, e cosi via … e da qui, sapendo che per fare quello che vuoi tu serve un doppio controllo, e che anche l’azione legata alla pressione singola dovra’ essere per forza ritardata del massimo intervallo accettabile per il doppio click (altrimenti il tuo sketch non sarebbe in grado di distinguere un click singolo da uno doppio), svilupparti un codice che faccia quello che vuoi … :wink:

Due domande,

  1. La funzione millis_prec if (millis() - millis_prec <= 500) è la funzione millis_p?
  2. Posso usare questa funzione in un ISR?
    Grazie mille
  1. millis_prec NON è una funzione, ma una variabile

  2. NO, nelle ISR la millis() NON funziona, oltre al fatto che una ISR deve essere la più breve possibile (es. settare una flag per indicare l’interrupt e uscire subito, o incrementare una variabile e uscire, ecc.)

Dal reference:

Generally, an ISR should be as short and fast as possible. If your sketch uses multiple ISRs, only one can run at a time, other interrupts will be executed after the current one finishes in an order that depends on the priority they have. millis() relies on interrupts to count, so it will never increment inside an ISR. Since delay() requires interrupts to work, it will not work if called inside an ISR. micros() works initially, but will start behaving erratically after 1-2 ms.

Guglielmo