GPS связь с Arduino - PullRequest
       56

GPS связь с Arduino

0 голосов
/ 10 ноября 2019

Я активно пытался соединить 'Ultimate Breakout 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);

}

Если я запускаю этот код на Arduino, то мой последовательный монитор будет читать следующее: (Обратите внимание, чтоBLYNK_WRITE (V11) - это прерывание, запускаемое, когда «виджет» GPS в обновлениях приложения BLYNK)

Test_Setup
userLat: 42.1978645
userLon: -83.1744308
Start of GetLocation
Start of readCartGPS
Start of clearCartGPS
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE
DEBUG: INSIDE WHILE

Однако, если я изолирую только код, относящийся к cartGPS, то Serial Monitor будет читать:

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

Что ожидается.

1 Ответ

0 голосов
/ 12 ноября 2019

Просто быстрый комментарий - вы можете вывести команду задержки из цикла void. Вы можете создать для него событие таймера и поместить timer.run в цикл void

...