La placa ESP32-LoRa es muy adecuada para expandirse con un módulo GPS. El cableado es muy simple ya que solo se requiere una interfaz en serie. Los datos del módulo GPS se pueden mostrar en la pantalla OLED integrada.
Necesitamos un para construir Nodemcu ESP32 con pantalla OLED integrada y un Módulo GPS con antena activa. Se debe usar una batería LiPo de 3.7 V adecuada para la operación móvil.
También agregamos un botón. Si presiona este botón, el dispositivo debe recordar las coordenadas actuales y luego mostrar la distancia a este punto y la dirección en la que se puede encontrar este punto.
Además de estos datos, el dispositivo muestra la fecha y hora exactas (UTC). Estos incluyen latitud y longitud, así como la velocidad. Si se ha guardado un punto de referencia presionando el botón, el dispositivo aún muestra la distancia y la dirección a este punto de referencia. El número de satélites que se pueden recibir se muestra en la esquina inferior derecha.
Bosquejo:
#include <SPI.h> #include <LoRa.h> #include "SSD1306.h" #include <TinyGPS.h> ; #include<Arduino.h> // Instancias para la interfaz en serie, la pantalla y el módulo GPS Hardware Serie Serie1(1); SSD1306 exhibir(0x3c, 4, 15); TinyGPS gps; // Pin para el botón #definir btn 23 // abreviaturas alemanas Cadena mes[12] {"Jan","Feb","Mar","Abr","Mayo","Jun","Julio","Ago","Sep","Oct","Nov","Diciembre"}; // Variables globales para la posición actual y para la posición del punto de referencia flotar fslat = 0, fslon = 0, plano, flon; // Bucle de espera que procesa los datos entrantes del módulo GPS y verifica el estado del botón estática nulo smartdelay(sin firmar largo ms) { sin firmar largo empezar = millis(); hacer { si (!digitalRead(btn)) { fslat = plano; fslon = flon; } mientras que (Serie1.disponible()) gps.codificar(Serie1.leer()); } mientras que (millis() - empezar < ms); } // Muestra la fecha y hora del módulo GPS nulo display_date(TinyGPS &gps, uint8_t x, uint8_t y){ int año; byte mes, dia, hora, minuto, segundo, centésimos; sin firmar largo edad; char mnc[3]; Cadena mns; // esta función de Tiny-GPS devuelve la fecha y la hora divididas en variables individuales // La hora está en formato UTC, lo que significa que para CET, debe agregar 1 o 2 horas con el horario de verano gps.crack_datetime(&año, &mes, &dia, &hora, &minuto, &segundo, ¢ésimos, &edad); si (edad == TinyGPS::GPS_INVALID_AGE) // Si la pantalla muestra estas estrellas, sabrá que el módulo GPS aún no ha entregado ningún dato válido exhibir.drawString(x,y,"********** ******** "); otra cosa { // Muestra el mes como una abreviatura en lugar del número char sz[32]; mns=mes[mes-1]; mns.toCharArray(mnc,4); sprintf(sz, "% 02d.% 3s.% 02d% 02d:% 02d:% 02d", dia, mnc, año, hora, minuto, segundo); exhibir.drawString(x,y,sz); De serie.println(sz); } smartdelay(0); } nulo configuración() { // restablecer pantalla pinMode(16,SALIDA); digitalWrite(16, BAJA); // establece GPIO16 bajo para restablecer OLED retrasar(50); digitalWrite(16, ALTO); // mientras se ejecuta OLED, debe establecer GPIO16 en alto // inicia la interfaz serial De serie.comenzar(115200); De serie.println("Inicio"); // Inicie la interfaz en serie para la comunicación con el módulo GPS // No los pines IO estándar 9 y 10, pero se usan los pines IO 12 y 13 Serie1.comenzar(9600,SERIAL_8N1,12,13); // Prepara el pin para el botón pinMode(btn,INPUT_PULLUP); // Inicializa la pantalla exhibir.init(); // visualización del paisaje exhibir.flipScreenVertically(); exhibir.claro(); // Parámetros de texto exhibir.setTextAlignment(TEXT_ALIGN_LEFT); exhibir.setFont(ArialMT_Plain_10); De serie.println("Configuración realizada"); } nulo bucle() { flotar crs, fspd; uint8_t cx,cy; uint32_t dist; sin firmar largo edad, fecha, tiempo, caracteres = 0; sin firmar corta oraciones = 0, fallado = 0; char tmp[32]; // Buffer para salida // Leer la posición del módulo GPS gps.f_get_position(&plano, &flon, &edad); // Prepara el anuncio exhibir.claro(); // Mostrar fecha y hora display_date(gps,0,0); // Mostrar latitud sprintf(tmp,"Ancho:% 10.6f °",plano); // Mostrar longitud exhibir.drawString(0,10,tmp); sprintf(tmp,"Longitud:% 10.6f *",flon); // Mostrar velocidad exhibir.drawString(0,20,tmp); sprintf(tmp,"Velocidad:% 6.2f km / h",gps.f_speed_kmph()); exhibir.drawString(0,30,tmp); // Se muestra más adelante solo si se ha establecido un punto de referencia si (fslon > 0) { // Mostrar distancia al punto de referencia dist = gps.distancia_entre(plano, flon, fslat,fslon); si (dist >1000) { // mayor que 1000 en km sprintf(tmp,"Distancia:% 8.2f km",dist/1000); } otra cosa { // de lo contrario en m sprintf(tmp,"Distancia:% 8d m",dist); } exhibir.drawString(0,40,tmp); // Dirección al punto de referencia sprintf(tmp, "Dirección:% 5s",gps.cardenal(gps.curso_a(plano, flon, fslat, fslon))); exhibir.drawString(0,50,tmp); } // número de satélites sprintf(tmp,"% 3d",gps.satélites()); exhibir.drawString(100,50,tmp); // Actualiza la pantalla exhibir.exhibir(); // espera 5 segundos smartdelay(5000); }
Diviértete experimentando
6 comentarios
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