Проблема чтения данных Arduino Bluetooth HC-05

У меня проблема с модулем bluetooth HC-05 и сервоприводами. Если я ввожу терминал Bluetooth 4,1, я хочу, чтобы сервопривод 1 поворачивался на 60 градусов 3 раза. На короткое время сервопривод 1 поворачивается на 60 градусов, затем сервопривод 2 поворачивается на 180 и поворачивается назад, и снова сервопривод 1 поворачивается на 60 градусов и так далее.

Bluetooth смешивает числа. Если я набираю «1», это дает мне «49», и поэтому система не работает должным образом. Как решить эту проблему с данными?

#include <Servo.h>
#include <SoftwareSerial.h>



Servo myservo1;
Servo myservo2;
long players, cards;
int pos1 = 0;
int pos2 = 0;
int servo;
int pos = 0;
int deal = 0;

SoftwareSerial BT(2,3);

void setup() {
  Serial.begin(9600);
  BT.begin(9600);
  myservo1.attach(10);
  myservo2.attach(11);
  servo = 90;



}

void loop() {
  if(BT.available()>0) {
    players = BT.read();
    cards = BT.read();

    Serial.println(players);
    Serial.print(cards);

    pos = 180/(players-1);
    for(deal = 0; deal < cards; deal++) {
      for (pos1 = 0; pos1 <= 180 ; pos1 += pos ) { 
          delay(20);
          myservo1.write(pos1);

          for (pos2=0; pos2<=180 ; pos2 +=1){
            myservo2.write(pos2);
            delay(10);
          }

          for (pos2=180; pos2>=0 ; pos2 -=1){
            myservo2.write(pos2);
            delay(15);
          }

    }
      for (pos1 <= 180; pos1 >= 0; pos1 -=1 ) {
          pos2=0;
          myservo1.write(pos1);  
          delay(10);
      }
    }

  }
}

, 👍0


1 ответ


1

Вы смешиваете символы ASCII и целые значения.

Последовательные данные представляют собой чистый двоичный поток, последовательность байтов. Программы с обеих сторон должны интерпретировать, что означают эти байты. Когда вы вводите 1 в последовательное приложение Bluetooth, оно уже делает это. Он соответствует стандарту ASCII, который придает значение каждому двоичному значению от 0 до 127. Google "ASCII", чтобы получить таблицу сопоставления. Каждый символ (буквенно-цифровой и некоторые специальные символы и управляющие символы) имеет связанное с ним двоичное значение. Таким образом, мы можем интерпретировать поток двоичных данных как текст.

Символ ASCII 1 соответствует десятичному значению 49. Вы сохраняете прочитанный байт из последовательного интерфейса Bluetooth как long, что является большим целым числом. Итак, когда вы печатаете его, вы увидите десятичное значение, равное 49.

Что теперь делать? Самый простой способ — вычесть значение ASCII '1' из полученного байта:

players = BT.read() - '0';

'0' — это представление C/C++ одного символа в кодировке ASCII. Это то же самое, что вычитание десятичного значения 48, но немного понятнее, что здесь происходит. Мы сдвигаем ряд чисел (от 0 до 9) с позиции 48 на позицию 0. Таким образом, ASCII '0' преобразуется в десятичный 0, ASCII '1' до десятичной 1 и так далее до 9.

Примечание. Возможно, вы захотите убедиться, что для этих переменных используются только числа, так как принцип приведет к искажению данных, когда пользователь вводит некоторые другие символы. Вам нужно будет прочитать двоичные данные во временную переменную (здесь она называется c), а затем проверить, являются ли они числовыми. Либо вручную:

if(c >= '0' && c <= '9')

или удобной функцией

if(isDigit(c))
,