Zuerst müssen die Bibliotheken eingebunden werden.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "ThingSpeak.h"
#include <WiFi.h>
Dann legen wir den Pin 21 als RX-Pin und den Pin 22 als TX-Pin und setzen die Baudrate auf 9600.

static const int RXPin = 21, TXPin = 22;
static const uint32_t GPSBaud = 9600;

Danach müssen wir den ESP32 mit dem WLAN verbinden. Dafür brauchen wir die Router SSID (Name) und das WLAN Passwort.

const char* ssid     = "DEIN_ROUTER_NAME";
const char* password = "DEIN_WLAN_PASSWORD";

Dazu muss noch die Channel ID und der Write API-Key eingegeben werden (Anführungszeichen müssen bleiben!) um eine Verbindung zu ThingSpeak herstellen zu können.

unsigned long myChannelNumber = DEINE_CHANNEL_ID;
const char * myWriteAPIKey = "DEIN_WRITE_API_KEY";
Als nächstes erstellen wir das TinyGPS++ Objekt und stellen eine serielle Verbindung zum GPS-Gerät her.

TinyGPSPlus gps;
WiFiClient  client;

SoftwareSerial ss(RXPin, TXPin);

Nun kümmern wir uns um die Setup Einstellungen:
Die Ausgabe des seriellen Monitors wird auf die Baudrate 115200 gestellt.
Dann wird ein Initialisierungstext geschrieben beim Anschluss und Starten des GPS-Gerätes.

void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println();

Dann muss eine Internetverbindung aufgebaut werden und mithilfe von Texten der Status erfasst werden. Sollte die Internetverbindung nicht aufgebaut werden, wiederholt sich der Vorgang alle 500ms und dabei wird ein Punkt ausgegeben.

Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

Wenn die Internetverbindung erfolgreich aufgebaut wurde, soll er dies ausgeben zusammen mit der IP-Adresse, der Netzmaske und dem Gateway und den ThingSpeak Client starten.

Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Netmask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(WiFi.gatewayIP());
  ThingSpeak.begin(client);

Als nächstes werden die GPS-Daten übermittelt und geprüft in der loop-Funktion, ob diese erfolgreich als ein Satz entschlüsselt werden konnten. Andernfalls kommt die Ausgabe "Check Wiring".

void loop()
{
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}

In der Funktion void displayInfo() speichern wir zunächst die GPS-Daten in Variablen ab und schreiben sie dann in die Felder unseres ThingSpeak-Channels. Sollte dort ein Fehler auftreten, wird "INVALID" ausgegeben.

void displayInfo()
{
  if (gps.location.isValid())
  {

    double latitude = (gps.location.lat());
    double longitude = (gps.location.lng());
    
    String latbuf;
    latbuf += (String(latitude, 6));
    Serial.println(latbuf);

    String lonbuf;
    lonbuf += (String(longitude, 6));
    Serial.println(lonbuf);

    ThingSpeak.setField(1, latbuf);
    ThingSpeak.setField(2, lonbuf);
    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);  
    delay(10000);
    
  }
else
  {
    Serial.print(F("INVALID"));
  }

Zusätzlich implementieren wir noch eine Datum- und Zeitangabe, damit man den letzten Abruf-Zeitpunkt ermitteln kann.

Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.day());
    Serial.print(F("."));
    Serial.print(gps.date.month());
    Serial.print(F("."));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();

Zuletzt geändert: Mittwoch, 7. Oktober 2020, 19:00