Не стабильный обмен и работа с 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?