Cambio di cartella DFPlayer

Salve a tutti, sono qui per chiedere aiuto riguardo un Arduino Uno e un modulo mp3 Df Player
L’esigenza è quella di avere 4 tasti… Play/Pausa - Avanti - Dietro - Cambio cartella Mp3
Per quanto riguarda i primi tre tasti, non c’è problema. Per quanto riguarda il salto di cartella sto avendo qualche problema. Nella SD ci sono 21Cartelle (Pari alle lettere dell’alfabeto) e allineano di ogni cartella sono una serie di file MP3. io vorrei che non appena venisse alimentato partisse in automatico dalla cartella 01 e riproducesse il primo brano (esattamente come fa adesso) pero premendo il tasto buttomFolder andasse in riproduzione il primo file della cartella 02 e cosi via.
Potreste aiutarmi?

p.s. Nel codice in allegato, funziona tutto tranne il folderButton
approfitto per dire che sono una capra nella programmazione :slight_smile:

Allego il codice e foto di collegamento

#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

# define ACTIVATED LOW

int buttonNext = 2;
int buttonPause = 3;
int buttonPrevious = 4;
int buttonFolder = 5;
boolean isPlaying = false;



void setup () {

pinMode(buttonPause, INPUT);
digitalWrite(buttonPause,HIGH);
pinMode(buttonNext, INPUT);
digitalWrite(buttonNext,HIGH);
pinMode(buttonPrevious, INPUT);
digitalWrite(buttonPrevious,HIGH);
pinMode(buttonFolder, INPUT);
digitalWrite(buttonFolder,HIGH);

mySerial.begin (9600);
delay(1000);
playFirst();
isPlaying = true;


}



void loop () { 

 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      pause();
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play();
    }
  }


 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      playNext();
    }
  }

   if (digitalRead(buttonPrevious) == ACTIVATED)
  {
    if(isPlaying)
    {
      playPrevious();
    }
  }
    if (digitalRead(buttonFolder) == ACTIVATED)
  {
    if(isPlaying)
    {
      folderNext();
    }
  }
}

void playFirst()
{
  execute_CMD(0x3F, 0, 0);
  delay(500);
  setVolume(20);
  delay(500);
  execute_CMD(0x11,0,1); 
  delay(500);
}

void pause()
{
  execute_CMD(0x0E,0,0);
  delay(500);
}

void play()
{
  execute_CMD(0x0D,0,1); 
  delay(500);
}

void playNext()
{
  execute_CMD(0x01,0,1);
  delay(500);
}

void playPrevious()
{
  execute_CMD(0x02,0,1);
  delay(500);
}

void folderNext()
{
  execute_CMD(0x0F,0,10);
  delay(1000);
}

void setVolume(int volume)
{
  execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
  delay(2000);
}

void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}

Ciao in un altro tuo thread ti avevano proposto un ottima libreria! Esistono diverse librerie alcune permettono di fare alcune cose altre no.

Nella libreria che ti hanno proposto era presente il comando

myDFPlayer.playFolder(15, 4); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)

Bisogna chiamare le cartelle con nomi numerici esempio cartella 15, e anche i file con nomi numerici, esempio 4.mp3.

Poi basta specificare la cartella e il numero file, adesso se al posto del numero usiamo una variabile

myDFPlayer.playFolder(variabileCartella, variabileFile);

Per passare a una cartella alla pressione di un pulsante, incremento la variabile e scrivo questa riga di programma.

Esempio:

int variabileCartella=1;
int variabileFile=1;

void loop(){

    if(pulsante premuto){ // Ad ogni pressione del pulsante eseguo il primo file della nuova cartella
     
          variabileCartella++; //incremento di uno
          
          if(variabileCartella>numeroMassimoCartelle)
               variabileCartella=1; // Se ho raggiunto il numero massimo cartelle torno alla prima
     
          variabileFile=1; // eseguo il primo file
          myDFPlayer.playFolder(variabileCartella, variabileFile); 
    }

}

Questa è la libreria
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299

