1 (edited by Muzalkov 2022-04-15 05:58:53)

Topic: Периодически виснет ввод/вывод по BT на мобилу

В бесплатной версии с мобилы считываются две кнопки и передаются три переменных.

// input variables
  uint8_t button_2; // =1 если кнопка нажата, иначе =0
  uint8_t button_1; // =1 если кнопка нажата, иначе =0

// output variables
  char text_1[4];  // =строка UTF8 оканчивающаяся нулем
  int8_t level_2; // =0..100 положение уровня
  char text_2[4];  // =строка UTF8 оканчивающаяся нулем

Скорости обмена стоят дефолтные.
Мои переменные меняются раз десять в секунду.

При отслеживании динамики переменных примерно каждые 20-40 сек экран "замерзает".
Стрелка не шевелится, параметры не меняются, кнопки не работают.
Висит секунд пять -десять, и потом продолжает нормально работать.
Loop "крутится" без тормозов, связь BT не рвется.
delay() не использую.
При периоде обмена более 100 мсек зависаний не наблюдаю, но очень некрасиво дергается стрелка

2

Re: Периодически виснет ввод/вывод по BT на мобилу

Всем привет!

Вместо "Стрелочного индикатора" поставил "Онлайн график".
На графике четко видны горизонтальные ступеньки останова обновления.

Для медленных параметров типа температуры в помещении это незаметно, но мне нужно обновлять инфу несколько раз в секунду.

Помогите решить проблему.

3

Re: Периодически виснет ввод/вывод по BT на мобилу

1. Проверьте что вы не обновляете ваши input variables button_1 и button_2 из кода.
2. Проверьте какие дополнительные библиотеки вы используете, возможно они забирают время вашего цикла loop.

4

Re: Периодически виснет ввод/вывод по BT на мобилу

Спасибо за ответ и совет.

Добавил в конце Loop() delay(30) и проблема как бы пока не появляется.
Но стрелка движется мелкими рывками sad
Некрасиво.

PS. Этот же скетч юзал с Bluetooth Electronics.
Там графики и стрелки не тормозили.
Но меня не устроил их функционал.

Начало на 20 сек: https://youtu.be/qx8PFLzIXTo

5 (edited by Muzalkov 2022-04-14 04:33:08)

Re: Периодически виснет ввод/вывод по BT на мобилу

И все таки, проблема не решена sad((
Для управления Mp3 плейером я должен использовать SoftwareSerial как рекомендовано производителем:
-----------------------------------------------------------------------------------------------
#include <SoftwareSerial.h>                                 // Some arduino boards only have one hardware serial port
#include <DFMiniMp3h>                                       // Instance a DFMiniMp3 object,

#define Mp3_RX    3                                            // to TX DFPlayer
#define Mp3_TX    2                                            // to RX DFPlayer

SoftwareSerial PortMp3( Mp3_RX, Mp3_TX ) ;       // RX to TX, TX to RX  !!! Резистор 1 кОм ОБЯЗАТЕЛЬНО!

DFMiniMp3<SoftwareSerial,
          Mp3Notify> Mp3_voice(PortMp3) ;
-----------------------------------------------------------------------------------------------

Я полагаю, что где то эти два порта ( BlueTooth и Mp3 ) SoftwareSerial конфликтуют, хотя не должны.

PS. В моем коде порты установлены так:
#define Mp3_RX   10                                            // to TX DFPlayer
#define Mp3_TX    11                                            // to RX DFPlayer

6

Re: Периодически виснет ввод/вывод по BT на мобилу

Скажите, вы не упомянули на каком контроллере ваше устройство? Это ESP32?
Конфликт легко проверить: отключите библиотеку DFMiniMp3h полностью, даже include уберите. И проверьте как ведет себя RemoteXY.

7

Re: Периодически виснет ввод/вывод по BT на мобилу

Без #include <DFMiniMp3.h> тормозов нет.
Но мне надо выводить короткие голосовые сообщения не чаще одного раза в секунду.

Пробовал на Arduino Nano и Arduino Mini.
Результат одинаково грустный sad

8

Re: Периодически виснет ввод/вывод по BT на мобилу

Проблему пока решил тем, что организовал обмен с RemoteXY каждые 50 мсек, а обмен с DFMiniMp3 каждые 800 мсек.
Но на интервалах в несколько минут пока не проверял

9 (edited by Muzalkov 2022-04-23 04:23:17)

Re: Периодически виснет ввод/вывод по BT на мобилу

remotexy wrote:

Скажите, вы не упомянули на каком контроллере ваше устройство? Это ESP32?
Конфликт легко проверить: отключите библиотеку DFMiniMp3h полностью, даже include уберите. И проверьте как ведет себя RemoteXY.

Если в Setup()    RemoteXY_Init ()  стоит на первом месте - связь по BT не устанавливается.

Если ставить RemoteXY_Init () в конце - связь и загрузка на мобилу идет нормально.

void setup()
{

// RemoteXY_Init ();

  PortMp3.begin(9600) ;                                     // второй <SoftwareSerial.h> для Mp3_Voice

  Mp3_voice.begin() ;                                       // инициализация плейера
  byte volume = Mp3_voice.getVolume() ;                     // получить предустановленный уровень громкости
  Mp3_voice.setVolume(31) ;                                 // установить громкость 0-31
  number_of_messages = Mp3_voice.getTotalTrackCount() ;     // получить число сообщений *.mp3

  RemoteXY_Init () ;

}

К сожалению, "тормоз" не пропадает sad

10 (edited by Muzalkov 2022-04-25 06:51:20)

Re: Периодически виснет ввод/вывод по BT на мобилу

Так и не удалось мне сделать проект с вашим продуктом RemoteXY sad

Начало было хорошее, и даже появилась мысль купить RemoteXY Pro и расширить свой функционал  для лучшей продажи.

Как только подключаю библиотеки #include <HX711.h> и <DFMiniMp3.h> связь вылетает по таймауту.
Даже старые архивные рабочие скрипты перестали работать .

Печалька...

11

Re: Периодически виснет ввод/вывод по BT на мобилу

Требуется изучение библиотеки DFMiniMp3.h и HX711.h, а так же вашего кода как вы используете эти библиотеки.
Требуется исключить какие либо задержки.
1. Для теста, в начало цикла loop() добавьте вывод в терминал текущего времени в миллисекундах. Далее проанализируйте какое максимальное время вашего цикла. Если оно больше 50 мс, то могут быть проблемы с RemoteXY, зависит от размеров буфера обмена портов. Просто RemoteXY не будет успевать анализировать и опустошать буферы принимаемых данных и они будут переполняться и теряться.

void loop () {
  Serial.println (millis());
  // мой код
}

2. Если действительно есть задержки которые увеличивают время цикла, требуется поиск этих мест где программа крутится и не отпускает. В эти циклы так же можно добавить вызов RemoteXY_Handler (). Возможно так же придется добавить это в тело библиотек.
3. Есть вариант для опытных. Можно переопределить какое либо прерывание по таймеру с циклом 10-30 мс, и из него запускать RemoteXY_Handler (). Однако нужно понимать что эти таймеры не используются в других библиотеках. Сам RemoteXY не переопределяет таймеры. Но тут возникают особенности по работе с переменными структуры RemoteXY. Вы не знаете в какой момент будет вызвано прерывание, а именно в эти моменты будут обновляться переменные в структуре RemoteXY, а так же отсылаться на смартфон. Требуется умение работать с многопоточностью, так как для вас в этом случае RemoteXY будет работать как бы в отдельном потоке а переменные структуры RemoteXY окажутся общими для обоих потоков. В общем случае когда вы хотите прочитать или записать переменные структуры RemoteXY вам потребуется отключать прерывание по таймеру.

12

Re: Периодически виснет ввод/вывод по BT на мобилу

Большое спасибо за инфу.
Надо обдумать.

13

Re: Периодически виснет ввод/вывод по BT на мобилу

В целом, свою задачу решил не углубляясь в прерывания, но пришлось переписать код.

В исходном варианте в старый код была добавлена RemoteXY c выводом на экран мобилы. Не получилось.

Во втором подходе сначала сделал ввод (две кнопки) и вывод (стрелочный индикатор) на мобилу, и потом добавил старый код. Работает хорошо, но вопросы остались со скоростью перемещения стрелки: нет плавности.

За продукт  RemoteXY спасибо.
Буду копать дальше smile