使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码相关的知识,希望对你有一定的参考价值。
我目前在尝试编辑一些代码时碰到了砖墙。我正在尝试在代码中输入一个暂停/恢复片段,以便在触摸电极时-如果正在播放,它将暂停,然后通过再次触摸它就可以恢复。
使用我当前的代码编辑,一旦暂停,该曲目就不会恢复。
我正在道歉的过程中学习,如果这是一个显而易见的解决方法。任何帮助将不胜感激!
链接到图书馆的使用在这里: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);
再次感谢!
答案
问题是if (MP3player.getState() == paused_playback)
嵌套在if (MP3player.isPlaying())
中。
if (MP3player.isPlaying())
if (lastPlayed == i && !REPLAY_MODE)
MP3player.pauseMusic();
Serial.println(MP3player.getState());
else
if (MP3player.getState() == paused_playback) // getState() always returns playback
if (lastPlayed == i)
MP3player.resumeMusic();
else
MP3player.stopTrack();
MP3player.playTrack(i-firstPin);
lastPlayed = i;
else
MP3player.playTrack(i-firstPin);
lastPlayed = i;
除非MP3player
的状态在后台更新,否则getState()
始终在playback
处返回if (MP3player.getState() == paused_playback)
,并且永远不会调用resumeMusic()
。
以上是关于使用SFEMP3Shield.h库的错误消息试图实现播放/暂停代码的主要内容,如果未能解决你的问题,请参考以下文章
试图将两个 json 数据放入 python 列表但收到错误消息