Помогите плиз: ардуина и DFPlayerMini Player
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 - 23:41
Ардуина в цикле 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); // оповещение о сработке
}
}
А почему бы не завести с модуля сигнал от его состоянии? И проверять его. И только если он готов то запускать воспроизведение.
Вы имеете ввиду программно или аппаратно ?
Если программно
if (Player.available()) { Player.readState(); ??? }как сообщить модулю , что после первой принятой еденицы с Tx МК - остальные игнорировать?
А если аппаратно - использовать выходной сигнал на звук? и использовать в МК как прерывание?
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 когда модуль что-то воспроизводит.
Спасибо большое, за идеи - пробую варианты с переменной состояния модуля в коде.
А пока решил свой вопрос аппаратно:
подключил по Вашему совету 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 играет - не надо его дёргать ...Ещё раз спасибо. Тему можно закрывать.