Помогите плиз: ардуина и DFPlayerMini Player

Igor23
Offline
Зарегистрирован: 04.02.2017

Ардуина в цикле loop опрашивает датчики - при сработке воспроизводит соответствующий mp3 с DFPlayerMini Player.

Так как в цикле при сработке ардуина постоянно дёргает мр3 модуль на воспризведение - он не успевает что-либо воспроизвести. ( delay не предлагать  =) )

Вопрос: как сделать, чтоб при сработке мр3 модуль проиграл три раза и замолчал (независимо от состояния датчика) ?

........

void loop() 
{ 
if(digitalRead(24)==HIGH){    // сработал датчик in24
        in24 = 1; // ставим флаг в единицу (вкл)
		Notify(1); // включаем оповещение
		
        ???
   }  
    else{
      in24 = 0;
    }
}
      .....
	  
int Notify(int x) //функция оповещения
{
    if (x==1) { 
        Player.play(1); // оповещение о сработке
    }    
}	

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

А почему бы не завести с модуля сигнал от его состоянии? И проверять его. И только если он готов то запускать воспроизведение.

Igor23
Offline
Зарегистрирован: 04.02.2017

Вы имеете ввиду программно или аппаратно ?

Если программно 

if (Player.available()) {
    Player.readState(); 
	???
  }

как сообщить модулю , что после первой принятой еденицы с Tx МК  - остальные игнорировать?

А если аппаратно - использовать выходной сигнал на звук? и использовать в МК как прерывание?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

	  
int Notify(int x) //функция оповещения
{
    if(state[x] != 0) return;
    if (x==1) { 
        Player.play(1); // оповещение о сработке
    } 
    .........
    state[x] = 1;
}	

Нужно ввести переменную состояния - запустили воспроизведение и установили переменную. При последующих активациях датчиков - читаем переменную и решаем нужно ли запускать восприизведение.

Организуете ли вы это ввиде одной переменной типа int и чтения ее 16 битов или массива где каждый элемент соответвует состоянию воспроизведения для датчика.

Можно использовать разные состояяния : 0 - никогда не восприизводилось, 1 - воспроизводилось, 2 воспроизводится сейчас, 3 - в очереди на воспроизведение.

Можно сделать массив очереди и добавлять туда датчики в порядке их сработки. 

P.S. У DFPlayer есть пин который устанавливается в 1 когда модуль что-то воспроизводит. 

Igor23
Offline
Зарегистрирован: 04.02.2017

Спасибо большое, за идеи - пробую варианты с переменной состояния модуля в коде.

А пока   решил свой вопрос аппаратно:

подключил по Вашему совету 16 ногу DFPlayerMini Player(а) на вход МК и дописал пару строчек кода:

 pinMode(24, INPUT);  // датчик
 pinMode(50, INPUT); // выход с 16 ноги DFplayer - активное состояние LOW
       .....

if(digitalRead(24)==HIGH){    // сработал датчик in24
              
        if(digitalRead(24)==HIGH && digitalRead(50)==HIGH){ // ловим момент:  если сработал датчик  и DFplayer ещё не успел запустится
          Notify(1);  // включаем звуковое сообщение
          } else return; // если DFplayer играет - не надо его дёргать ...

Ещё раз спасибо. Тему можно закрывать.