Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Tracker APRS do samochodu
SQ2PPJ Offline
Nowicjusz
*

Liczba postów: 19
Dołączył: 17-07-2014
Post: #9
RE: Tracker APRS do samochodu
Po małych przeróbkach kod wygląda tak:
Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial gps(3, 4);

void setup()
{
Serial.begin(115200);
gps.begin(9600);
}
void loop()
{
String gps_data = "";
String gps_gpgga = "";

while (gps.available())
{
  gps_data = gps_data + char(gps.read());  
}
if (gps_data != "")
{
  int pos_b = gps_data.indexOf('$GPGGA');
  int pos_e = gps_data.indexOf('*');
  gps_gpgga = gps_data.substring(pos_b-5,pos_e);
  Serial.println(gps_gpgga);
}
}

A dane wyjściowe -tak:
Cytat:$GPGGA,081849.000,5428.5809,N,01822.3485,E,1,8,0.9​5,165.6,M,34.0,M,,
$GPGGA,081850.000,5428.5807,N,01822.3490,E,1,8,0.9​6,165.5,M,34.0,M,,
$GPGGA,081851.000,5428.5809,N,01822.3490,E,1,8,0.9​6,165.4,M,34.0,M,,
$GPGGA,081852.000,5428.5810,N,01822.3491,E,1,8,0.9​6,165.3,M,34.0,M,,
$GPGGA,081853.000,5428.5810,N,01822.3493,E,1,8,0.9​5,165.3,M,34.0,M,,
$GPGGA,081854.000,5428.5808,N,01822.3496,E,1,8,0.9​5,165.2,M,34.0,M,,
$GPGGA,081855.000,5428.5806,N,01822.3498,E,1,8,0.9​6,165.1,M,34.0,M,,
$GPGGA,081856.000,5428.5806,N,01822.3495,E,1,8,0.9​5,165.1,M,34.0,M,,
$GPGGA,081857.000,5428.5804,N,01822.3496,E,1,8,0.9​5,165.1,M,34.0,M,,
$GPGGA,081858.000,5428.5803,N,01822.3497,E,1,8,0.9​5,165.0,M,34.0,M,,

Odczyt z GPS-u uznaje tymczasowo za zamknięty, choć nie jestem z niego w 100% zadowolony - zdecydowałem się korzystać z łańcucha GPGGA, ponieważ z GPRMC nadal mam problemy. Pętla while zastosowana w programie "wrzuca" do string-a tylko taki fragment danych:
Cytat:$GPGGA,083936.000,5428.5816,N,01822.3504,E,1,7,1.0​4,164.7,M,34.0,M,,*50
$GPGSA,A,34,1,,3,.
,.056,2E430,AP34,,.3
Mimo, że pełne dane wyglądają tak:
Cytat:$GPGGA,070017.000,5428.5821,N,01822.3515,E,1,7,0.9​​9,162.6,M,34.0,M,,*50
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,$GPGGA,070019.​​000,5428.5822,N,01822.3513,E,1,7,0.99,162.6,M,34.​0​,M,,*5B
$GPGSA,A,3,24,26,28,12,15,18,22,,,,,,1.33,0.99,0.8​​9*04
$GPRMC,070019.000,A,5428.5822,N,01822.3513,E,0.26,​​118.04,290714,,,A*6B
$GPVTG,118.04,T,,M,0.26,N,0.48,K,A*39

Niemniej dane z łańcucha GPGGA są dla mnie, na tę chwilę, wystarczające dla osiągnięcia zamierzonego celu, więc dalsze testy spycham na razie na dalszy plan.

Dodałem obróbkę danych i w tej chwili wygląda to tak:
Kod:
#include <SoftwareSerial.h>
#include<string.h>
#include <Wire.h>

SoftwareSerial gps(3, 4);

void setup()
{
Serial.begin(115200);
gps.begin(9600);
}

void loop()
{
String gps_data, gps_gpgga;
int coma1,coma2,coma3,coma4,coma5,coma6,coma7;
while (gps.available())
  {
    gps_data = gps_data + char(gps.read());  
   }

if (gps_data != "")
{
  int pos_b = gps_data.indexOf('$GPGGA');
  int pos_e = gps_data.indexOf('*');
  gps_gpgga = gps_data.substring(pos_b-5,pos_e);
  coma1 = gps_gpgga.indexOf(',');
  coma2 = gps_gpgga.indexOf(',',coma1+1);
  coma3 = gps_gpgga.indexOf(',',coma2+1);
  coma4 = gps_gpgga.indexOf(',',coma3+1);
  coma5 = gps_gpgga.indexOf(',',coma4+1);
  coma6 = gps_gpgga.indexOf(',',coma5+1);
  coma7 = gps_gpgga.indexOf(',',coma6+1);
  int fix = gps_gpgga.substring(coma6+1,coma6+2).toInt();
  if (fix=1)
   {
    int hh = gps_gpgga.substring(coma1+1,coma1+3).toInt();
    int mm = gps_gpgga.substring(coma1+3,coma1+5).toInt();
    int ss = gps_gpgga.substring(coma1+5,coma1+7).toInt();
    Serial.print("Time: ");Serial.print(hh,DEC);Serial.print(":");Serial.print(mm,DEC);Serial.print(":");Serial.println(ss,DEC);
    String lat =  gps_gpgga.substring(coma2+1,coma3) + gps_gpgga.substring(coma3+1,coma3+2);
    Serial.print("Latitude: ");Serial.println(lat);
    String lon =  gps_gpgga.substring(coma4+1,coma5) + gps_gpgga.substring(coma5+1,coma5+2);
    Serial.print("Longitude: ");Serial.println(lon);
   }
  else
   {
    Serial.print("Waiting for GPS fix");
   }
  }
}

I na serial monitor wysyłane są dane w postaci:
Cytat:Time: 9:51:48
Latitude: 5428.5841N
Longitude: 01822.3546E
Time: 9:51:49
Latitude: 5428.5841N
Longitude: 01822.3556E
Time: 9:51:50
Latitude: 5428.5837N
Longitude: 01822.3577E
Time: 9:51:51
Latitude: 5428.5832N
Longitude: 01822.3594E
(Ten post był ostatnio modyfikowany: 30-07-2014 11:52 przez SQ2PPJ.)
30-07-2014 10:43
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
Tracker APRS do samochodu - SQ2PPJ - 17-07-2014, 11:42
RE: Tracker APRS do samochodu - SQ2PPJ - 30-07-2014 10:43

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości