정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

(도움!!) 실행 중인 프로그램이 멈추는 현상
햇님 | 2021-10-03

제가 mp3 쉴드를 이용해 mp3를 만들었습니다. 총 5개의 버튼을 pull up 방식을 써서 A0, A1, A2, A3, A4 핀에 꼳았습니다. 배터리는 6v 짜리고 커넥터가 붙어 있습니다. 근데 배터리에 연결해 전원을 키면 한 10분 가량 돌아가다 노래가 끊김니다. 일시 정지 하지 않는 이상 멈추지 않고 계속 돌아가게 프로그램 했는데 말이죠. 더 이상한건 usb 포트와 연결해 전원을 키면 1시간이 지나도 계속 돌아갑니다. 이 문제를 어떻게 해결해야 할까요?

 

* 아래는 아두이노에 입력된 프로그램 입니다. 참고하실 분은 보세요.

#include <SPI.h>
#include <SdFat.h>
#include <SFEMP3Shield.h>

 

int play_track = 0;
int play_type = 0;

 

SdFat sd;

SFEMP3Shield MP3player;

 

// 버튼으로 조종하는 MP3

void setup(){
   Serial.begin(115200);
   randomSeed(analogRead(0));
   sd.begin(SD_SEL, SPI_HALF_SPEED);
   MP3player.begin();
   pinMode(A0,INPUT_PULLUP);
   pinMode(A1,INPUT_PULLUP);
   pinMode(A2,INPUT_PULLUP);
   pinMode(A3,INPUT_PULLUP);
   pinMode(A4,INPUT_PULLUP);
}

void loop(){  
  int choice_style = digitalRead(A1);
  int sound_up = digitalRead(A0);
  int sound_down = digitalRead(A4);
  int to_pause = digitalRead(A2);
  int playing_track = digitalRead(A3);

  if(to_pause == 0) {
    
    pausing();
    delay(100);
    
  } else if(sound_up == 0) {
    
    sound(1);
    delay(100);
    
  } else if(sound_down == 0) {
    
    sound(0);
    delay(100);
    
  } else if(choice_style == 0) {
    
    play_type++;
    if(play_type > 2){
      play_type = 0;
    }
    Serial.print("play type : ");
    Serial.println(play_type);
    delay(100);
    
  } else if(playing_track == 0) {
    MP3player.stopTrack();
    play_track++;
    MP3player.playTrack(play_track);
    Serial.print("play track : ");
    Serial.println(play_track);
    delay(100);
  }

  // 오류 방지용 (순서 중요)
  if(play_track > 10) {
    play_track = 0;
  }
  if(play_track == 0 && play_type == 2) {
    play_track = 1;
  }
  if(MP3player.isPlaying() != 1) {
    style();
  }
  
  delay(100);
}

void style() {
  if(play_type == 1) // 한 개 반복
  {
    MP3player.playTrack(play_track);
      
  } else if(play_type == 2) // 무작위로 전체 반복
  {
    play_track = random(1,11);
    MP3player.playTrack(play_track);
      
  } else // 순서대로 전체 반복
  {
    play_track++;
    MP3player.playTrack(play_track);
    
  }
  Serial.print("play track : ");
  Serial.println(play_track);
}

// 소리 조절
void sound(int a) {
  union twobyte mp3_vol;
  mp3_vol.word = MP3player.getVolume();
  
  if(a == 0) {
    Serial.print("down ");
    if(mp3_vol.byte[1] >= 254) {
      mp3_vol.byte[1] = 254;
    } else {
      mp3_vol.byte[1] += 2;
    }
  } else {
    Serial.print("up ");
    if(mp3_vol.byte[1] <= 2) { // range check
      mp3_vol.byte[1] = 2;
    } else {
      mp3_vol.byte[1] -= 2;
    }
  }
  Serial.println(mp3_vol.byte[1]>>1, 1);
  MP3player.setVolume(mp3_vol.byte[1], mp3_vol.byte[1]);
}

// 일시정지
void pausing() {
  if( MP3player.getState() == playback) {
      Serial.println("to pause");
      MP3player.pauseMusic();
    } else if( MP3player.getState() == paused_playback) {
      Serial.println("again");
      MP3player.resumeMusic();
    }
}

이전글   |    아두이노에서 보낼 수 있는 총 문자열의 갯수를 늘릴 수 있는 방법이 알고 싶습니다.... 2021-09-30
다음글   |    마스크 착용 유무를 확인 예제 문의 2021-10-04