Неверные данные, полученные в Arduino по bluetooth
Я запрограммировал клиент-сервер между Arduino и моим мобильным приложением на Android. Я использую buetoot HC-06. На данный момент это очень простой код, который просто включает и выключает светодиод, регулирует его напряжение и получает заряд батареи.
Это мой код Arduino для получения сообщения:
#include <SoftwareSerial.h>
#include <TimerOne.h>
SoftwareSerial hc06(2,3);
char command;
String string;
boolean ledon = false;
const byte MAX_STRING_LEN = 40;
const int BLINK_INTERVAL = 1000;
char inputString[MAX_STRING_LEN]; // строка для хранения входящих данных
int BatteryPin = A0; // выбираем входной контакт для потенциометра
int sensorValue = 0; // переменная для хранения значения, поступающего с датчика
float BatteryCar = 0;
int PercentageBatt = 0;
int intensidad = 0;
byte strLen = 0; // текущая длина записанной строки
#define led 11
void setup()
{
Serial.begin(9600);
hc06.begin(9600);
pinMode(led, OUTPUT);
Timer1.initialize(10000); // устанавливаем таймер длиной 10000 микросекунд (или 0,01 сек - или 1Гц => светодиод будет мигать 5 раз, 5 циклов включения и выключения, в секунду)
Timer1.attachInterrupt( SendVoltage );
}
void loop()
{
sensorValue = analogRead(BatteryPin);
BatteryCar = sensorValue * (5.0 / 1023.0);
if (hc06.available() == 0)
{
analogWrite(led, 0);
delay (10);
}
while(hc06.available() > 0)
{
command = ((byte)hc06.read());
if((command == '\n') || (command == '\r'))
{
command =='\0';
break;
}
else if (command == 'O')
analogWrite(led, 255);
else
analogWrite(led, 0);
delay(10);
Serial.println(command);
}
}
void SendVoltage ()
{
PercentageBatt = (BatteryCar * 100)/4;
hc06.println(PercentageBatt);
}
Вот данные, которые я получаю:
Предполагалось, что я должен получить только "O" или "F". Есть предложения??
спасибо,
@PartnerTech, 👍1
Обсуждение1 ответ
Лучший ответ:
Ну, после долгих исследований выяснилось, что моя главная проблема заключалась в том, что я получаю и отправляю информацию одновременно. А с библиотекой Softwareserial одновременно может быть активен только 1. Я нашел два решения, но, честно говоря, ни одно из них меня не полностью удовлетворило. Однако для моего приложения подойдет.
Первое решение: использовать сам HardwareSerial (контакты 0,1) вместо использования контактов 2 и 3. Когда я их использовал, проблем не было. Хотя я решил не использовать, потому что это помогает мне отлаживать мой код.
Второе решение: уменьшить частоту отправляемых сообщений. Для меня это нормально, я отправляю данные каждую секунду. Итак, мой код будет таким:
#include <SoftwareSerial.h>
#include <TimerOne.h>
SoftwareSerial hc06(2,3);
char command;
String string;
boolean ledon = false;
const byte MAX_STRING_LEN = 40;
const int BLINK_INTERVAL = 1000;
char inputString[MAX_STRING_LEN]; // строка для хранения входящих данных
int BatteryPin = A0; // выбираем входной контакт для потенциометра
int sensorValue = 0; // переменная для хранения значения, поступающего с датчика
float BatteryCar = 0;
int PercentageBatt = 0;
int intensidad = 0;
byte strLen = 0; // текущая длина записанной строки
#define led 11
void setup()
{
Serial.begin(9600);
hc06.begin(9600);
pinMode(led, OUTPUT);
Timer1.initialize(1000000);
Timer1.attachInterrupt( SendVoltage );
}
void loop()
{
sensorValue = analogRead(BatteryPin);
BatteryCar = sensorValue * (5.0 / 1023.0);
if (hc06.available() == 0)
{
analogWrite(led, 0);
delay (10);
}
while(hc06.available() > 0)
{
command = ((byte)hc06.read());
if((command == '\n') || (command == '\r'))
{
command =='\0';
break;
}
else if (command == 'O')
analogWrite(led, 255);
else
analogWrite(led, 0);
delay(10);
Serial.println(command);
}
}
void SendVoltage ()
{
PercentageBatt = (BatteryCar * 100)/4;
hc06.println(PercentageBatt);
}
Я прочитал об этой библиотеке (AltSoftSerial), но не смог заставить ее работать. У меня есть контакты 8 и 9, но ничего.
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Отправка целого числа> 1 байта с Android на Arduino через последовательный порт
- Bluetooth: время синхронизации с NTP-сервера через интернет-соединение, совместно используемое с телефоном Android.
- Bluetooth: прочитайте предоставленное пользователем значение, а затем получите время с телефона Android.
- Можно ли измерить скорость акселерометром? Насколько точно?
- Модуль Bluetooth HC-05 возвращает закодированные данные
- Мой модуль Bluetooth HC-05 не работает
- Модуль AT-команд HM10 BLE — не работает
Казалось бы, то, что отправляет данные, отправляет что-то еще. Поскольку мы не можем видеть этот код, никто не может ничего сделать, кроме как догадываться, почему., @Delta_G
просто игнорируйте неожиданные данные, @jsotola
почему вы печатаете значение *command* после того, как изменили его значение?, @jsotola
примечание: замена \0 на \r и \n бессмысленна, @jsotola
Ваш HC-06 на самом деле работает со скоростью 9600 бод? Ваш последовательный монитор установлен на 9600 бод?, @Majenko