Questi sono i comandi disponibili

//----Mp3 play----
myDFPlayer.next(); //Play next mp3
delay(1000);
myDFPlayer.previous(); //Play previous mp3
delay(1000);
myDFPlayer.play(1); //Play the first mp3
delay(1000);
myDFPlayer.loop(1); //Loop the first mp3
delay(1000);
myDFPlayer.pause(); //pause the mp3
delay(1000);
myDFPlayer.start(); //start the mp3 from the pause
delay(1000);
myDFPlayer.playFolder(15, 4); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
delay(1000);
myDFPlayer.enableLoopAll(); //loop all mp3 files.
delay(1000);
myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
delay(1000);
myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
delay(1000);
myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
delay(1000);
myDFPlayer.stopAdvertise(); //stop advertise
delay(1000);
myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
delay(1000);
myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
delay(1000);
myDFPlayer.randomAll(); //Random play all the mp3.
delay(1000);
myDFPlayer.enableLoop(); //enable loop.
delay(1000);
myDFPlayer.disableLoop(); //disable loop.

Probabilmente ci saranno errori e quindi sarà da correggere, ma il programma lo pensavo a qualcosa del genere…

DA CORREGGERE… Solo come esempio da dove partire :slight_smile: Pulsanti in pullUP

Non ho mai usato questa libreria e quindi non so come si comporta e che problemi possono insorgere :wink:

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define MAXCARTELLA 15 //Numero massimo cartelle
#define MAXFILE 10  //Numero massimo file in cartella
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int buttonNext = 2;
int buttonPause = 3;
int buttonPrevious = 4;
int buttonFolder = 5;
int variabileCartella = 1;
int variabileFile = 1;

void setup()
{
  mySoftwareSerial.begin(9600);


  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.

    while (true);// Se ci sono problemi nella connessione si blocca il programma
  }


  myDFPlayer.volume(10);  //Set volume value. From 0 to 30

  pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause, HIGH);
  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext, HIGH);
  pinMode(buttonPrevious, INPUT);
  digitalWrite(buttonPrevious, HIGH);
  pinMode(buttonFolder, INPUT);
  digitalWrite(buttonFolder, HIGH);

}

void loop() {

  if (digitalRead(buttonNext) == LOW) {

    variabileFile++;
    if (variabileFile > MAXFILE)variabileFile = 1; // Se supero il numero massimo di file torno al primo
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  } else if (digitalRead(buttonPrevious) == LOW) {
    variabileFile--;
    if (variabileFile < 1)variabileFile = MAXFILE; // Se arrivo al primo fole ricomincio dall ultimo
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  } else if (buttonPause) == LOW) {
    myDFPlayer.pause();  //pause the mp3
  } else if (digitalRead(buttonFolder) == LOW) {

    variabileCartella++;
    if (variabileCartella > MAXCARTELLA)variabileCartella = 1;
    variabileFile = 1;
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  }
  
  delay(200);

}

Per vedere il numero di file in una Carella posso usare:
Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

Sapresti dirmi come faccio a leggere dove sta riproducendo?

torn24:
Probabilmente ci saranno errori e quindi sarà da correggere, ma il programma lo pensavo a qualcosa del genere…

DA CORREGGERE… Solo come esempio da dove partire :slight_smile: Pulsanti in pullUP

Non ho mai usato questa libreria e quindi non so come si comporta e che problemi possono insorgere :wink:

#include "Arduino.h"

#include “SoftwareSerial.h”
#include “DFRobotDFPlayerMini.h”
#define MAXCARTELLA 15 //Numero massimo cartelle
#define MAXFILE 10  //Numero massimo file in cartella
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int buttonNext = 2;
int buttonPause = 3;
int buttonPrevious = 4;
int buttonFolder = 5;
int variabileCartella = 1;
int variabileFile = 1;

void setup()
{
  mySoftwareSerial.begin(9600);

if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.

while (true);// Se ci sono problemi nella connessione si blocca il programma
  }

myDFPlayer.volume(10);  //Set volume value. From 0 to 30

pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause, HIGH);
  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext, HIGH);
  pinMode(buttonPrevious, INPUT);
  digitalWrite(buttonPrevious, HIGH);
  pinMode(buttonFolder, INPUT);
  digitalWrite(buttonFolder, HIGH);

}

void loop() {

if (digitalRead(buttonNext) == LOW) {

variabileFile++;
    if (variabileFile > MAXFILE)variabileFile = 1; // Se supero il numero massimo di file torno al primo
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  } else if (digitalRead(buttonPrevious) == LOW) {
    variabileFile–;
    if (variabileFile < 1)variabileFile = MAXFILE; // Se arrivo al primo fole ricomincio dall ultimo
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  } else if (buttonPause) == LOW) {
    myDFPlayer.pause();  //pause the mp3
  } else if (digitalRead(buttonFolder) == LOW) {

variabileCartella++;
    if (variabileCartella > MAXCARTELLA)variabileCartella = 1;
    variabileFile = 1;
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  }
 
  delay(200);

}

Un minimo di programmazione bisogna conoscerlo altrimenti è difficile capire e o modificare un programma! Ho letto che studi C++ quindi non dovresti avere problemi

Se io ho una variabile variabileFile e la uso per riprodurre un file, in automatico so che il numero di file che sto riproducendo è il valore della variabile.

Se la varibabileFile=3 o qualunque altro valore, è quello il file che sto riproducendo. :wink:

Potrei per esempio stampare sul monitor seriale il valore della variabile. Serial.println(variabileFile);
E nello stesso modo la cartella che sto usando.

Il valore delle variabili, sono la cartella in uso e il file in riproduzione.

chiedevo la questione variabile perché in realtà i file all'interno della sd verranno cambiato spesso, quindi in numero di file non è fisso e quindi vorrei che contasse i file che ci sono all'interno delle cartelle ed il numero delle cartelle...... Non so se sono chiaro

torn24:
Un minimo di programmazione bisogna conoscerlo altrimenti è difficile capire e o modificare un programma!

Se io ho una variabile variabileFile e la uso per riprodurre un file, in automatico so che il numero di file che sto riproducendo è il valore della variabile.

Se la varibabileFile=3 o qualunque altro valore, è quello il file che sto riproducendo. :wink:

Potrei per esempio stampare sul monitor seriale il valore della variabile. Serial.println(variabileFile);

Più autonomia diamo al programma più diventa complicato!
Usando un numero fisso di cartelle e uno stesso numero massimo di file è tutto abbastanza semplice, come hai visto.

Adesso su un numero variabile di file, mi viene in mente di usare un array con elementi pari al numero cartelle, nella funzione setup() andiamo a leggere il numero file in ogni cartella e lo salviamo nell'array.

A questo punto nel programma quando abbiamo bisogno di sapere il numero massimo di file, non useremo più costanti ma i valori presenti nell'array.

Una cosa del genere...

if (digitalRead(buttonNext) == LOW) {// L'array parte da indice 0 le cartelle da 1, per cui cartelle-1 indice array

    variabileFile++;
    if (variabileFile > arrayFile[variabileCartella-1])variabileFile = 1; // Se supero il numero massimo di file torno al primo
    myDFPlayer.playFolder(variabileCartella, variabileFile);
    myDFPlayer.start();  //start the mp3 from the pause
  }

A te implementare il tutto... :slight_smile:

nella libreria del lettore ci sono queste stringhe di lettura....

Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

dovrebbe leggere il numero di file allieterno di una cartella...

quidi sapendo che le cartello. sono 21......

dove posso inserire la stringa in modo che mi conti il numero di file nella cartella stessa?

A parte errori, a parte che non sappiamo che tipo restituisce il metodo in questione, lo schema logico
che ti avevo proposto era di questo tipo. La logica va bene il programma potrebbe avere bisogno di CORREZZIONI!

int arrayFile[21]={0};

void setup(){ //All'accensione del dispositivo

    for(int i=0;i<21;i++){

        arrayFile[i]=myDFPlayer.readFileCountsInFolder(i+1); // Le cartelle partano da 1
    }

}

Perfetto tutto chiaro… poi come si richiama l’array nel Loop?

torn24:
A parte errori, a parte che non sappiamo che tipo restituisce il metodo in questione, lo schema logico
che ti avevo proposto era di questo tipo. La logica va bene il programma potrebbe avere bisogno di CORREZZIONI!

int arrayFile[21]={0};

void setup(){ //All’accensione del dispositivo

for(int i=0;i<21;i++){

arrayFile[i]=myDFPlayer.readFileCountsInFolder(i+1); // Le cartelle partano da 1
    }

}

Nome e tra parentesi quadre indice! L'indice può essere il risultato di un espressione, di un calcolo.

if (variabileFile > arrayFile[variabileCartella-1])variabileFile = 1; // Se supero il numero massimo di file torno al primo

a pranzo provo e vi dico....

torn24:
Nome e tra parentesi quadre indice! L'indice può essere il risultato di un espressione, di un calcolo.

if (variabileFile > arrayFile[variabileCartella-1])variabileFile = 1; // Se supero il numero massimo di file torno al primo

allora raga, appare l’array che non ho ancora messo in funzione ma metterò a breve, una info, se alla pressione di un tasto vorrei che aspettasse qualche secondo prima di eseguire il comando, il Delay dolo lo posso inserire?
perché ho inserito il conteggio delle cartelle ma alla pressione del tasto va avanti troppo velocemente.
Ho inserito il delay alla fine ma mi ritarda tutto.
Come potrei fare?

Inserisco il codice:

 #include <SoftwareSerial.h>
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int buttonNext = 2;
int buttonPause = 3;
int buttonFolderBack = 4;
int buttonFolderNext = 5;

int folderMax = 21;
boolean isPlay= true;

void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);

  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  
  //----Set volume----
  myDFPlayer.volume(20);  //Set volume value (0~30).
  
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  
  //----Set device we use SD as default----
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);

  //----Mp3 play----/
  myDFPlayer.loopFolder(1);
 
  //----Mp3 play----/
//  myDFPlayer.next();  //Play next mp3
//  delay(1000);
//  myDFPlayer.previous();  //Play previous mp3
//  delay(1000);
//  myDFPlayer.play(1);  //Play the first mp3
//  delay(1000);
//  myDFPlayer.loop(1);  //Loop the first mp3
//  delay(1000);
////  myDFPlayer.pause();  //pause the mp3
//  delay(1000);
//  myDFPlayer.start();  //start the mp3 from the pause
//  delay(1000);
//  myDFPlayer.playFolder(01, 001);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
//  delay(1000);
//  myDFPlayer.enableLoopAll(); //loop all mp3 files.
//  delay(1000);
//  myDFPlayer.disableLoopAll(); //stop loop all mp3 files.
//  delay(1000);
 // myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
 // delay(1000);
 // myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535)
 // delay(1000);
//  myDFPlayer.stopAdvertise(); //stop advertise
 // delay(1000);
 // myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000)
 // delay(1000);
 // myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05.
 // delay(1000);
 // myDFPlayer.randomAll(); //Random play all the mp3.
 // delay(1000);
 // myDFPlayer.enableLoop(); //enable loop.
 // delay(1000);
//  myDFPlayer.disableLoop(); //disable loop.
//  delay(1000);

  //----Read imformation----
//  Serial.print ("Stato MP3: ");
// Serial.println(myDFPlayer.readState()); //read mp3 state
//  Serial.print ("Volume: ");
//  Serial.println(myDFPlayer.readVolume()); //read current volume
//  Serial.print ("Equalizzazione ");
//  Serial.println(myDFPlayer.readEQ()); //read EQ setting
//  Serial.print ("n. file in tutta sd ");
//  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
//  Serial.print ("Numero File corrente in riproduzione ");
//  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
//  Serial.print ("Numero File in Cartella ");
//  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read file counts in folder SD:/03
  

  pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause, HIGH);
  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext, HIGH);
  pinMode(buttonFolderBack, INPUT);
  digitalWrite(buttonFolderBack, HIGH);
  pinMode(buttonFolderNext, INPUT);
  digitalWrite(buttonFolderNext, HIGH);
}

