GPRS SIM900 и GPS NEO-6M не работают вместе

Я пытаюсь получить координаты GPS и отправить их в свой API через шилды GPRS SIM900 и GPS NEO-6M.

В setup() я сначала запускаю GPRS shield и вызываю функцию, которая подключается к интернету. Затем в loop() я начинаю захватывать GPS-координаты и, наконец, отправляю их в свой API, но мой код не работает с этой логикой. Я хотел бы подключиться один раз и получить GPS-координаты и отправить их в API много раз, выполняя отслеживание.

Приложение останавливается, если я запускаю код. connectToInternet() в setup() и getGpsPosition() в loop(). SIM900 shield подключается, но NEO6-M shield не отображает координаты. GPS фиксирует координаты только если я не подключаюсь к Интернету.

Может ли кто-нибудь мне помочь? Ниже приведен мой код и распечатка ответа на AT-команды.

#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <inetGSM.h>

static const int RXPin = 4, TXPin = 3;
InetGSM inet;
TinyGPSPlus gps;
SoftwareSerial serialGps(RXPin, TXPin);
char msg[50];
boolean started = false;
const char* dataCoord = "";

void setup() {
  // Последовательное соединение.
  Serial.begin(19200);
  Serial.print(F("------------------------------------------------- \r\n"));
  Serial.println(F("Starting App Tracking Arduino"));
  Serial.print(F("------------------------------------------------- \r\n"));
  // Включить GPRS
  powerUpGprs();
  // Запустить настройку шилда SIM900 со скоростью передачи данных.
  if (gsm.begin(2400)) {
    Serial.println(F("\nstatus=READY"));
    started = true;
  } else Serial.println(F("\nstatus=IDLE"));
  if (started)
    connectToInternet();
  // Запустить настройку шилда GPS NEO-6M со скоростью передачи данных.
  serialGps.begin(9600);
}

void loop() {
  // Этот скетч отображает информацию каждый раз, когда новое предложение правильно кодируется.
  while (serialGps.available() > 0)
    if (gps.encode(serialGps.read())) getGpsPosition();
}

/**
  Power up
*/
void powerUpGprs() {
  pinMode(9, OUTPUT);
  delay(100);
  digitalWrite(9, HIGH);
  Serial.println(F("\nPower Up SIM900!"));
}

/**
  Connect to Internet via GSM
*/
void connectToInternet() {
  Serial.print(F("\r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  Serial.print(F(" CONNECT TO INTERNET \r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  //Подключаем GPRS, указываем APN, имя пользователя и пароль.
  if (inet.attachGPRS("zap.vivo.com.br", "vivo", "vivo"))
    Serial.println(F("status=ATTACHED"));
  else
    Serial.println(F("status=ERROR"));
  delay(1000);
  //Прочитать IP-адрес.
  gsm.SimpleWriteln("AT+CIFSR");
}


/**
  Get GPS position
*/
void getGpsPosition() {
  Serial.print(F("\r\n\r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  Serial.print(F(" GET POSITON \r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  // геолокация
  TinyGPSDate &d = gps.date;
  TinyGPSTime &t = gps.time;
  char* timestamp;
  if (!d.isValid()) {
    timestamp = "00/00/0000 00:00:00";
  } else {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d",
      d.day(), d.month(), d.year(),
      t.hour(), t.minute(), t.second());
    timestamp = sz;
  }
  String position = String("");
  position.concat(String("timestamp=") + String(timestamp));
  position.concat(String("&latitude=") + String(gps.location.lat(), 6));
  position.concat(String("&longitude=") + String(gps.location.lng(), 6));
  position.concat(String("&altitude=") + String(gps.altitude.meters()));
  position.concat(String("&speed=") + String(gps.speed.kmph()));
  Serial.println(dataCoord);
  send2Api();
}

/**
  Send To API, The function inet.httpPOST(),
  this is submit method POST via http request
*/
void send2Api() {
  Serial.print(F("\r\n\r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  Serial.print(F(" SEND TO API\r\n"));
  Serial.print(F("------------------------------------------------- \r\n"));
  // Читать до тех пор, пока последовательный буфер не станет пустым.
  gsm.WhileSimpleRead();
  // TCP-клиент HTTP, отправьте запрос POST на сервер и сохраните ответ.
  int numdata = inet.httpPOST("api.myapp.com.br", 80, "/geolocations ", dataCoord, msg, 100);
  // Распечатать результаты.
  Serial.print(F("\nNumber of data received: "));
  Serial.println(numdata);
  Serial.print(F("\nData received: "));
  Serial.println(msg);
};

Если я подключаюсь к Интернету, GPS не отображает координаты.

Запустите приложение с connectToInternet() и getGpsPosition

Но если я не подключаюсь к интернету, GPS отображает координаты.

функция connectToInternet() пропущена

, 👍1

Обсуждение

Я решил... мое решение https://github.com/robsonfagundes/Arduino-GprsSIM900andGpsNEO-6M Я привел пример, чтобы помочь другим разработчикам, которые сталкиваются с такой же или похожей проблемой при совместной работе Gprs SIM900 и Gps NEO-6M., @Robson Fagundes

Добрый день, сэр. Возможно, при отправке местоположения на мобильный телефон есть ссылка на карту Google, чтобы я мог найти, где находится транспортное средство.? Какой код для этого?, @Cymon

@Cymon здесь https://github.com/robsonfagundes/arduino-gprs-sim-900-gps-neo-6m, @Robson Fagundes

и... здесь https://www.cooking-hacks.com/projects/arduino-realtime-gps-gprs-vehicle-tracking, @Robson Fagundes