Expand ESP32 LoRa with GPS

The ESP32-LoRa board is very suitable for extending with a GPS module. The wiring is very simple, as only one serial interface is required. The data vn GPS module can be displayed on the integrated OLED display.

In order to set up, we need a Nodemcu ESP32 with integrated OLED display and a GPS module with active antenna. For mobile operation, you should use a suitable LiPo battery with 3.7 V.

In addition, we add a button. When pressing this button, the device should remember the current coordinates and then subsequently display the distance to this point as well as the direction of the sky in which this point is to be found.

In addition to this data, the device displays the exact date and time (UTC !). These include latitudes and longitudes, as well as speed. If a reference point has been saved by pressing the button, the device still displays distance and direction to that reference point. The number of satellites that can be received in the lower right corner is displayed.

 

 

Sketch:

 

#include <Spi.H>
#include <Lora.H>
#include "SSD1306.h"
#include <TinyGPS.H>
;
#include<Arduino.H>

Instances for the serial interface, the display and the GPS module
HardwareSerial Serial1(1);
SSD1306  Display(0x3c, 4, 15);
TinyGPS Gps;

Pin for the button
#define Btn 23

German Monthly Abbreviations
String Month[12] {"Jan","Feb","Mrz","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};

Global variables for the current position and the position of the reference point
Float fslat = 0, fslon = 0, Flat, Flon;

Queue that processes incoming data from the GPS module and checks the status of the button
Static Void smartdelay(Unsigned Long Ms)
{   Unsigned Long Start = millis();   Thu    {     If (!digitalRead(Btn)) {       fslat = Flat;        fslon = Flon;     }     while (Serial1.available())       Gps.Encode(Serial1.Read());   } while (millis() - Start < Ms);
}

Show the date and time of the GPS module
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;   this function of Tiny-GPS returns date and time split into individual variables   the time is in UTC format, i.e. for the CET you have to add 1 or with daylight saving time 2 hours   Gps.crack_datetime(&year, &month, &Day, &Hour, &Minute, &second, &hundredths, &age);   If (age == TinyGPS::GPS_INVALID_AGE)     if the display shows these stars, you know that the GPS module has not yet supplied valid data     Display.Drawstring(X,Y,"********** ******** ");   else   {     Month as abbreviation instead of show number     Char Sz[32];     Mns=Month[month-1];     Mns.Tochararray(Mnc,4);     Sprintf(Sz, "%02d.%3s.%0 2d %02d:%02d:%02d ",         Day, Mnc, year, Hour, Minute, second);     Display.Drawstring(X,Y,Sz);     Serial.println(Sz);   }   smartdelay(0);    }


Void Setup() {   Reset display   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      Start serial interface   Serial.Begin(115200);   Serial.println("Start");   start serial interface to communicate with the GPS module   the standard IO-pins 9 and 10 are not used but the IO-pins 12 and 13   Serial1.Begin(9600,SERIAL_8N1,12,13);   Preparing pin for pushbuttons   pinMode(Btn,INPUT_PULLUP);   Initialize display   Display.Init();   Display on landscape mode   Display.flipScreenVertically();   Display.Clear();   Text Parameters   Display.setTextAlignment(TEXT_ALIGN_LEFT);   Display.setFont(ArialMT_Plain_10);   Serial.println("Setup done");
}

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 for output   Read position from the GPS module   Gps.f_get_position(&Flat, &Flon, &age);   Preparing for display   Display.Clear();   Show the date and time   display_date(Gps,0,0);   Show latitudes   Sprintf(Tmp,"Width: %10.6f °",Flat);   Show longitude   Display.Drawstring(0,10,Tmp);   Sprintf(Tmp,"Length: %10.6f*",Flon);   Show speed   Display.Drawstring(0,20,Tmp);   Sprintf(Tmp,"Geschw.: %6.2f km/h",Gps.f_speed_kmph());   Display.Drawstring(0,30,Tmp);   More displays only if a reference point has been set   If (fslon > 0) {     Show distance to reference point     Dist = Gps.distance_between(Flat, Flon, fslat,fslon);     If (Dist >1000) {       greater than 1000 in km       Sprintf(Tmp,"Distance: %8.2f km",Dist/1000);     } else {       otherwise in m       Sprintf(Tmp,"Distance: %8d m",Dist);     }     Display.Drawstring(0,40,Tmp);     Direction to the reference point     Sprintf(Tmp, "Direction: %5s",Gps.Cardinal(Gps.course_to(Flat, Flon, fslat, fslon)));     Display.Drawstring(0,50,Tmp);   }   Number of satellites   Sprintf(Tmp,"%3d",Gps.Satellites());   Display.Drawstring(100,50,Tmp);       Update the display   Display.Display();   5 seconds to wait   smartdelay(5000);
}

 

Have fun experimenting

 

Esp-32Projects for beginners

4 comments

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. Install ESP32 now from the board manager
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP programming via WLAN