int cartella = 1;
int attesa = 1000;


  void loop()

{
    
  if(digitalRead(buttonPause) == LOW){
    if(isPlay) {
      myDFPlayer.pause();
      isPlay = false;
    } else {
      isPlay = true;
      myDFPlayer.start();
    } 
    }

 if(digitalRead(buttonNext) == LOW) {
   attesa;
  if(isPlay)
  myDFPlayer.next();
 }
 
 if(digitalRead(buttonFolderNext) == LOW) {
   attesa;
  if(isPlay) {
  cartella = cartella+1; {
  if(cartella < 21) {
  myDFPlayer.loopFolder(cartella);
 } else {
  cartella = 1;
        }
  }
 }
 }
  if(digitalRead(buttonFolderBack) == LOW) {
     attesa;
  if(isPlay) {
  cartella = cartella-1; {
  if(cartella >= 1) {
  myDFPlayer.loopFolder(cartella);
 } else {
  cartella = 1;
 }
  }
 }
 }
 //delay(50);


//if (myDFPlayer.available()) {
//  Serial.print("Cartella Riprosotta:" );
//  Serial.println(cartella); 
// printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
//  }
}


void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

Nel programma vedo scritto " attesa;" è il nome della variabile ma non produce nessuna pausa, dovresti inserirla dentro un delay(attesa);.

Per una pausa alla pressione di un pulsante basta un piccolo delay()

if(digitalRead(pulsante)==LOW){

  
    // CODICE CHE DEVO ESEGUIRE


    delay(250); // In questo modo hai il tempo di togliere il dito dal pulsante
                      // E non eseguire il codice velocissimamente e ripetutamente


}

Si si assolutamente, ma noto che che lo metto alla fine di loop non va bene, vorrei metter una pausa alla pressione di ogni tasto
vorrei sapere dove inserire i Delay

Ti ho fatto un esempio di codice "lettura del pulsante e pausa", cosa non è chiaro?
In pratica per la lettura del pulsante ho un blocco {} alla fine del blocco metti un piccolo delay(250).

il problema è che se per esempio spingo sul tasto buttonFolderNext aggiunge uno alla cartella

cartella = cartella+1;

se clicco un po di più’ mi fa il salto più 3/4 cartelle…

avevo pensato ad una cosa del genere in modo che non appena rileva la pressione si ferma per 200 poi prosegue con lo script… ma mi da errore

 if(digitalRead(buttonFolderNext) == LOW);

   delay(200);    
           

  if(isPlay) {
  cartella = cartella+1; {
  if(cartella < 21) {
  myDFPlayer.loopFolder(cartella);
 } else {
  cartella = 1;
        }
  }
 }
 }

Il tuo codice con errori

if(digitalRead(buttonFolderNext) == LOW);// QUESTO IF TERMINA QUI 
 // c'è il ; di fine istruzione, tutto quello che segue non è condizionato da questo if

   delay(200);    
           

  if(isPlay) {
  cartella = cartella+1; { // Questa parentesi non si sa a cosa appartiene
  if(cartella < 21) {
  myDFPlayer.loopFolder(cartella);
 } else {
  cartella = 1;
        }
  }
 }
 }

Il codice con correzioni

if(digitalRead(buttonFolderNext) == LOW){

    
           

      if(isPlay) {
           cartella = cartella+1; 
           if(cartella < 21) {
                 myDFPlayer.loopFolder(cartella);
           } else {
                 cartella = 1;
           }//end if
      }//end if


      delay(200); 
 }

ok perfetto adesso va bene....
ascolta una info, per programmare il digispark, hai qualche dritta da dare?

Non conoscevo la scheda ma ho trovato questa semplice guida, se ti può essere utile...

https://ita.ovh/files/tutorialbrevedigispark.pdf