Ampliar ESP32 LoRa con GPS

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, &centé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

 

Esp-32Proyectos para principiantes

4 comentarios

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

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas