Bluetooth 与Arduino的GPS通信

Bluetooth 与Arduino的GPS通信,bluetooth,gps,blynk,Bluetooth,Gps,Blynk,我一直在积极尝试将“终极突破GPS v3”与Ardunio UNO连接起来&同时运行BLYNK应用程序。我有一个功能齐全的GPS模块在自己的草图中工作,我还有一个功能齐全的BLYNK应用程序在自己的草图中工作。然而,当我试图将代码组合起来让GPS和BLYNK应用程序一起工作时,我的GPS代码陷入了一个while循环。我认为这可能与我在应用程序和GPS模块中使用的软件串行通信有关,但我现在在大学学习这些概念还是新手。我只能考虑附加整个代码,以便您可以看到正在发生的事情 //Bluetooth/Bl

我一直在积极尝试将“终极突破GPS v3”与Ardunio UNO连接起来&同时运行BLYNK应用程序。我有一个功能齐全的GPS模块在自己的草图中工作,我还有一个功能齐全的BLYNK应用程序在自己的草图中工作。然而,当我试图将代码组合起来让GPS和BLYNK应用程序一起工作时,我的GPS代码陷入了一个while循环。我认为这可能与我在应用程序和GPS模块中使用的软件串行通信有关,但我现在在大学学习这些概念还是新手。我只能考虑附加整个代码,以便您可以看到正在发生的事情

//Bluetooth/Blynk Definitions

#define BLYNK_USE_DIRECT_CONNECT
#define BLUETOOTH_TX_PIN 10
#define BLUETOOTH_RX_PIN 11

#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
//#include <BlynkSimpleStream.h>
#include <BlynkSimpleSerialBLE.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>

//Cart GPS Definitions
#define GPS_TX_PIN 4
#define GPS_RX_PIN 5



char auth[] = "ruf1xsvCA3b-YPsR8CTGT2CgYwEYj78t";


//Serial Setups

SoftwareSerial bluetoothSerial(BLUETOOTH_TX_PIN, BLUETOOTH_RX_PIN); //(10,11)
SoftwareSerial cartSerial(GPS_TX_PIN, GPS_RX_PIN); //(4,5)


//Global Varibles

int x, y; //X,Y for Joystick Data
String NMEA1; //variable for first NMEA sentence
String NMEA2; //variable for second NMEA sentence
double cartLat, cartLon; 
char c; //to read characters coming from GPS

struct GeoLoc {
  float lat;
  float lon;
};

GeoLoc cartLoc;




//Joystick
BLYNK_WRITE(V10) {
  x = param[0].asInt(); // It extracts the x value of the Joystick inlcuded in the Mobile APP Blynk
  y = param[1].asInt(); // It extracts the y value of the Joystick inlcuded in the Mobile APP Blynk

  Serial.print("JoyX:"); Serial.println(x);
  Serial.print("JoyY:"); Serial.println(y);
}

//User GPS
double userLon, userLat, userAlt, userSpeed;
BLYNK_WRITE(V11) {
  GpsParam gps(param);
  userLon = gps.getLon();
  userLat = gps.getLat();
  userAlt = gps.getAltitude();
  userSpeed = gps.getSpeed();

  Serial.print("userLat: "); Serial.println(userLat, 7);
  Serial.print("userLon: "); Serial.println(userLon, 7);

  cartLoc = getLocation();

  Serial.print("cartLat: "); Serial.println(cartLoc.lat, 7);
  Serial.print("cartLon: "); Serial.println(cartLoc.lon, 7);

}

//cartGPS

Adafruit_GPS cartGPS(&cartSerial);


void readCartGPS(){

  Serial.print("Start of readCartGPS");
  clearCartGPS();
  Serial.print("Start of Whileloop");
  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
    Serial.print("Inside");
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence
  NMEA1 = cartGPS.lastNMEA();

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }
  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence
  NMEA2 = cartGPS.lastNMEA();


  Serial.print("NMEA1:"); Serial.print(NMEA1);
  Serial.print("NMEA2:"); Serial.println(NMEA2);
}

void clearCartGPS(){  //Clear old and corrupt data from Serial Port

  Serial.print("Start of clearCartGPS");
  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
    Serial.println("DEBUG: INSIDE WHILE");
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

  while(!cartGPS.newNMEAreceived()){ //loop until we have a good NMEA sentence
    c = cartGPS.read();
  }

  cartGPS.parse(cartGPS.lastNMEA()); //parse last good NMEA sentence

}

GeoLoc getLocation(){

    Serial.print("Start of GetLocation");
    readCartGPS();
    Serial.print("After readCartGPS is run");
    delay(300);

    cartLat = cartGPS.latitude;
    char latDirection = cartGPS.lat;
    if(latDirection == 'S'){
      cartLat = -1 * cartLat;
    }

    cartLon = cartGPS.longitude;
    char lonDirection = cartGPS.lon;
    if(lonDirection == 'W'){
      cartLon = -1 * cartLon;
    }



    cartLoc.lat = cartLat;
    cartLoc.lon = cartLon; 

//    Serial.print("Cart Latitude: "); Serial.println(cartLat, 7);
//    Serial.print("");
//    
//    Serial.print("Cart Longitude: "); Serial.println(cartLon, 7);
//    Serial.print("");

    return(cartLoc);

}


void setup() {

  Serial.begin(4800);

  cartGPS.begin(9600);
  cartGPS.sendCommand("$PGCMD,33,0*6D"); //Turn off antenna update message
  cartGPS.sendCommand(PMTK_SET_NMEA_UPDATE_10HZ); //Set update rate to 10Hz
  cartGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //Request RMC and GGA sentences only

  bluetoothSerial.begin(9600);
  Blynk.begin(bluetoothSerial, auth);
  Serial.println("Test_Setup");

}

void loop() {

  Blynk.run();

  delay(100);

}
但是,如果我仅隔离与cartGPS相关的代码,则串行监视器将读取:

NMEA1:$GPRMC,232347.000,A,4211.8708,N,08310.4676,W,0.08,78.84,091119,,,A*4D
NMEA2:$GPGGA,232348.000,4211.8708,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5C

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734
NMEA1:$GPRMC,232350.000,A,4211.8707,N,08310.4676,W,0.06,164.81,091119,,,A*73
NMEA2:$GPGGA,232351.000,4211.8707,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5B

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734

这是意料之中的。

只是一个简短的评论-您可能希望将delay命令从您的void循环中删除。您可以为它创建一个计时器事件,并将timer.run放入void循环

嗨,Robin,我去掉了延迟,它似乎对程序没有任何影响。谢谢你的评论。您对上述计划问题还有其他想法吗?
NMEA1:$GPRMC,232347.000,A,4211.8708,N,08310.4676,W,0.08,78.84,091119,,,A*4D
NMEA2:$GPGGA,232348.000,4211.8708,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5C

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734
NMEA1:$GPRMC,232350.000,A,4211.8707,N,08310.4676,W,0.06,164.81,091119,,,A*73
NMEA2:$GPGGA,232351.000,4211.8707,N,08310.4675,W,1,08,1.06,171.9,M,-33.9,M,,*5B

Cart Latitude: 4211.8706054
Cart Longitude: -8310.4677734