Hi there
I'm kind of new to serial thinking. Tried to google, but found no answer, I understood.
I have a Serial MP3 player and basic function works fine, thanks to this forum.
But there is a command, that responds with the current state of the player (plying/pausing/...) and I really can't figure out, how to read this return value out.
The manual says that the command is: 7E 02 10 EF
Command's without responses was easy to implement.
But when sending the "Get Status" command, nothing happens. How do I catch the response?
Tried something like this in different Orders:
sendCommand(CMD_STATUS, 0X10);
myMP3.write(myMP3.read());
testing = myMP3.read();
Serial.println(tesing);
Or
testing = sendCommand(CMD_STATUS, 0X10);
Here's the full code so far:
#include <SoftwareSerial.h>
#define ARDUINO_RX 8//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 7//connect to RX of the module
SoftwareSerial myMP3(ARDUINO_RX, ARDUINO_TX);
static int8_t Send_buf[6] = {0} ;
/************Command byte**************************/
/*basic commands*/
#define CMD_PLAY 0X01
#define CMD_PAUSE 0X02
#define CMD_NEXT_SONG 0X03
#define CMD_PREV_SONG 0X04
#define CMD_VOLUME_UP 0X05
#define CMD_VOLUME_DOWN 0X06
#define CMD_FORWARD 0X0A // >>
#define CMD_REWIND 0X0B // <<
#define CMD_STOP 0X0E
#define CMD_STOP_INJECT 0X0F//stop interruptting with a song, just stop the interlude
/*5 bytes commands*/
#define CMD_SEL_DEV 0X35
#define DEV_TF 0X01
#define CMD_IC_MODE 0X35
#define CMD_SLEEP 0X03
#define CMD_WAKE_UP 0X02
#define CMD_RESET 0X05
/*6 bytes commands*/
#define CMD_PLAY_W_INDEX 0X41
#define CMD_PLAY_FILE_NAME 0X42
#define CMD_INJECT_W_INDEX 0X43
/*Special commands*/
#define CMD_SET_VOLUME 0X31
#define CMD_PLAY_W_VOL 0X31
#define CMD_SET_PLAY_MODE 0X33
#define ALL_CYCLE 0X00
#define SINGLE_CYCLE 0X01
#define CMD_PLAY_COMBINE 0X45//can play combination up to 15 songs
#define CMD_STATUS 0X10
void sendCommand(int8_t command, int16_t dat );
int buttonState = 0;
int buttonState_i = 0;
int is_playing = 1;
char player_status;
const int buttonPin = 5;
char testing = 8;
void setup()
{
myMP3.begin(9600);
delay(500); //Wait chip initialization is complete
sendCommand(CMD_SEL_DEV, DEV_TF); //select the TF card
delay(200); //wait for 200ms
playWithVolume(0X0501); //play the first song with volume 15(0x0F) class
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}
void loop()
{
buttonState_i = digitalRead(buttonPin);
if (buttonState != buttonState_i) {
buttonState = digitalRead(buttonPin);
if (buttonState==0) {
is_playing = !is_playing;
//Serial.println(is_playing);
if (is_playing == 1) {
Serial.println("cmd play");
playWithVolume(0X0501);
}else{
Serial.println("cmd stop");
sendCommand(CMD_PAUSE, 0X02);
}
}
}
}
void setVolume(int8_t vol)
{
mp3_5bytes(CMD_SET_VOLUME, vol);
}
void playWithVolume(int16_t dat)
{
mp3_6bytes(CMD_PLAY_W_VOL, dat);
}
/*cycle play with an index*/
void cyclePlay(int16_t index)
{
mp3_6bytes(CMD_SET_PLAY_MODE,index);
}
void setCyleMode(int8_t AllSingle)
{
mp3_5bytes(CMD_SET_PLAY_MODE,AllSingle);
}
void playCombine(int8_t song[][2], int8_t number)
{
if(number > 15) return;//number of songs combined can not be more than 15
uint8_t nbytes;//the number of bytes of the command with starting byte and ending byte
nbytes = 2*number + 4;
int8_t Send_buf[nbytes];
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = nbytes - 2; //the number of bytes of the command without starting byte and ending byte
Send_buf[2] = CMD_PLAY_COMBINE;
for(uint8_t i=0; i < number; i++)//
{
Send_buf[i*2+3] = song[i][0];
Send_buf[i*2+4] = song[i][1];
}
Send_buf[nbytes - 1] = 0xef;
sendBytes(nbytes);
}
void sendCommand(int8_t command, int16_t dat = 0)
{
delay(20);
if((command == CMD_PLAY_W_VOL)||(command == CMD_SET_PLAY_MODE)||(command == CMD_PLAY_COMBINE))
return;
else if(command < 0x10)
{
mp3Basic(command);
}
else if(command < 0x40)
{
mp3_5bytes(command, dat);
}
else if(command < 0x50)
{
mp3_6bytes(command, dat);
}
else return;
}
void mp3Basic(int8_t command)
{
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = 0x02; //the number of bytes of the command without starting byte and ending byte
Send_buf[2] = command;
Send_buf[3] = 0xef; //
sendBytes(4);
}
void mp3_5bytes(int8_t command, uint8_t dat)
{
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = 0x03; //the number of bytes of the command without starting byte and ending byte
Send_buf[2] = command;
Send_buf[3] = dat; //
Send_buf[4] = 0xef; //
sendBytes(5);
}
void mp3_6bytes(int8_t command, int16_t dat)
{
Send_buf[0] = 0x7e; //starting byte
Send_buf[1] = 0x04; //the number of bytes of the command without starting byte and ending byte
Send_buf[2] = command;
Send_buf[3] = (int8_t)(dat >> 8);//datah
Send_buf[4] = (int8_t)(dat); //datal
Send_buf[5] = 0xef; //
sendBytes(6);
}
void sendBytes(uint8_t nbytes)
{
for(uint8_t i=0; i < nbytes; i++)//
{
myMP3.write(Send_buf[i]) ;
}
}
Thanks alot for helping me starting over with serialism.
Leon