Как извлечь широту и долготу из GPS

Я хочу извлечь долготу и широту из модуля GSM/GPS, а затем загрузить их в ThingsSpeak. Я использую модуль sim808 GSM/GPS и AT+CGPSINF=0 для получения предложения с информацией о местоположении GPS (CGPSINF: 0,6.823375,80.001038,36.300000,20170705124133.000,0,10,0.037040,47.410000 ). Я хочу извлечь из него долготу и широту. Кто-нибудь знает как это делать? Я не эксперт в программировании. кто-то сказал мне использовать strtok. Но я не знаю, как это сделать. Есть ли у кого-нибудь код Arduino для этого?

Я попробовал библиотеку DFRobot SIM808 для сбора данных GPS. это работает как шарм. Но проблема заключалась в том, что мой код загрузки не работал, когда я использовал библиотеку для сбора долготы и широты в одном коде.

Это мой код загрузки в Интернет.

#include <SoftwareSerial.h>
#include <String.h>

SoftwareSerial mySerial(10, 11);//(2,3)


void setup()
{
  mySerial.begin(2400);   // скорость передачи данных GPRS 9600
  Serial.begin(2400);    // скорость передачи данных GPRS 9600

  delay(1000);

  ShowSerialData();

}

void loop()
{
      Send2Pachube();
  if (mySerial.available())
    Serial.write(mySerial.read());
}
void Send2Pachube()
{
  mySerial.println("AT");//начнем с внимания
  delay(1000);

  mySerial.println("AT+CPIN?");//проверяем наличие сим-карты
  delay(1000);

  mySerial.println("AT+CREG?");//проверяем регистрацию и технологию доступа ячейки
  delay(1000);

  mySerial.println("AT+CGATT?");//проверяем, подключено ли устройство к GPRS.0Detch,1Attch
  delay(1000);

  mySerial.println("AT+CIPSHUT");//закрываем контекст протокола пакетных данных
  delay(1000);

  mySerial.println("AT+CIPSTATUS");// возвращает текущий статус соединения
  delay(2000);

  mySerial.println("AT+CIPMUX=0"); //создаем соединение с несколькими IP(0=одиночное соединение)
  delay(2000);

  ShowSerialData();

  mySerial.println("AT+CSTT=\"hutch3g\"");//запускаем задачу и устанавливаем APN,
  delay(1000);

  ShowSerialData();

  mySerial.println("AT+CIICR");//подключаем беспроводное соединение
  delay(3000);
  ShowSerialData();

  mySerial.println("AT+CIFSR");//получить локальный IP-адрес
  delay(2000);
  ShowSerialData();



  mySerial.println("AT+CGPSINF=0");//получить GPS
  delay(2000);
  ShowSerialData();

  mySerial.println("AT+CIPSPRT=0");//запускает соединение TCP или UDP
  delay(3000);

  ShowSerialData();

  mySerial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");//запускаем соединение
  delay(6000);

  ShowSerialData();

  mySerial.println("AT+CIPSEND");//начинаем отправлять данные на удаленный сервер
  delay(4000);
  ShowSerialData();

  String str="GET https://api.thingspeak.com/update?api_key=FF19NVWMPZEWX0XK&field1=100";
  mySerial.println(str);//начинаем отправлять данные на удаленный сервер
  delay(4000);
  ShowSerialData();

  mySerial.println((char)26);//отправка
  delay(5000);//ждём ответа, важно! время зависит от состояния интернета
  mySerial.println();

  ShowSerialData();

  mySerial.println("AT+CIPSHUT");//закрываем соединение
  delay(100);
  ShowSerialData();
} 
void ShowSerialData()
{
  while(mySerial.available()!=0)
    Serial.write(mySerial.read());
}

, 👍0

Обсуждение

Поскольку библиотека работает над получением данных, возможно, вам следует сосредоточиться на том, чтобы заставить ее работать с вашим кодом., @Johnny Mopp


1 ответ


1

Во-первых, вместо того, чтобы просто выгружать данные на экран, сохраните данные в массиве символов

char dataBuffer[64];
int dataCount=0;

while ( (mySerial.available()!=0) && (dataCount<63) ) {
    dataBuffer[dataCount] = mySerial.read());
    dataCount++;
}
dataBuffer[dataCount] = 0;

затем используйте strtok, чтобы разделить строку на символы : и ,

char *output;
output = strtok(dataBuffer,":");
// вывод теперь будет указывать на все, вплоть до первого: поэтому "CGPSINF" для GPS
int field = 0;
while (output != null) {
  field++;
  output = strtok(null,",");
// вывод теперь будет указывать на каждое значение по очереди
// для CGPSINF:0,6.823375,80.001038,36.300000,
// когда поле == 1 вывод=="0"
// когда поле == 2 выход=="6.823375" и т.д...
}
,