Не стабильный обмен и работа с Bluetooth
- Войдите на сайт для отправки комментариев
Помогите найти проблему. Ардуина не всегда соединяется по блютуз, обычно только сразу после включения, и то не каждый раз. Если соединилась, то некоторое время работает. Может я че в коде наколбасил?
Устройство - автосмазчик цепи мотоцикла.
Ардуина управляем работой насоса, а настройки принимает по блютузу с телефона, с приложения написанного в аппинверторе.
Принимает несколько значений настроек, какая именно это настройка, определяет по заначению. одновременно приложение передает только одно значение, ардуина его принимает, определяет что это и записывает в соответствующую ячейку 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); ?
Так же для индикации в приложении заданных значений, ардуина постоянно передает их в приложение, строкой значений через запятую, разделяя переносом строки.
У вас "ардуина постоянно передает" 21 значение через запятую - порядка 100-120 символов - похоже, у нее просто не остается времени на прием. Увеличение таймаута Сериала до 200-300 мс может улучшить ситуацию с приемом, но побочным эффектом существенно замедлит обмен, так что может стать еще хуже.
Правильнее будет отказаться от непрерывной пересылки массивов с ардуины. Ведь если они не меняются - какой смысл слать их снова? Отсылайте их только тогда, когда они изменились. А в приложении показывайте последние пришедшие данные.
Я передаю этот массив раз в 200мс, сейчас изменил вообще на 500, и мне эта передача надо только для настройки.
думаю ограничить передачу временем, например передавать только первые 5 минут...
Если так сделать - то после 5-ти минут просто прекратить передачу, или можно и как то вообще отключить serial?
Идеально было бы передавать, только когда телефон подключен к блютуз модулю - но что то подобных примеров не нашел..
Или еще есть вариант, добавить кнопку, и по нажатии на нее активировать режим настроек, минут на 10 например!
Если сделать так, то как описать работу Serial в скетче? просто не принимать и не передавать данные? или и останавливать/запускать serial?