Сообщение об ошибке при использовании библиотеки SFEMP3Shield.h при попытке реализовать код воспроизведения / паузы - PullRequest
0 голосов
/ 05 октября 2019

Я сейчас бью кирпичную стену, пытаясь отредактировать какой-то код. Я пытаюсь ввести в код фрагмент паузы / возобновления, чтобы при прикосновении к электроду - при воспроизведении он будет приостановлен, и, следовательно, его можно будет возобновить, коснувшись его снова.

С моимпри текущем редактировании кода, трек не возобновляется после паузы.

Я учусь, пока извиняюсь, если это явно очевидное исправление. Любая помощь будет принята с благодарностью!

Ссылка на библиотеку здесь: https://github.com/mpflaga/Sparkfun-MP3-Player-Shield-Arduino-Library

Смотрите код, с которым я работаю ниже!

// compiler error handling
#include "Compiler_Errors.h"

// touch includes
#include <MPR121.h>
#include <Wire.h>
#define MPR121_ADDR 0x5C
#define MPR121_INT 4

// mp3 includes
#include <SPI.h>
#include <SdFat.h>
#include <FreeStack.h> 
#include <SFEMP3Shield.h>

// mp3 variables
SFEMP3Shield MP3player;
byte result;
int lastPlayed = 0;

// mp3 behaviour defines
#define REPLAY_MODE FALSE  // By default, touching an electrode repeatedly will 
// play the track again from the start each time.
//
// If you set this to FALSE, repeatedly touching an 
// electrode will stop the track if it is already 
// playing, or play it from the start if it is not.

// touch behaviour definitions
#define firstPin 0
#define lastPin 11

// sd card instantiation
SdFat sd;

void setup(){  
    Serial.begin(57600);

    pinMode(LED_BUILTIN, OUTPUT);

    //while (!Serial) ; {} //uncomment when using the serial monitor 
    Serial.println("Bare Conductive Touch MP3 player");

    if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();

    if(!MPR121.begin(MPR121_ADDR)) Serial.println("error setting up MPR121");
    MPR121.setInterruptPin(MPR121_INT);

    MPR121.setTouchThreshold(5);
    MPR121.setReleaseThreshold(5);

    result = MP3player.begin();
    MP3player.setVolume(10,10);

    if(result != 0) {
        Serial.print("Error code: ");
        Serial.print(result);
        Serial.println(" when trying to start MP3 player");
    }

}

void loop(){
    readTouchInputs();
}


void readTouchInputs(){

    if (MPR121.touchStatusChanged()) {

        MPR121.updateTouchData();
        // only make an action if we have one or fewer pins touched
        // ignore multiple touches

        if (MPR121.getNumTouches() <= 1) {
            for (int i = 0; i < 12; i++) {  // Check which electrodes were pressed
                if (MPR121.isNewTouch(i)) {

                    //pin i was just touched
                    Serial.print("pin ");
                    Serial.print(i);
                    Serial.println(" was just touched");
                    digitalWrite(LED_BUILTIN, HIGH);

                    if (i <= lastPin && i >= firstPin) {
                        if (MP3player.isPlaying()) {
                            if (lastPlayed == i && !REPLAY_MODE) {
                                // if we're already playing the requested track, stop it
                                // (but only if we're not in REPLAY_MODE)
                                MP3player.pauseMusic();
                                Serial.print("paused_playback");
                                Serial.println(MP3player.getState());
                            }
                            else {
                                // if the track is already paused, resume the track
                                if (MP3player.getState() == paused_playback) {
                                    if (lastPlayed == i) {                
                                        MP3player.resumeMusic();
                                        Serial.print("resuming");
                                        Serial.println(i-firstPin);

                                    } else { 
                                        // if we're already playing a different track (or we're in
                                        // REPLAY_MODE), stop and play the newly requested one
                                        MP3player.stopTrack();
                                        MP3player.playTrack(i-firstPin);
                                        Serial.print("playing track ");
                                        Serial.println(i-firstPin);

                                        // don't forget to update lastPlayed - without it we don't
                                        // have a history
                                        lastPlayed = i;
                                    }
                                }
                            }
                        } else {
                            // if we're playing nothing, play the requested track 
                            // and update lastplayed
                            MP3player.playTrack(i-firstPin);
                            Serial.print("playing track ");
                            Serial.println(i-firstPin);
                            lastPlayed = i;
                        }
                    }    
                } else {
                    if (MPR121.isNewRelease(i)) {
                        Serial.print("pin ");
                        Serial.print(i);
                        Serial.println(" is no longer being touched");
                        digitalWrite(LED_BUILTIN, LOW);
                    } 
                }
            }
        }
    }
}

Еще раз спасибо!

отредактированный код с последним включенным включением

void setup(){  
  Serial.begin(57600);

  pinMode(LED_BUILTIN, OUTPUT);

  //while (!Serial) ; {} //uncomment when using the serial monitor 
  Serial.println("Bare Conductive Touch MP3 player");

  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();

  if(!MPR121.begin(MPR121_ADDR)) Serial.println("error setting up MPR121");
  MPR121.setInterruptPin(MPR121_INT);

  MPR121.setTouchThreshold(5);
  MPR121.setReleaseThreshold(5);

  result = MP3player.begin();
  MP3player.setVolume(10,10);

  if(result != 0) {
    Serial.print("Error code: ");
    Serial.print(result);
    Serial.println(" when trying to start MP3 player");
   }

}

void loop(){
  readTouchInputs();
}


void readTouchInputs(){
  if(MPR121.touchStatusChanged()){

    MPR121.updateTouchData();
    // only make an action if we have one or fewer pins touched
    // ignore multiple touches

    if(MPR121.getNumTouches()<=1){
      for (int i=0; i < 12; i++){  // Check which electrodes were pressed
        if(MPR121.isNewTouch(i)){

            //pin i was just touched
            Serial.print("pin ");
            Serial.print(i);
            Serial.println(" was just touched");
            digitalWrite(LED_BUILTIN, HIGH);

            if(i<=lastPin && i>=firstPin){
              if(MP3player.isPlaying()){
                if(lastPlayed==i && !REPLAY_MODE){
                  // if we're already playing the requested track, stop it
                  // (but only if we're not in REPLAY_MODE)
                  MP3player.pauseMusic();
                  Serial.print("paused_playback");
                  Serial.println(i-firstPin);
                  lastPlayed = i;


              } else {
                MP3player.getState();{
                if(lastPlayed == i){
                  if (MP3player.getState() == paused_playback){ 
                    // if we've already paused the track, resume it
                 MP3player.resumeMusic();
                 Serial.print("resuming");
                 Serial.println(i-firstPin);

               } else { 
                  // if we're already playing a different track (or we're in
                  // REPLAY_MODE), stop and play the newly requested one
                  MP3player.stopTrack();
                  MP3player.playTrack(i-firstPin);
                  Serial.print("playing track ");
                  Serial.println(i-firstPin);

                  // don't forget to update lastPlayed - without it we don't
                  // have a history
                  lastPlayed = i;
                }
                  }
                    }
                      }
              } else {
                // if we're playing nothing, play the requested track 
                // and update lastplayed
                MP3player.playTrack(i-firstPin);
                Serial.print("playing track ");
                Serial.println(i-firstPin);
                lastPlayed = i;
              }
            }     
              } else {
                if(MPR121.isNewRelease(i)){
                Serial.print("pin ");
                Serial.print(i);
                Serial.println(" is no longer being touched");
            digitalWrite(LED_BUILTIN, LOW);
         } 
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 05 октября 2019

Глубоко вложенный, если за заявлениями очень трудно следовать. Я понимаю, что вы хотите запустить одно из четырех действий (воспроизведение, пауза, возобновление и остановка / воспроизведение) в зависимости от состояния MP3-плеера, последнего воспроизведенного трека и идентификатора электрода. Я предлагаю вам определить такую ​​функцию, чтобы определить действие.

enum Action {
  DO_NOTHING,
  PLAY,
  PAUSE,
  RESUME,
  STOP_THEN_PLAY
};

Action nextAction(state_m state, int i) {

  if (state == paused_playback && lastPlayed == i) {
    return RESUME;
  }

  if (state != playback) {
    return PLAY;
  }

  if (state == playback && lastPlayed == i){
    return PAUSE;
  }

  if (state == playback) {
    return STOP_THEN_PLAY;
  }

  return DO_NOTHING;
}

Передать состояние MP3-плеера и идентификатор электрода в функцию. Затем вы можете запустить соответствующее действие на основе значения action.

for (int i = 0; i < 12; i++) {  // Check which electrodes were pressed
  if (MPR121.isNewTouch(i)) {

    state = MP3player.getState();
    Action action = nextAction(state, i); // find what to do next

    switch (action) {
    case PLAY:
      Serial.println("play");
      MP3player.playTrack(i-firstPin);
      lastPlayed = i;
      state = playback;
      break;
    case PAUSE:
      Serial.println("pause");
      MP3player.pauseMusic();
      state = paused_playback;
      lastPlayed = i;
      break;
    case RESUME:
      Serial.println("resume");
      MP3player.resumeMusic();
      state = playback;
      break;
    case STOP_THEN_PLAY:
      Serial.println("stop then play");
      MP3player.stopTrack();
      MP3player.playTrack(i-firstPin);
      state = playback;
      lastPlayed = i;
      break;
    default:
      break;
    }
  }
}
...