La scheda ESP32-LoRa è molto adatta per essere espansa con un modulo GPS. Il cablaggio è molto semplice poiché è necessaria solo un'interfaccia seriale. I dati dal modulo GPS possono essere visualizzati sul display OLED integrato.
Abbiamo bisogno di un per costruire Nodemcu ESP32 con display OLED integrato e a Modulo GPS con antenna attiva, Una batteria LiPo da 3,7 V adatta deve essere utilizzata per il funzionamento mobile.
Aggiungiamo anche un pulsante. Se si preme questo pulsante, il dispositivo dovrebbe ricordare le coordinate correnti e quindi visualizzare la distanza da questo punto e la direzione in cui è possibile trovare questo punto.
Oltre a questi dati, il dispositivo visualizza la data e l'ora esatte (UTC!). Questi includono latitudine e longitudine e velocità. Se un punto di riferimento è stato salvato premendo il pulsante, il dispositivo mostra ancora la distanza e la direzione verso questo punto di riferimento. Il numero di satelliti che è possibile ricevere è mostrato in basso a destra.
Sketch:
#include <SPI.B> #include <LoRa.B> #include "SSD1306.h" #include <TinyGPS.B> ; #include<Arduino.B> // Istanze per l'interfaccia seriale, il display e il modulo GPS Serial hardware Serial1(1); SSD1306 display(0x3C, 4, 15); TinyGPS GPS; // Pin per il pulsante #define btn 23 // Abbreviazioni tedesche stringa mese[12] {"Jan","Febbraio","Mar","Aprile","MAGGIO","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","December"}; // Variabili globali per la posizione corrente e per la posizione del punto di riferimento galleggiante fslat = 0, fslon = 0, piatto, Flon; // Loop in attesa che elabora i dati in entrata dal modulo GPS e verifica lo stato del pulsante statica vuoto intelligente ritardo(unsigned lungo ms) { unsigned lungo inizio = millis(); fare { se (!Leggi digitale(btn)) { fslat = piatto; fslon = Flon; } mentre (Serial1.disponibile()) GPS.codificare(Serial1.leggere()); } mentre (millis() - inizio < ms); } // Mostra la data e l'ora del modulo GPS vuoto display_date(TinyGPS &GPS, uint8_t x, uint8_t y){ int anno; byte mese, giorno, ora, minuto, secondo, centesimi; unsigned lungo età; carbonizzare MNC[3]; stringa MNS; // questa funzione di Tiny-GPS restituisce la data e l'ora divise in singole variabili // L'ora è in formato UTC, il che significa che per CET è necessario aggiungere 1 o 2 ore con l'ora legale GPS.crack_datetime(&anno, &mese, &giorno, &ora, &minuto, &secondo, ¢esimi, &età); se (età == TinyGPS::GPS_INVALID_AGE) // Se il display mostra queste stelle, sai che il modulo GPS non ha ancora fornito dati validi display.drawString(x,y,"********** ******** "); altro { // Visualizza il mese come abbreviazione anziché come numero carbonizzare sz[32]; MNS=mese[mese-1]; MNS.ToCharArray(MNC,4); sprintf(sz, "% 02d.% 3s.% 02d% 02d:% 02d:% 02d", giorno, MNC, anno, ora, minuto, secondo); display.drawString(x,y,sz); serial.println(sz); } intelligente ritardo(0); } vuoto configurazione() { // ripristina display pinMode(16,USCITA); digitalWrite(16, LOW); // imposta GPIO16 basso per ripristinare OLED ritardo(50); digitalWrite(16, ALTA); // mentre OLED è in esecuzione, è necessario impostare GPIO16 in alto // avvia l'interfaccia seriale serial.iniziare(115200); serial.println("Start"); // Avvia l'interfaccia seriale per la comunicazione con il modulo GPS // Non vengono utilizzati i pin IO standard 9 e 10 ma i pin IO 12 e 13 Serial1.iniziare(9600,SERIAL_8N1,12,13); // Prepara il pin per il pulsante pinMode(btn,INPUT_PULLUP); // Inizializza il display display.init(); // Visualizzazione orizzontale display.flipScreenVertically(); display.chiaro(); // Parametri di testo display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); serial.println("Installazione eseguita"); } vuoto cappio() { galleggiante crs, Fspd; uint8_t cx,cy; uint32_t dist; unsigned lungo età, data, tempo, caratteri = 0; unsigned breve frasi = 0, mancato = 0; carbonizzare tmp[32]; // Buffer per output // Leggi la posizione dal modulo GPS GPS.f_get_position(&piatto, &Flon, &età); // Prepara l'annuncio display.chiaro(); // Mostra data e ora display_date(GPS,0,0); // Mostra latitudine sprintf(tmp,"Larghezza:% 10.6f °",piatto); // Mostra longitudine display.drawString(0,10,tmp); sprintf(tmp,"Lunghezza:% 10.6f *",Flon); // Mostra la velocità display.drawString(0,20,tmp); sprintf(tmp,"Velocità:% 6.2f km / h",GPS.f_speed_kmph()); display.drawString(0,30,tmp); // Inoltre viene visualizzato solo se è stato impostato un punto di riferimento se (fslon > 0) { // Mostra la distanza dal punto di riferimento dist = GPS.distance_between(piatto, Flon, fslat,fslon); se (dist >1000) { // maggiore di 1000 in km sprintf(tmp,"Distanza:% 8.2f km",dist/1000); } altro { // altrimenti in m sprintf(tmp,"Distanza:% 8d m",dist); } display.drawString(0,40,tmp); // Direzione verso il punto di riferimento sprintf(tmp, "Direzione:% 5s",GPS.cardinale(GPS.course_to(piatto, Flon, fslat, fslon))); display.drawString(0,50,tmp); } // numero di satelliti sprintf(tmp,"% 3d",GPS.satelliti()); display.drawString(100,50,tmp); // Aggiorna il display display.display(); // aspetta 5 secondi intelligente ritardo(5000); }
Divertiti a sperimentare
6 commenti
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
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
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
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
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
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