En este tutorial te voy a mostrar cómo conectar una placa de desarrollo TTGO LoRa32 con un gateway LoRa Dragino LG02. Cabe aclarar que este tutorial también sirve para los gateways Dragino LG01, OLG01 y OLG02.
Los gateways de uno o dos canales no son recomendables para soluciones LoRaWAN con muchos nodos. Sin embargo, funcionan bien en redes LoRaWAN con pocos nodos (digamos hasta 50) o en redes LoRa.
Si no sabes la diferencia entre LoRa y LoRaWAN, te dejo este artículo donde lo explico.
Hardware que he utilizado
- El gateway Dragino LG02 (de dos canales LoRa).
- Placa de desarrollo TTGO ESP32 V2. Hay muchas versiones de hardware y en función del modelo específico cambian algunos pines. Esta placa tiene conectividad WiFi, Bluetooth y LoRa. También trae un display OLED listo para usar.
Configuración LoRa del gateway
Como estamos usando un gateway de dos canales, es necesario configurar la frecuencia exacta que vamos a utilizar en el nodo. Uno de los canales se utiliza para uplink y el otro para downlink.
En esta ocasión solo utilizaremos el canal de uplink.
En nuestro caso la frecuencia es de 915000000 Hz. También configuramos los valores de SF, preámbulo, sincronización, coding rate y BW como muestro en la siguiente figura.

Configuración MQTT del gateway
Primero vamos a configurar el gateway para que reenvíe las tramas LoRa a un broker MQTT.
Por cuestiones de síntesis no voy a explicar en este artículo cómo realizar la configuración básica del gateway, sino que me voy a centrar en lo que respecta al modo MQTT.
La idea general es que el nodo TTGO ESP32 envíe mensajes que el gateway pueda identificar y reenviar a un tópico específico en el broker MQTT.
Para esto, el payload del mensaje LoRa debe tener un formato determinado, como se muestra en la figura siguiente.
En este ejemplo, el canal local 7456 (que identifica la información del nodo LoRa) se mapea con el canal remoto 367680. De este modo el cliente MQTT del gateway enviará la información del canal local 7456 al canal remoto 367680.
La configuración de MQTT en el gateway se realiza de la siguiente manera.
Primero configuramos la conexión con el broker, introduciendo la dirección, el puerto, el usuario y la contraseña. Si el broker trabaja con certificados
Luego configuramos el canal. En mi caso, para hacerlo fácil, asigné el número 0001 tanto al canal local como al remoto.
Programando TTGO LoRa32
Veamos ahora cómo programar la placa TTGO LoRa32 para que funcione con nuestro gateway Dragino LG02.
Para realizar esta prueba de concepto tomé como base el código de este tutorial y le hice algunos pequeños cambios.
ATENCION: Antes de alimentar la placa de desarrollo es recomendable conectarle una antena, porque de lo contrario se puede quemar el transceiver LoRa.
Antes que nada, si todavía no has agregado los módulos de software de las placas ESP32 al entorno de Arduino, lo tendrás que hacer con la siguiente url:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Vamos con la programación de la placa.
En primer lugar, modifiqué la frecuencia de operación, ya que estoy usando la banda de 915 MHz.
//433E6 for Asia
//866E6 for Europe
#define BAND 915E6
//#define BAND 866E6
En segundo lugar, verifiqué los pines que corresponden al control del display y del transceiver LoRa. Esto es importante, porque si los pines no son los correctos, obviamente no podremos controlar el display ni el transceiver.
En este foro hay varias referencias a placas de desarrollo de este tipo
https://www.thethingsnetwork.org/forum/t/big-esp32-sx127x-topic-part-3/18436
Tendrás que encontrar la tuya para realizar la configuración correcta.
En mi caso utilicé la placa TTGO LoRa32 V2, con la configuración para LoRa:
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
Mientras que para el display es la siguiente:
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
El código de prueba lo único que hace es correr un contador y enviar el número en una trama LoRa con el formato requerido por el gateway.
Configuramos el nodo para que funcione con los mismos parámetros que el gateway.
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(125000);
LoRa.setCodingRate4(5);
LoRa.setSyncWord(0x34);
De este modo, las líneas de código que generan el payload LoRa son las siguientes:
LoRa.beginPacket();
LoRa.print("<0001>");
LoRa.print("count=");
LoRa.print(counter);
LoRa.endPacket();
El código completo es el siguiente:
//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//define the pins used by the LoRa transceiver module
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
#define BAND 915E6
//#define BAND 866E6
//OLED pins
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//packet counter
int counter = 0;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
void setup() {
//reset OLED display via software
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("LORA SENDER ");
display.display();
//initialize Serial Monitor
Serial.begin(115200);
Serial.println("LoRa Sender Test");
//SPI LoRa pins
SPI.begin(SCK, MISO, MOSI, SS);
//setup LoRa transceiver module
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(BAND)) {
Serial.println("Starting LoRa failed!");
while (1);
}
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(125000);
LoRa.setCodingRate4(5);
LoRa.setSyncWord(0x34);
Serial.println("LoRa Initializing OK!");
display.setCursor(0,20);
display.print("LoRa Initializing OK!");
display.display();
delay(2000);
}
void loop() {
Serial.print("Sending packet: ");
Serial.println(counter);
//Send LoRa packet to receiver
LoRa.beginPacket();
LoRa.print("<0001>");
LoRa.print("count=");
LoRa.print(counter);
LoRa.endPacket();
display.clearDisplay();
display.setCursor(0,5);
//display.println("LORA SENDER");
display.setCursor(0,20);
display.setTextSize(2);
display.print("LoRa packet sent.");
display.setCursor(0,10);
display.print("Counter:");
display.setCursor(80,50);
display.print(counter);
display.display();
counter++;
delay(60000);
}
Probando, probando . . .
Ahora toca verificar que el nodo esté enviando los mensajes LoRa y que el gateway los esté decodificando y enviando al broker MQTT.
Primero vamos a ver si nuestro gateway está recibiendo los mensajes LoRa. Para esto vamos a la solapa de debug, como muestro en la siguiente figura.

