Проблема чтения данных 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);
}
}
}
}
@engme, 👍0
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))
- Мой модуль Bluetooth HC-05 не работает
- Модуль HC-05 не получает команд и не спаривается
- Arduino с модулем Bluetooth HC-05 | Данные не передаются
- Управление esp32 с помощью клавиш клавиатуры
- Можете ли вы помочь мне сократить мой код?
- Неудачная загрузка скетч Bluetooth HC-05 - (порт и плата верны)
- модуль Bluetooth HC-05; два последовательных порта, COM4 и COM5
- Могу ли я заставить модуль BT отключиться от модуля BT и подключиться к другому в коде?