Данные датчика двойного типа не отображаются в приложении терминала Bluetooth на телефоне

Привет, я работаю над проектом, в котором я должен сказать, бежит ли человек/стоит/идет и идет ли он вверх/вниз по лестнице или он идет по прямой дороге. Человек будет нести модуль arduino uno, к которому подключены GPS, Bluetooth и датчик высоты. Также я пытаюсь отправить на свой телефон его скорость и текущую высоту, которую он испытывает, используя Bluetooth-модуль HC-05. Я уверен, что нет проблем с датчиком высоты. Также я должен отметить, что мой модуль GPS (GY_NE06MV2) работает неправильно, когда речь идет о скорости человека. Я считаю, что это потому, что я экспериментировал в своем доме, а не на улице. Проблема в том, что я не вижу данные о скорости и высоте над уровнем моря в приложении Bluetooth-терминала "ArduTooth" на моем телефоне. Это как пустое место, которое должно было быть моими данными. Я представляю свой код, который не очень длинный, и я надеюсь, что вы поможете мне разобраться с этим.

#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

TinyGPSPlus gps; // объект GPS, который будет использоваться
SoftwareSerial BTserial(10, 11); //последовательное соединение bluetooth
SoftwareSerial gps_serial(4,3); //последовательное соединение gps
Adafruit_BME280 bme; //объект датчика измерения высоты

#define SEALEVELPRESSURE_HPA (1011) //давление на уровне моря в Турции/Эскишехир

double speed = 0; //скорость движущегося тела
double current_altitude = 0;
double previous_altitude = 0;

void setup() {
Serial.begin(115200); // последовательное подключение к компьютеру
BTserial.begin(9600);
gps_serial.begin(9600);
bme.begin(0x76);

delay(3000);

previous_altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

}

void loop() {
//данные с gps-устройства передаются на gps-объект
while (gps_serial.available() > 0){
    gps.encode(gps_serial.read());
}

if(gps.speed.isValid()){
speed = gps.speed.kmph();
BTserial.write(speed); // вот где проблема-1, эти данные не отображаются на мобильном телефоне
bluetooth terminal application
BTserial.write(",");

  if(speed <= 5 && speed > 0.5){
    BTserial.write("walking");
    BTserial.write(","); 
  }
  if(speed <= 0.5){
    BTserial.write("standing");
    BTserial.write(",");
  }
  if(speed > 5){
    BTserial.write("running");
    BTserial.write(","); 
  }

  }else{
    BTserial.write("m.s.n.n"); //обозначает "статус перемещения неизвестен"
    BTserial.write(",");  
  }

current_altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
BTserial.write(current_altitude); //вот где проблема-2, эти данные тоже не отображаются
on phone
BTserial.write(",");
//эта часть определяет, идет ли тело вверх или вниз по лестнице, или он идет по прямой дороге
if(current_altitude - previous_altitude >= 0.7){
  BTserial.write("going ups.");
  previous_altitude = current_altitude;  
}
if(previous_altitude - current_altitude >= 0.7){
  BTserial.write("going downs.");
  previous_altitude = current_altitude; 
}
if((current_altitude - previous_altitude <= 0.3) || (previous_altitude - current_altitude <= 
0.3)){
  BTserial.write("on s.r");
  previous_altitude = current_altitude;  
}
BTserial.write(";");

delay(1000);

}

Я должен отметить, что цель BTserial.write(","); заключается в том, что каждая отдельная запись, отправляемая на телефон через Bluetooth, должна быть разделена знаком ",".

, 👍1

Обсуждение

Вы убедились, что ваше последовательное соединение Bluetooth работает? Я имею в виду без всего остального кода. Также вы используете метод записи, который в основном используется для двоичных данных. Я предполагаю, что вы хотите передать дару в кодировке ASCII, поэтому вам нужно использовать print() для передачи переменной высоты, @chrisl

Модуль Bluetooth работает нормально, я это гарантировал. Я попробую это спасибо. Также не могли бы вы рассказать мне о модуле gps, который меня огорчает, так как он не дает скорости. Я думаю, это потому, что я дома провожу эксперименты. Я использую для этого библиотеку tinygps++ и ее функции., @EEstudent


2 ответа


1

Вы можете преобразовать двойные данные в строковый тип. Этот трюк может помочь. И вы также можете просто отправить байт для разных позиций и расшифровать их в приложении.

,

0

SoftwareSerial — очень плохо работающая библиотека. Он блокирует прерывания при отправке или получении байтов. Использование его с тем, что зависит от прерывания напрашивается на неприятности. Использование двух экземпляров SoftwareSerial одновременно вызывает двойную тревогу. Это очень вероятно, что они мешают друг другу, так как каждый из них блокирует прерывания на неоправданно долгое время, и каждый полагается на прерывания для обнаружения входящих данных.

Похоже, вы не используете аппаратный последовательный интерфейс (Serial), это позор, так как это единственный последовательный порт, который у вас есть, который работает действительно хорошо. Я предлагаю вам попробовать использовать этот интерфейс для одного из ваших устройства (возможно, GPS) и единый программный интерфейс для других один.

Или, что еще лучше, используйте Serial для обоих. Передающая и принимающая части последовательный порт довольно независимы, за исключением того факта, что они работают с той же скоростью. Вы можете использовать часть передачи для Bluetooth модуль и приемная часть для GPS. Это должно обеспечить надежную связь с обоими устройствами, никогда не блокируя прерывания для слишком долго.

,