Para decodificar el mensaje, que está en hexadecimal, podemos utilizar una calculadora online que nos permita obtener los caracteres ASCII.
El sitio https://www.binaryhexconverter.com/hex-to-ascii-text-converter puede servir para tal fin. Simplemente copiamos y pegamos el código hexa y le damos al botón de convertir.
Si la recepción LoRa está funcionando, ahora toca verificar el envío de los mensajes MQTT.
Para esto utilicé el software MQTT Explorer, me conecté al broker y verifiqué que estuvieran llegando los mensajes en el tópico correspondiente.
Conclusión
En este tutorial hemos visto cómo realizar una conexión entre una placa TTGO LoRa32 y un gateway Dragino de uno o dos canales, en particular, el LG02.
Si eres nuevo en IoT y necesitas aprender sobre MQTT, LoRa, o cualquier otro concepto relacionado, no dejes de revisar el material de este blog.
Finalmente, te invito a dejar tus dudas, consultas o comentarios más abajo. Estaré encantado de leerte.
9 comentarios
Guillermo · 6 junio, 2021 a las 7:56 AM
Hola admiro tus trabajos.
estoy en pruebas justamente con estos módulos publicando en UBIDOTS/Stem.
En mi LG02 lo he podido hacer funcionar a la frecuencia de 916.8Mhz y he tenido éxito con unos clones argentinos de dragino LORA shield de la empresa emGing.
lo que no he logrado es suscribirme a Ubidots, o sea tocar un boton desde la pàgina y lograr encender un led por lora.
Entré al linux de dragino por Putty y veo que recibe el dato, pero no lo puedo transmitir por LORA.
has tenido alguna experiencia con esto?
Gracias y saludos
Guillermo desde Córdoba Argentina
IoT Consulting · 7 junio, 2021 a las 9:33 AM
Hola Guillermo:
Gracias por comentar. Lo ideal para hacer lo que dices es utilizar LoRaWAN con un servidor de red. De este modo vas a poder usar los downlinks. Para el downlink este gateway utiliza otro canal (el estándar dice qué canales son para downlink según la banda). También tendrás que ver en qué clase utilizas el nodo (A, B o C).
La verdad es que aún no he probado el downlink con estos gateways, pero es algo que haré próximamente.
Cuando lo haga seguro voy a publicar un artículo al respecto.
Espero que te ayude esta información.
Cualquier cosa vuelves a escribir.
Saludos.
Rodrigo.
Emilio Perez · 20 agosto, 2021 a las 4:20 AM
Estoy tratando de implementar un ejemplo de la librería LMIC para gestionar por software el protocolo LoRaWAN. Tengo el mismo modelo de placa TTGO LoRa32 V1, y el mismo modelo del gateway. Pero no logro que se comuniquen el modulo y el gateway (dentro de esta librería Lmic no veo espacio para setear la misma frecuencia que la seteada en el gateway). Te agradecería mucho si me pudieras orientar.
Este tutorial me sirvió muchísimo, pues implementé el código que sugieres y logré (de paso aprendí como hacerlo) visualizar que sí se lograba la comunicación del ttgo y el gateway a través de LoRaLog. Muchas gracias crack.
Saludos desde Ecuador
Emilio Perez · 20 agosto, 2021 a las 4:22 AM
Te añado la librería, en ejemplo estoy ocupando ttt-abp
Emilio Perez · 20 agosto, 2021 a las 4:24 AM
https://github.com/mcci-catena/arduino-lmic
IoT Consulting · 25 agosto, 2021 a las 1:16 PM
Hola Emilio. Me alegro que te haya funcionado. La frecuencia la puedes establecer con #define BAND 915200000 (en este ejemplo es 915.2 MHz).
Saludos!
Rodrigo.
alexander · 25 agosto, 2021 a las 12:23 AM
excelente material felicidades, casualmente tengo los mismos dispositivos un gateway dragino LG02 y dos nodos, uno TTGO LoRa32 y el otro Heltec CubeCell AB01. al igual que tu estoy utilizando la funcion del gateway LoraWAN – MQTT, guiandome con la documentacion de dragino y con el material que posteaste he logrado la funcionalidad tal cual se muestra en este blog. Enviando un dato desde el nodo hasta mi broker MQTT funciona perfectamente. Pero existe un problema cuando intento enviar un dato desde mi broker MQTT hasta el nodo final, el dato no llega, es un problema que lamentablemente no he podido solucionar, espero puedas ayudarme te estaria muy agradecido.
Realice varias pruebas y pude constatar que el dato que envio desde mi Broker MQTT llega hasta el gateway, pero por alguna razon que desconozco el dato no es retransmitido hacia los nodos, y lo raro es que verificando en la consola del gateway dragino, ejecutando el comando «logread -f» una vez que el dato es enviado desde el Broker me muestra como si el dato se estuviera retransmitiendo a los nodos, esto lo verifique en consola, aqui la salida:
RXTX~ (TXPKT): [push] {«txpk»:{«freq»:433000000,»powe»:20,»datr»:»SF7BW125″,»codr»:»4/5″,»ipol»:false,»data»:»test»}}
segun la documentacion, esto significa que el gateway esta retransmitiendo el dato, pero esto no se ve reflejado en los nodos finales, pude descartar que el error este en los nodos verificando que recepcionan datos de manera correcta (realice una conexion punto a punto entre dos nodos para verificar la recepcion y envio de los nodos) todos los nodos y el gateway que utilizo traban a 433 Mhz….. busque mucho en la red pero no he podido encontrar algun problema similar, cualquier recomendacion, ayuda o solucion te estaria sumamente agradecido ….gracias
IoT Consulting · 25 agosto, 2021 a las 1:11 PM
Muchas gracias Alexander por comentar. Te cuento que por ahora no he experimentado con downlinks para esta manera de funcionamiento. Es un tema pendiente sobre el que seguro realizaré un artículo. La verdad es que no he tenido tiempo de ponerme con eso. Pero estate atento a las nuevas publicaciones ;).
Saludos!
Rodrigo.
alexander · 25 agosto, 2021 a las 7:08 PM
estare atento a tus publicaciones …….no te tardes 😉 un saludo