ESP32 LoRa for dummys - Baliza (Beacon) con GPS

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

Ver también


Prohibida la reproducción parcial o total de este artículo sin permiso previo del autor 

No hay comentarios:

Publicar un comentario

LCR-TC

Un  LCR-TC es un multimetro o tester que permite caracterizar componentes electrónicos pasivos: L = Inductancia C = Capacitancia R = Resiste...