ESP32 LoRa mit GPS erweitern - AZ-Delivery

Das ESP32-LoRa Board eignet sich sehr gut dazu mit einem GPS-Modul erweitert zu werden. Die Verdrahtung ist sehr einfach, da lediglich eine serielle Schnittstelle erforderlich ist. Die Daten vn GPS Modul können am integrierten OLED Display angezeigt werden.

Zum Aufbau benötigen wir ein Nodemcu ESP32 mit integriertem OLED Display und ein GPS-Modul mit aktiver Antenne. Für einen mobilen Betrieb sollte man einen geeigneten LiPo Akku mit 3.7 V einsetzen.

Zusätzlich fügen wir einen Taster hinzu. Wenn man diesen Taster drückt soll sich das Gerät die aktuellen Koordinaten merken und dann in Folge die Entfernung zu diesem Punkt sowie die Himmelsrichtung in der dieser Punkt zu finden ist anzeigen.

Neben diesen Daten zeigt das Gerät das genaue Datum und die Uhrzeit (UTC !) an. Darunter die Breiten und Längengrade sowie die Geschwindigkeit. Wenn durch drücken der Taste ein Referenzpunkt gespeichert wurde, zeigt das Gerät noch Distanz und Richtung zu diesem Referenzpunkt an. Unten rechts wird die Anzahl der gerade empfangbaren Satelliten angezeigt.

 

 

Sketch:

 

#include <SPI.h>
#include <LoRa.h>
#include "SSD1306.h"
#include <TinyGPS.h>
;
#include<Arduino.h>

//Instanzen für die serielle Schnittstelle, das Display und das GPS Modul
HardwareSerial Serial1(1);
SSD1306  display(0x3c, 4, 15);
TinyGPS gps;

//Pin für den Taster
#define btn 23

//Deutsche Monatsabkürzungen
String monat[12] {"Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"};

//Globale Variablen für die laufende Position und für die Position des Referenzpunktes
float fslat = 0, fslon = 0, flat, flon;

//Warteschleife, die ankommende Daten vom GPS Modul verarbeitet und den Status des Tasters prüft
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    if (!digitalRead(btn)) {
      fslat = flat; 
      fslon = flon;

    }
    while (Serial1.available())
      gps.encode(Serial1.read());
  } while (millis() - start < ms);
}

//Das Datum und die Uhrzeit vom GPS Modul anzeigen
void display_date(TinyGPS &gps, uint8_t x, uint8_t y){
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  char mnc[3];
  String mns;
  //diese Funktion von Tiny-GPS gibt Datum und Zeit aufgeasplittet in einzelne Variablen zurück
  //die Zeit ist im UTC Format, das heißt für die MEZ muss man 1 oder mit Sommerzeit 2 Stunden addieren
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    //wenn das Display diese Sterne anzeigt, weiß man dass das GPS Modul noch keine gültigen Daten geliefert hat
    display.drawString(x,y,"********** ******** ");
  else
  {
    //Monat als Abkürzung stattb Zahl anzeigen
    char sz[32];
    mns=monat[month-1];
    mns.toCharArray(mnc,4);
    sprintf(sz, "%02d.%3s.%02d %02d:%02d:%02d ",
        day, mnc, year, hour, minute, second);
    display.drawString(x,y,sz);
    Serial.println(sz);
  }
  smartdelay(0);
  
}


void setup() {
  //Display zurücksetzen
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
  delay(50); 
  digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
  
  //serielle Schnittstelle starten
  Serial.begin(115200);
  Serial.println("Start");
  //serielle Schnittstelle zur Kommunikation mit dem GPS Modul starten
  //es werden nicht die Standard IO-Pins 9 und 10 sondern die IO-Pins 12 und 13 verwendet
  Serial1.begin(9600,SERIAL_8N1,12,13);
  //Pin  für Taster vorbereiten
  pinMode(btn,INPUT_PULLUP);
  // Display initialisieren
  display.init();
  //Display auf Querformat
  display.flipScreenVertically();
  display.clear();
  //Text Parameter
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  Serial.println("Setup fertig");
}

void loop() {
  float crs, fspd;
  uint8_t cx,cy;
  uint32_t dist;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  char tmp[32]; //Buffer für Ausgabe
  //Position vom GPS Modul lesen
  gps.f_get_position(&flat, &flon, &age);
  //Anzeige vorbereiten
  display.clear();
  //Datum und Uhrzeit anzeigen
  display_date(gps,0,0);
  //Breitengrade anzeigen
  sprintf(tmp,"Breite:  %10.6f °",flat);
  //Längengrade anzeigen
  display.drawString(0,10,tmp);
  sprintf(tmp,"Länge:  %10.6f *",flon);
  //Geschwindigkeit anzeigen
  display.drawString(0,20,tmp);
  sprintf(tmp,"Geschw.: %6.2f km/h",gps.f_speed_kmph());
  display.drawString(0,30,tmp);
  //Weitere Anzeigen nur wenn ein Referenzpunkt gesetzt wurde
  if (fslon > 0) {
    //Abstand zum Referenzpunkt anzeigen
    dist = gps.distance_between(flat, flon, fslat,fslon);
    if (dist >1000) {
      //größer als 1000 in km
      sprintf(tmp,"Distanz:  %8.2f km",dist/1000);
    } else {
      //sonst in m
      sprintf(tmp,"Distanz:  %8d m",dist);
    }
    display.drawString(0,40,tmp);
    //Richtung zum Referenzpunkt
    sprintf(tmp, "Richtung: %5s",gps.cardinal(gps.course_to(flat, flon, fslat, fslon)));
    display.drawString(0,50,tmp);
  }
  //Anzahl der Satelliten
  sprintf(tmp,"%3d",gps.satellites());
  display.drawString(100,50,tmp);    

  //Display aktualisieren
  display.display();
  //5 Sekunden warten
  smartdelay(5000);
}

 

Viel Spass beim experimentieren

 

Esp-32Projekte für anfänger

6 comments

Chris Pallasch

Chris Pallasch

@Stephan

Du hast recht und was Du beschreibst entspricht inetwa GBAS (Ground Based Augmentation System)
Den Referenzpunkt solltest Du von einem befreundeten Vermessungs-Ingenieur einmessen lassen.
Problem bleibt, dass, auch wenn Du am Referenzpunkt ideale Bedingungen (clear Sky) hast, dies beim
mobilen GPS nicht unbedingt der Fall ist (Häuserschlucht, Wald, Brücke,…), die Abweichung eine ganz
andere sein dürfte.

Stephan

Stephan

Hallo, das die GPS-Daten auf min. 2,5m genau (auf die Erdkugel bezogen) sindund das athmosphärische Einflüsse etc. das Signal verfälschen) ist mir bekannt.

Was ist aber….wenn ich einen (gleichen Typ’s) GPS-Empfänger als “Nullpunkt” definiere und den anderen Empfänger mobil ( lokal begrenzt – wir können Erdkrümmung etc. vernachlässigen)
nutze, wie genau sind dann die Differenzdaten x-y (z vernachlässigen wir)

Ich weiss – immer so blöde Fragen…

Danke

Stephan

Ulrich Engel

Ulrich Engel

Hallo, schönes Projekt.
Ich verstehe nur nicht ganz, warum ich hierfür einen ESP32LoRa benötige? Der LoRa-Chip kommt doch gar nicht zum Einsatz, oder?

LG Ulli

Andre Pankau

Andre Pankau

Hallo ,
Ich finde eure Projekte und E-Book´s (außer es steht nur der blink Sketch drin ) ganz gut .
Da merkt man das es nicht nur um verkauf geht sondern ums lernen.

ich habe mir ein stater Paket und ein Robot Car auf Amazon gekauft.
Danach habe ich hier bei euch ein NodeMCU mit esp8266 gekauft .
Da steuere ich momentan 2 Led´s mit Unity3d an.
Desweiteren habe ich ein d1 mini und darauf ein Webserver laufen (online).
Würde gern ein Gprs Tracker bauen der dann die Gprs Coordinaten an den Webserver sendet.
Könnt ihr mir da weiter helfen oder mal so ein Projekt machen. Hier kann man sie schon mal auslesen weis aber nicht ob sie auch vom Modul aus online gesendet werden können .
Mit freundlichen Grüssen
Andre P.

Moritz Spranger

Moritz Spranger

Sehr geehrter Kunde,
vielen Dank für Ihren Kommentar. Den Link habe ich soeben korrigiert. Die Beschreibung zur genauen Funktionsweise des Moduls finden Sie im dazugehörigen E-Book. Die verwendeten Bibliotheken finden Sie am Anfang des Sketches.
Für die Benutzung unserer Module ist es leider unumgänglich sich in das Thema einzuarbeiten, wir stehen Ihnen jedoch für Hilfe zur Verfügung, bitte wenden Sie sich hierzu an unseren Support.

Juergen Duerr

Juergen Duerr

Hallo,

die Idee und einfache Umsetzung ist ja super.
Nur wenn ich Anfange dies nachzubauen stelle ich schnell fest
- der Link auf das Modul geht ins leere
- es fehlt die Beschreibung welches Modul/ Board ich einstellen muss
- welche Bibliotheken von wo hier verwendet werden

Eventuell können Sie ja mal ALLE Infos auch in diese tollen Blogs stellen.
Es nervt langsam der Hinweis auch auf anderen Projektseiten, dass man alles im Internet finden kann. Ich will basteln und nicht im Netz stundenlang suchen.

MFG
J. Dürr

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery