2022-05-04
#include <SoftwareSerial.h> /* UART通信オブジェクト生成 */ SoftwareSerial MP3(A1,A0);//rx,tx /* プロトタイプ宣言 */ int get_number_of_tracks(void); void set_number_of_tracks(uint8_t number); void set_number_of_directory(uint8_t number); void control_tracks(char control); void set_volume(uint8_t val); void quiet_mode(bool val); int confirm(void); /* グローバル変数 */ int sum = 0; ///////////////////// /* メインプログラム */ //////////////////// /* 初期設定 */ void setup(){ delay(100); MP3.begin(38400); Serial.begin(9600); sum = get_number_of_tracks(); // 総トラック数を取得 Serial.print("Number of all Tracks:"); // シリアルモニタに総トラック数を表示 Serial.print(sum); Serial.print("\r\n"); set_volume(200); // 音量セット quiet_mode(false); // クワイエットモードOFF } /* メインループ */ void loop(){ /* 曲が終了したら次の曲へ飛ぶ */ for(int i = 1; i<= sum; i++){ Serial.print("Track:"); Serial.print(i); Serial.print("\r\n"); set_number_of_tracks(i); confirm(); // 曲を変えると2が返ってくるので受け取る int check = 0; while(check != 1 && check != 2 && check != 3){ check = confirm(); } Serial.print("Next\r\n"); } /*15秒間停止*/ Serial.print("stop\r\n"); control_tracks('O'); delay(15000); } /////////////////////////////// /* 総トラック数(曲数)を取得する関数 */ /////////////////////////////// int get_number_of_tracks(void){ while(MP3.availableForWrite() != 0); MP3.write('S'); while(MP3.availableForWrite() != 0); MP3.write('1'); char track[5]; /* 待機 */ while(MP3.available() == 0); track[0] = MP3.read(); // '='取得 /* 他ラック数をASCII文字で取得 */ int count = 0; int i = 1; while(count <= 1000){ // 1秒待機 if(MP3.available() > 0){ track[i] = MP3.read(); track[i+1]='\0'; i++; } count++; delay(1); } /* ASCII文字を数値に変換 */ for(i = 1; i<= 3; i++){ switch(track[i]){ case '0': track[i] = 0; break; case '1': track[i] = 1; break; case '2': track[i] = 2; break; case '3': track[i] = 3; break; case '4': track[i] = 4; break; case '5': track[i] = 5; break; case '6': track[i] = 6; break; case '7': track[i] = 7; break; case '8': track[i] = 8; break; case '9': track[i] = 9; break; default: break; } } /* 位(桁)を合わせる */ if(track[2]=='\0'){ return track[1]; } else if(track[3]=='\0'){ return (10*track[1] + track[2]); } else if(track[4]=='\0'){ return (100*track[1] + 10*track[2] + track[3]); } else{ return 999; // 受信エラー } } //////////////////////////////////// /* トラックナンバーを指定して曲を流す関数 */ //////////////////////////////////// void set_number_of_tracks(uint8_t number){ while(MP3.availableForWrite() != 0); MP3.write('t'); while(MP3.availableForWrite() != 0); MP3.write(number); } /////////////////////////////////////// /* ディレクトリのn番目を指定して曲を流す関数 */ /////////////////////////////////////// void set_number_of_directory(uint8_t number){ while(MP3.availableForWrite() != 0); MP3.write('p'); while(MP3.availableForWrite() != 0); MP3.write(number); } ////////////////////////////////////////////////////////////////////////////////// /* 音楽を再生・停止したり、次・前の曲に変える関数('O':再生・停止, 'F':次へ進む, 'R':前に戻る) */ ////////////////////////////////////////////////////////////////////////////////// void control_tracks(char control){ while(MP3.availableForWrite() != 0); MP3.write(control); } /////////////////////////////// /* 音量を変える関数(0最小~255最大) */ /////////////////////////////// void set_volume(uint8_t val){ while(MP3.availableForWrite() != 0); MP3.write('v'); while(MP3.availableForWrite() != 0); MP3.write(255 - val); } ////////////////////////////////////////////////////////////// /* クワイエットモードをOn(true)/off(false)する関数(デフォルトはoff) */ ////////////////////////////////////////////////////////////// void quiet_mode(bool val){ while(MP3.availableForWrite() != 0); MP3.write('Q'); while(MP3.availableForWrite() != 0); if(val == true){ MP3.write('1');//on } else{ MP3.write('0');//off(default) } } /////////////////////////////////////////////////////////////////////////////// /* 曲の再生の終了を確認する関数 戻り値(自然終了:1,強制終了:2,終了していない:0,エラー:999) */ /////////////////////////////////////////////////////////////////////////////// int confirm(){ delay(200); int buf = MP3.available(); if(buf > 0){ char val = 0; for(int i = 1; i <= buf; i++){ val = MP3.read(); } switch(val){ case 'X'://自然終了したとき return 1; break; case 'x'://強制終了したとき return 2; break; case 'E'://トラックが存在しないとき return 3; break; default: return 999; break; } } else{ return 0; } }