Неверные данные, полученные в 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". Есть предложения??

спасибо,

, 👍1

Обсуждение

Казалось бы, то, что отправляет данные, отправляет что-то еще. Поскольку мы не можем видеть этот код, никто не может ничего сделать, кроме как догадываться, почему., @Delta_G

просто игнорируйте неожиданные данные, @jsotola

почему вы печатаете значение *command* после того, как изменили его значение?, @jsotola

примечание: замена \0 на \r и \n бессмысленна, @jsotola

Ваш HC-06 на самом деле работает со скоростью 9600 бод? Ваш последовательный монитор установлен на 9600 бод?, @Majenko


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, но ничего.

,