Модуль WTV020-SD-16P возможно ли использовать в одном скече с гироскопом ( без delay)
- Войдите на сайт для отправки комментариев
Вс, 10/04/2016 - 18:12
Доброго времени суток!
Ребят запустил скеч: Nano + гиро MPU6050+2кнопки+2реле(одна из реле выключается через 30сек). И решил озвучить нажатие кнопок, и некоторые моменты измерений гироскопа. Но возникло пару вопросов по модулю. Так как сколько я видел примеров, рабочих скечей с этим модулем, все они используют delay так как вродебы нужно время на воспроизведение файла AD4.
В общем вопрос токой, возможно ли использовать модуль WTV020-SD-16P без паразитной функцыи delay и не вредя нормальной работе гироскопа???
В отдельном скече WTV020-SD-16P я запускал, AD4 читает с этим проблем нет. Но этот скеч использует delay.
Ну неужели весь скеч обязательно должен остановится, чтобы модуль воспроизвел один трек?? Треки у меня разные от 4 секунд до 1минуты...
Пробовал запускать треки без delay в скече с MPU6050 но скеч сразу зависает.
А каким образом это возможно реализовать?
Вместо delay() используют millis(). Как бы на живом скетче проще показать, чем излагать теорию.
Нужно чтобы после нажатия кнопки1 (BUTTON_01.click_down) воспроизвёлся один раз трек wtv020sd16p.playVoice(0); длинной 3сек.
А по нажатию кнопки2 (BUTTON_02.click_down) трек wtv020sd16p.playVoice(1); тоже 3 сек.
Замените wtv020sd16p.PlayVoice();
на wtv020sd16p.asyncPlayVoice();
Попробовал прописал прямо в кнопку wtv020sd16p.asyncPlayVoice(0); не воспроизвелось...
if (BUTTON_01.click_down) { wtv020sd16p.asyncPlayVoice(0); if (relayEnable == false) // если до этого реле было выключено { Serial.println("Relay ON"); relayEnable = true; // разрешаем включение реле relayStartTime = millis(); // запускаем счетчик времени } Serial.println("Relay1 ON\n"); // пишем в порт k = true; //копируем значение X по нажатию и отдаем его переменной kalXold kalXold = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); }Потом попробовал здесь (здесь почемуто воспроизвелось но только после закрытия порта монитора:) т.е получается после остановки ардуидны)
if (k == true) { wtv020sd16p.asyncPlayVoice(0); if (abs(kalXold - kalAngleX) > 5) // есле kalXold бельше или меньше 5 то... { if (relay2Enable == false) // если до этого реле №2 было выключено { Serial.println("Relay2 ON"); relay2Enable = true; // разрешаем включение Реле №2 relay2StartTime = millis(); // запускаем счетчик времени } Serial.println("Relay2 ON\n"); // пишем в порт } }т.е. если пишешь
то воспроизводит, а если
то зависает...
А если меняешь на wtv020sd16p.asincPlayVoice(0); то молчит, так?
Лог последовательного порта можешь показать?
т.е. если пишешь
то воспроизводит, а если
то зависает...
А если меняешь на wtv020sd16p.asincPlayVoice(0); то молчит, так?
Когда использую delay вся программа начинает тупить со скоростью указанной в delay. И нечего не воспроизводится.
А когда убераю delay, то со страшной скоростью мегает светодиод TX на дуине и не воспроизводит. Но скеч вроде не зависает и показания гироскопа в норме. Но уже после закрытия порта и сталобыть отключения ардуины воспроизводится этот трек ))
Такое ощущение как будто зависает не сама дуня а модуль wtv020sd16p.
И в динамиках, чётко в такт лампочке TX на дуне слышны пощелкивания....
Как будтобы пытается запустить трек со скоростью 20 раз в секунду, и сама себе мешает этим...
Есть подозрение, что эта функция вызывается многократно. Попробуй так, объяви boolean ena=true; добавь в loop
if (ena) { ena=false; wtv020sd16p.playVoice(0); }Будет проигрываться один раз?
А нет ли конфликта?
Ребят, пробовал добавить вторую функцию на одну кнопку, но почемуто срабатывает две функцый почти одновременно. Хоть держи кнопку хоть нажимай. В чём может быть причина?
Функция1
if (BUTTON_02.click_down) // Отключение... { if (ena2) //Если ena2... { ena2=false; wtv020sd16p.asyncPlayVoice(2); } kalYold = 0; //обнуляем переменную kalXold = 0; //обнуляем переменную k = false; relayEnable = false; //выключаем реле1 relay2Enable = false; //выключаем реле2 Serial.println("Relay1 OFF\n"); // пишем в порт Serial.println("Relay2 OFF\n"); // пишем в порт ena = true; }Функцыя 2
if (BUTTON_02.retention) // Кнопка с задержкой { relay3Enable = false; // Выключаем реле3 relay3StartTime = millis(); }