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