Toon posts:

GPS logger op basis van Arduino

Pagina: 1
Acties:

  • hendrilankamp
  • Registratie: Juni 2009
  • Laatst online: 14-01 18:31
Goedemiddag tweakers,

Sinds een tijdje ben ik bezig met een corona projectje namelijk een GPS logger. Het idee is om voor de mountainbike wedstrijden dit zomer een logger te maken die via een webpagina bekeken kan worden.
Op deze webpagina zouden de volgende gegevens zichtbaar moeten zijn: positie, hoogte, snelheid en temperatuur. Dit wil ik graag op een map zichtbaar maken zodat men kan zien hoever je gevorderd bent (is het een optie om een overlay van de route ook in te laden? in de vorm van GPX oid?)


Eerst ben ik begonnen met het verzamelen van de hardware namelijk:
  • Arduino UNO
  • Sim800L voor de data overdracht
  • Neo 8m Gps module
  • DHT22 voor de temperatuur


Nu heb ik doormiddel van veel YouTube filmpjes en tutorials het zover dat positie en snelheid worden weggeschreven naar een database doormiddel van een php script, helaas lukt het mij nog niet om hier waardes uit de DHT22 in mee te sturen. Zie onderstaande code van de Arduino:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <AltSoftSerial.h>
#include "cactus_io_DHT22.h"

#define rxPin 2         // what pin on the arduino is the Sim800 data line connected to
#define txPin 3         // what pin on the arduino is the Sim800 data line connected to
#define DHT22_PIN 7     // what pin on the arduino is the DHT22 data line connected to
SoftwareSerial sim800L(rxPin,txPin); 

//GPS Module RX pin to Arduino 9
//GPS Module TX pin to Arduino 8
AltSoftSerial neogps;

TinyGPSPlus gps;

unsigned long previousMillis = 0;
long interval = 1000;


void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(115200);
  
  //Begin serial communication with Arduino and SIM800L
  sim800L.begin(9600);

  //Begin serial communication with Arduino and SIM800L
  neogps.begin(9600);

  Serial.println("Initializing...");
  //delay(10000);

  //Once the handshake test is successful, it will back to OK
  sendATcommand("AT", "OK", 2000);
  sendATcommand("AT+CMGF=1", "OK", 2000);
  //sim800L.print("AT+CMGR=40\r");
  
}

void loop()
{
  while(sim800L.available()){
    Serial.println(sim800L.readString());
  }
  while(Serial.available())  {
    sim800L.println(Serial.readString());
  }

    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
       previousMillis = currentMillis;
       sendGpsToServer();
    }
}

int sendGpsToServer()
{
    //Can take up to 60 seconds
    boolean newData = false;
    for (unsigned long start = millis(); millis() - start < 2000;){
      while (neogps.available()){
        if (gps.encode(neogps.read())){
          newData = true;
          break;
        }
      }
    }
  
    //If newData is true
    if(true){
      newData = false;
      
      String latitude, longitude;
      float altitude;
      unsigned long date, time, speed, satellites;
  
      latitude = String(gps.location.lat(), 6); // Latitude in degrees (double)
      longitude = String(gps.location.lng(), 6); // Longitude in degrees (double)
      altitude = gps.altitude.meters(); // Altitude in meters (double)
      date = gps.date.value(); // Raw date in DDMMYY format (u32)
      time = gps.time.value(); // Raw time in HHMMSSCC format (u32)
      speed = gps.speed.kmph();
      
      Serial.print("Latitude= "); 
      Serial.print(latitude);
      Serial.print(" Longitude= "); 
      Serial.println(longitude);
      Serial.println (" speed kmph=");
      Serial.println (speed);
    
  
      //if (latitude == 0) {return 0;}
      
      String url, temp;
      url = "http://gps.medialan.nl/gpsdata.php?lat=";
      url += latitude;
      url += "&lng=";
      url += longitude;
      url += "&speed=";
      url += speed;

     
      Serial.println(url);    
      delay(300);
          
    sendATcommand("AT+CFUN=1", "OK", 2000);
    //AT+CGATT = 1 Connect modem is attached to GPRS to a network. AT+CGATT = 0, modem is not attached to GPRS to a network
    sendATcommand("AT+CGATT=1", "OK", 2000);
    //Connection type: GPRS - bearer profile 1
    sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"", "OK", 2000);
    //sets the APN settings for your network provider.
    sendATcommand("AT+SAPBR=3,1,\"APN\",\"internet\"", "OK", 2000);
    //enable the GPRS - enable bearer 1
    sendATcommand("AT+SAPBR=1,1", "OK", 2000);
    //Init HTTP service
    sendATcommand("AT+HTTPINIT", "OK", 2000); 
    sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 1000);
  
    sim800L.print("AT+HTTPPARA=\"URL\",\"");
    sim800L.print(url);
    sendATcommand("\"", "OK", 1000);
    //Set up the HTTP action
    sendATcommand("AT+HTTPACTION=0", "0,200", 1000);
    //Terminate the HTTP service
    sendATcommand("AT+HTTPTERM", "OK", 1000);
    //shuts down the GPRS connection. This returns "SHUT OK".
    sendATcommand("AT+CIPSHUT", "SHUT OK", 1000);

  }
  return 1;    
}

int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){

    uint8_t x=0,  answer=0;
    char response[100];
    unsigned long previous;

    //Initialice the string
    memset(response, '\0', 100);
    delay(100);
    
    //Clean the input buffer
    while( sim800L.available() > 0) sim800L.read();
    
    if (ATcommand[0] != '\0'){
      //Send the AT command 
      sim800L.println(ATcommand);
    }

    x = 0;
    previous = millis();

    //this loop waits for the answer with time out
    do{
        //if there are data in the UART input buffer, reads it and checks for the asnwer
        if(sim800L.available() != 0){
            response[x] = sim800L.read();
            //Serial.print(response[x]);
            x++;
            // check if the desired answer (OK) is in the response of the module
            if(strstr(response, expected_answer) != NULL){
                answer = 1;
            }
        }
    }while((answer == 0) && ((millis() - previous) < timeout));

  Serial.println(response);
  return answer;
}

//AT+CFUN=1
//AT+CGATT=1
//AT+SAPBR=3,1,"Contype","GPRS"
//AT+SAPBR=3,1,"APN","internet"
//AT+SAPBR=1,1


Wat heb ik al geprobeerd om de DHT22 waarde's toe te voegen? heb op dezelfde manier als de snelheid deze waarde's geprobeerd mee te sturen namelijk:
code:
1
(Serial.println dht.temperature_C); & (Serial.println dht.humidity);


Helaas blijf ik de melding houden dat de DHT sensor eerst ergens declared moet worden. Dit heb ik geprobeerd om dit stukje code uit een ander project te plakken:
code:
1
DHT22 dht(DHT22_PIN);


Helaas krijg ik het niet voor elkaar dat deze waardes in de url komen waardoor ik ze dus ook niet in de database kan opnemen.

De eerste uitdaging, hoe krijg ik de temperatuur en de luchtvochtigheid ook in mijn database.

Dan het tweede, dat is het presenteren van de gegevens. via google heb ik gevonden dat ze markers maken in google maps, hierdoor kun je zien waar je geweest bent. Helaas geeft dit geen live informatie weer en zien we markers, niet de route die is afgelegd. iemand enig idee met wat voor een tooling ik deze informatie live kan laten weergeven?

Huidige maps: gps.medialan.nl screenshot:
Gegevens database:

ik hoor graag of tweakers hier ervaring mee hebben en tips en tricks hebben om het gewenste resultaat te bereiken. Mocht het allemaal naar behoren werken zal ik er een PCB van laten maken, heb al contact gehad met verschillende zzp's op het platform Fivver.


Alvast bedankt.


Met vriendelijke groet,
Hendri

  • dragonhaertt
  • Registratie: Februari 2011
  • Laatst online: 22:21
hendrilankamp schreef op dinsdag 8 februari 2022 @ 13:17:
Helaas blijf ik de melding houden dat de DHT sensor eerst ergens declared moet worden. Dit heb ik geprobeerd om dit stukje code uit een ander project te plakken:
code:
1
DHT22 dht(DHT22_PIN);



Helaas krijg ik het niet voor elkaar dat deze waardes in de url komen waardoor ik ze dus ook niet in de database kan opnemen.
Is die bovenstaande printline wél gelukt, en krijg je hem alleen niet in je URL? Of lukt het je uberhaupt niet om die dht.temperature_C op te vragen?

In ieder geval zal je
code:
1
2
3
4
5
6
7
    String url, temp;
      url = "http://gps.medialan.nl/gpsdata.php?lat=";
      url += latitude;
      url += "&lng=";
      url += longitude;
      url += "&speed=";
      url += speed;


moeten bijwerken om ook de DHT data toe te voegen.
Dan het tweede, dat is het presenteren van de gegevens. via google heb ik gevonden dat ze markers maken in google maps, hierdoor kun je zien waar je geweest bent. Helaas geeft dit geen live informatie weer en zien we markers, niet de route die is afgelegd. iemand enig idee met wat voor een tooling ik deze informatie live kan laten weergeven?
Als je je data (live) mooi in wil zien zal je een manier moeten hebben om die GPS locaties te visualiseren. Misschien kan je even wat rondgooglen op 'GPS data logging visualizer' of iets dergelijks.

Truth is like a language with no native speakers left.
Its poetry is speechless and it can’t be caught in human being’s breath.



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee