Contatore pressioni per progetto lettore mp3

Buongiorno a tutti,

in questi giorno sto armeggiando con la schedina DFPlayerMP3, la quale devo dire è ben fatta e non mi aspettavo di poter gestirla così facilmente.

Siccome volevo integrarla in una cassa volevo ipotizzare una gestione ad un'unico pulsante. Questo complica sicuramente la logica.

Ipotesi 1:
una sola pressione comporta il comando di pausa/ripresa suono
due pressioni comporta avanzamento di un brano
tre pressioni indietro di un brano

Ipotesi 2:
pressione breve (minore di 1 secondo) comporta il comando di pausa/ripresa suono
pressione media (tra 1 secondo e 2 secondi) comporta avanzamento brani
pressione lunga (sopra i due secondi) comporta il ritorno al brano precedente.

Attualmente sto seguendo quest'ultima, dove però mi sembra instabile come controllo e temo di sbagliare qualcosa a livello di programmazione:

canzone_avanti_indietro è un input pull up,
durata impulso è una variabile di tipo unsigned long

durata_impulso = pulseIn(canzone_avanti_indietro,LOW);
  

  if (durata_impulso > 0) {

    if (durata_impulso < 1000) {             
      if (start_pause == true) {
        myDFPlayer.pause();
      }
      if (start_pause == false) {
        myDFPlayer.start();
      }
      start_pause = !start_pause;
    }
    
    if ((durata_impulso > 1000) && (durata_impulso < 2000)) {
      canzone_random();
    }
    
    if (durata_impulso > 2000) {
      myDFPlayer.play(numero_canzone_old);
    }

    durata_impulso = 0;
    delay(20);
  }

Sapreste aiutarmi?

Prova cosi:

void handleProgButton(){
  if(digitalRead(Prog) == LOW){
    //delay(20);
    uint8_t eventType= 0;
    while(digitalRead(Prog) == LOW){    
      uint32_t pTime = millis() - pressTime;
      if(pTime > SHORT && pTime <= MEDIUM)
        eventType= 1;
      else if (pTime > MEDIUM && pTime <= LONG)
        eventType= 2;  
      else if (pTime > LONG){
        eventType= 3; 
        break;
      }
    }
    switch(eventType){
      case 0: break;
      case 1: shortClick();  break;
      case 2: mediumClick();  break;
      case 3: longClick(); delay(500); break;
    }
  }  
}



e dove ti serve:

// Gestione del pulsante di programmazione
  pressTime = millis();
  handleProgButton();

Datman:
Non dovrebbe essere così?

In questo modo devi necessariamente rilasciare il pulsante per valutare lo switch/case successivo quindi l'utente deve in qualche modo "contare/valutare" il tempo trascorso per distinguere gli eventi.
Io ho usato questa funzione per entrare in un menu di configurazione e impostare alcune variabili avendo disponibile un unico tasto.
Se la pressione è prolungata, viene interrotto immediatamente il ciclo while e richiamata la funzione associata. Avendo un "feedback" dal sistema immediato (con un display LCD in particolare) risultava più "user friendly" .

Sì, è vero, infatti ho cancellato il messaggio appena ho riletto il programma dopo aver copiato la parte mettendo le parentesi allineate tra loro. Possiamo eliminare queste due ultime risposte.

max95:
Ipotesi 2:
pressione breve (minore di 1 secondo) comporta il comando di pausa/ripresa suono
pressione media (tra 1 secondo e 2 secondi) comporta avanzamento brani
pressione lunga (sopra i due secondi) comporta il ritorno al brano precedente.
Attualmente sto seguendo quest'ultima

Personalmente un'interfaccia che costringa a contare mentalmente il tempo trascorso la trovo scomodissima. Voto per: 1click 2click 3click longPress. Quattro comandi che non richiedono di contare, i primi tre sono azioni dirette, per il quarto basta aspettare.

Crei una funzione che legge il pulsante e valorizza quattro variabili a seconda degli eventi (esempio 'clic1' 'clic2' 'clic3' 'lpress'), e poi usi queste variabili come comandi per la restante logica, if (clic1)... ecc. O in alternativa come indicato da cotestatnt valorizzi una sola variabile con cinque diversi valori-evento (che comprendono anche il nessun evento).

Scindere la logica di lettura del pulsante da quella esecutiva semplifica molto, perché entrambe le parti si occupano solo di quello che devono fare, e sono più semplici da comprendere e modificare. Per dire, potresti passare a due o tre pulsanti senza minimamente modificare la parte esecutiva, o potresti modificare la parte esecutiva senza minimamente preoccuparti della lettura del/dei pulsante/i.