El proyecto de ESP32 LoRa for dummys - Baliza (Beacon) puede instalarse en una placa ESP32 LoRa con GPS como la Lilygo ESP 32 Lora GPS (NEO 6M) /GNSS Neo M8M), en cuyo caso se puede modificar el programa para incluir en el mensaje que se transmite con LoRa codificado en Morse los siguientes campos:
- Fecha
- Hora
- Coordenadas de localización:
- latitud
- longitud
- altitud
La última version estable de todos los programas se encuentran en https://github.com/joanpao/GPS
PROGRAMA DE PRUEBA (GPS.ino)
El primer paso es ejecutar un programa como GPS.ino (https://github.com/LilyGO/TTGO-T-Beam/blob/master/GPS/GPS.ino )que nos permita conocer que la placa funciona correctamente y que tenemos claro algunos conceptos y parámetros:
- La placa solamente recibe satélites GPS y puede costarle engancharse a ellos
- Hay que descargar en la biblioteca de Arduino IDE y así evitamos copiarla en la carpeta del proyecto
- TinyGPSplus
- La placa se comunica con el chip GPS por un puerto serie usando para la T-Beam V1.2
- 12-TX
- 34-RX
- En el programa original se incluye una sentencia que da error y se comenta
- //HardwareSerial Serial1(1);
- La salida de datos es por el puerto serie, por lo que hay que activarlo en su ejecución
/*****************************************
* ESP32 GPS VKEL 9600 Bds
* https://github.com/LilyGO/TTGO-T-Beam/blob/master/GPS/GPS.ino
* Modificada por EA5JTT 20250716
* Compilar para placa LilyGo T-Display
* Activar Montior Serie
* La Hora es UTC
******************************************/
// No hace falta en el proyecto pues está en la biblioteca de Arduino IDE
#include <TinyGPS++.h>
TinyGPSPlus gps;
// Da error y se comenta
//HardwareSerial Serial1(1);
// Estructura de Serial1.begin(9600, SERIAL_8N1, 12, 15);
// Velocidad: 9600 baudios
// Configuración de datos: SERIAL_8N1 (8 bits, sin paridad, 1 bit de parada)
// GPIO12 como RX (recepción)
// GPIO15 como TX (transmisión)
void setup()
{
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 34, 12);
// 12-TX 34-RX Para T-Beam V1.2
}
void loop()
{
Serial.print("Latitude : ");
Serial.println(gps.location.lat(), 5);
Serial.print("Longitude : ");
Serial.println(gps.location.lng(), 4);
Serial.print("Satellites: ");
Serial.println(gps.satellites.value());
Serial.print("Altitude : ");
Serial.print(gps.altitude.feet() / 3.2808);
Serial.println("M");
Serial.print("Time : ");
Serial.print(gps.time.hour());
Serial.print(":");
Serial.print(gps.time.minute());
Serial.print(":");
Serial.println(gps.time.second());
Serial.println("**********************");
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
PROGRAMA DE PRUEBA CON SALIDA SERIE Y POR PANTALLA (GPS_Display.ino)
/*****************************************
* ESP32 GPS VKEL 9600 Bds
* https://github.com/LilyGO/TTGO-T-Beam/blob/master/GPS/GPS.ino
* Modificado por EA5JTT 20250716 para:
* - Que funcione con placa LilyGo T-Display OLED GPS
* - Mostrar la salida tambien por el display OLED si se tiene instalado
* ATENCION
* - Activar Montior Serie si se quiere esa opción
* - Puede salir por serie y/o por display segun como se quiera
* - La Hora es UTC
******************************************/
// No hace falta en el proyecto pues está en la biblioteca de Arduino IDE
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_SSD1306.h"
#include "Fixed8x16.h"
#include "LoRa.h"
#include <TinyGPS++.h>
TinyGPSPlus gps;
// Board pins.
// ESP32 433 LORA32 V2.1_1.6
#define LED 25
// LoRa pins for ESP32 433 GPS T-BEAM V1.2
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_SS 18
#define LORA_RST 23
#define LORA_DI0 26
// OLED pins for for ESP32 433 GPS T-BEAM V1.2
#define OLED_RST NOT_A_PIN // IO16 -- RESET
#define OLED_SDA 21 // IO21 -- SDA for TTGO Lora32 board
#define OLED_SCL 22 // IO22 -- SCL
Adafruit_SSD1306 display(OLED_RST);
// Da error y se comenta
//HardwareSerial Serial1(1);
// Estructura de Serial1.begin(9600, SERIAL_8N1, 12, 15);
// Velocidad: 9600 baudios
// Configuración de datos: SERIAL_8N1 (8 bits, sin paridad, 1 bit de parada)
// GPIO12 como RX (recepción)
// GPIO15 como TX (transmisión)
void setup()
{
// Set LED pin.
pinMode(LED, OUTPUT);
// salida serie
Serial.begin(115200);
while (!Serial)
;
// Comunicacion con GPS
Serial1.begin(9600, SERIAL_8N1, 34, 12);
// 15-TX 12-RX Los pins originales no proporcionan información "No GPS data received: check wiring"
// 17-TX 18-RX idem
// 12-TX 34-RX Para T-Beam V1.2
// Escribe por el puerto serie a la consola
Serial.println();
delay(1000);
Serial.println("GPS_Display by Juanpa Sanchez EA5JTT");
// Initialize OLED display with the I2C address 0x3C.
// OLED_SDA, OLED_SCL son las variables ya inicializadas con los pines usados apra OLED, el 21 y 22 en este caso
display.begin(SSD1306_SWITCHCAPVCC, 0x3C, true, OLED_SDA, OLED_SCL);
display.clearDisplay();
// Set font.
// Tamaño de las letras 8x16
// color WHITE es el unico posible en un display B/N
display.setFont(&Fixed8x16);
display.setTextColor(WHITE);
display.setCursor(0, Fixed8x16.yAdvance);
// Visualize the result.
display.display();
}
void loop()
{
// SALIDA SERIE
// Movimiento
Serial.print(F(" km/h="));
Serial.println(gps.speed.kmph());
Serial.print(F("COURSE: "));
Serial.print(F(" Deg="));
Serial.println(gps.course.deg());
// Posición
Serial.print("Latitude : ");
Serial.println(gps.location.lat(), 5);
Serial.print("Longitude : ");
Serial.println(gps.location.lng(), 5);
Serial.print("Satellites: ");
Serial.println(gps.satellites.value());
Serial.print("Altitude : ");
Serial.print(gps.altitude.feet() / 3.2808);
Serial.println("M");
//Tiempo
Serial.print(F("DATE: "));
Serial.print(gps.date.year());
Serial.print(F("/"));
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.println(gps.date.day());
Serial.print("Time (UTC): ");
Serial.print(gps.time.hour());
Serial.print(":");
Serial.print(gps.time.minute());
Serial.print(":");
Serial.println(gps.time.second());
Serial.println("**********************");
// DISPLAY
display.clearDisplay();
display.display();
display.setCursor(0,12);
display.print(F("Lat: "));
display.println(gps.location.lat(),5);
display.setCursor(0,24);
display.print(F("Lon: "));
display.println(gps.location.lng(), 5);
display.setCursor(0,36);
display.print(F("Sat: "));
display.println(gps.satellites.value());
display.setCursor(0,48);
display.print("Alt: ");
display.print(gps.altitude.feet() / 3.2808);
display.println("m");
display.setCursor(0,60);
display.print("UTC: ");
display.print(gps.time.hour());
display.print(":");
display.print(gps.time.minute());
display.print(":");
display.println(gps.time.second());
display.display();
// Aqui se modifia la velocidad de refresco en ms
smartDelay(5000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
PROGRAMA PRA UNA BALIZA LoRa EN MORSE CON DATOS DEL GPS (GPS_Beacon.ino)
En este paso incluimos el código de la baliza morse que ya hemos probado.
![]() |
| Prueba de concepto: GPS_Beacon transmitiendo la hora GPS y walkie Talkie RETEVIS RT5R recibiendo el mensaje en LoRA/Morse |
Con estos tres programas esto controlaremos ya las salidas de la placa y el GPS así que podemos pasar al siguiente proyecto que es un WSPR TX
Prohibida la reproducción parcial o total de este artículo sin permiso previo del autor

No hay comentarios:
Publicar un comentario