Не стабильный обмен и работа с Bluetooth

alexnf
Offline
Зарегистрирован: 13.03.2015

 

Помогите найти проблему. Ардуина не всегда соединяется по блютуз, обычно только сразу после включения, и то не каждый раз. Если соединилась, то некоторое время работает. Может я че в коде наколбасил?

Устройство - автосмазчик цепи мотоцикла.

Ардуина управляем работой насоса, а настройки принимает по блютузу с телефона, с приложения написанного в аппинверторе.

Принимает несколько значений настроек, какая именно это настройка, определяет по заначению. одновременно приложение передает только одно значение, ардуина его принимает, определяет что это и записывает в соответствующую ячейку EEPROM

Так же для индикации в приложении заданных значений, ардуина постоянно передает их в приложение, строкой значений через запятую, разделяя переносом строки.

Вот часть кода касающаяся блютуза:

void setup() {
 Serial.begin(9600);                 // инициализация порта для обмена данными по блютуз
 Serial.setTimeout(100);
}

void loop() {
  ReadSerial();         //Вызов чтения текущих значений из Serial
  Indicator();         //Вызов функции индикатора текущего режима
}


//----------------------------------------------------------------------
//             Функция вывода данных в USB и Bluetooth
//     передается режим REG,а затем 2 массива значений через ","
//----------------------------------------------------------------------
void processMessage() {

  Sendcur = millis();             //Присвоили текущее время
  Send = Sendcur - Sendprev;   //Вычислили разницу текущего с предыдущим
  if (Send > 200)                    //Если прошло достаточно времени, то вычисляем скорость
  {
    Sendprev = Sendcur;       //Переменной предыдущего значения времени присваевается текущее
    Send = 0;                 //обнуляем интервал времени управления импульсом прокачки
    Serial.print(REG, DEC);   //передача текущего режима
    //циклы отправки значений из массива
    for (int i = 0; i < 14; i++) {   //цикл от 0 до 13
      Serial.print(",");
      Serial.print(message_setting_int[i]);
    }
    for (int i = 0; i < 6; i++) {   //цикл от 0 до 5
      Serial.print(",");
      Serial.print(message_setting_long[i]);
    }
    Serial.println(","); // последняя "," и переход на новую строку
  }
}


//----------------------------------------------------------------------
//                    Функция чтения данных
//                     с USB или Bluetooth
//----------------------------------------------------------------------
void ReadSerial()  {
  if (Serial.available()) {                //при наличии входящих данных
    BluetoothAndroid = Serial.parseInt();  //записываем их в переменную


    if (BluetoothAndroid < 1000)       //признак значения REG
    {
      REG = BluetoothAndroid;          //Меняем значение переменной
      EEPROM.put(170, REG);            //170 номер первой ячейки хранения значения REG
    }


    if (BluetoothAndroid > 1000 && BluetoothAndroid < 2000)    //признак значения MIntervalTown
    {
      MIntervalTown = (BluetoothAndroid - 1100) * 100 ;  //Убираем метку и меняем значение переменной
      message_setting_int[0] = MIntervalTown;            //Обновляем значение в массиве
      EEPROM.put(20, MIntervalTown);                     //20 номер первой ячейки хранения значения MIntervalTown;
    }


    if (BluetoothAndroid > 2000 && BluetoothAndroid < 3000)    //признак значения MIntervalRoad
    {
      MIntervalRoad = (BluetoothAndroid - 2100) * 100 ;  //Убираем метку и меняем значение переменной
      message_setting_int[1] = MIntervalRoad;     //Обновляем значение в массиве
      EEPROM.put(30, MIntervalRoad);    //30 номер первой ячейки хранения значения MIntervalRoad
    }


    if (BluetoothAndroid > 3000 && BluetoothAndroid < 4000)    //признак значения MCoefRain
    {
      MCoefRain = (BluetoothAndroid - 3100) * 10 ;  //Убираем метку и меняем значение переменной
      message_setting_int[2] = MCoefRain;     //Обновляем значение в массиве
      EEPROM.put(40, MCoefRain);        //40 номер первой ячейки хранения значения MCoefRain
    }

//ну и так далее все значения..

  }
}

Железную часть вроде всю проверил.

может убрать  Serial.setTimeout(100); ?

b707
Offline
Зарегистрирован: 26.05.2017

alexnf пишет:

Так же для индикации в приложении заданных значений, ардуина постоянно передает их в приложение, строкой значений через запятую, разделяя переносом строки.

У  вас "ардуина постоянно передает" 21 значение через запятую - порядка 100-120 символов - похоже, у нее просто не остается времени на прием. Увеличение таймаута Сериала до 200-300 мс может улучшить ситуацию с приемом, но побочным эффектом существенно замедлит обмен, так что может стать еще хуже.

Правильнее будет отказаться от непрерывной пересылки массивов с ардуины. Ведь если они не меняются - какой смысл слать их снова?  Отсылайте их только тогда, когда они изменились. А в приложении показывайте последние пришедшие данные.

alexnf
Offline
Зарегистрирован: 13.03.2015

Я передаю этот массив раз в 200мс, сейчас изменил вообще на 500, и мне эта передача надо только для настройки.

думаю ограничить передачу временем, например передавать  только первые 5 минут...

Если так сделать - то после 5-ти минут просто прекратить передачу, или можно и как то вообще отключить serial?

Идеально было бы передавать, только когда телефон подключен к блютуз модулю - но что то подобных примеров не нашел..

alexnf
Offline
Зарегистрирован: 13.03.2015

Или еще есть вариант, добавить кнопку, и по нажатии на нее активировать режим настроек, минут на 10 например!

Если сделать так, то как описать работу Serial в скетче? просто не принимать и не передавать данные? или и останавливать/запускать serial?