Primeros pasos con el módulo ESP32 TTGO con LoRa

Hace tiempo que compré una pareja de ESP32 con conectividad LoRa para poder probar a hacer un tutorial para la web. Os publico mis primeros pasos así como el código que he localizado aquí, para poder modificarlo y que funcione en estos dispositivos.

Estuve mirando diferentes códigos para poder hacer las pruebas iniciales, pero, mirando en github, algunos de los que probé no funcionaban y, por ejemplo, la pantalla no la encendían. Mirando por internet, encontré los mismos y unos pequeños ejemplos. Los quiero publicar, primero, para no perderlos yo, y segundo por si os ayudan en caso de querer probarlos.

Para aquellos que no lo conozcan, LoRa es un tipo de conectividad de gran alcance con poca alimentación. Usando estos dispositivos, podemos transmitir a grandes distancias, por que lo la idea que llevo es poder controlar la puerta de mi trastero desde casa.

Vivo en un primero y debajo de mi existe un piso y, un piso más abajo tengo mi trastero, haciendo las primeras pruebas, he visto que con LoRa llego y, por tanto, lo que haré es poner un sensor de puerta con cable al ESP32 y, en caso de detectar la puerta abierta, mandar un mensaje al otro dispositivo y, este, comunicarlo a Home Assistant. Os muestro el funcionamiento inicial con estos dispositivos y, si os interesa, os pongo los enlaces de compra por si queréis ir haciendo pruebas y ver si os llega la cobertura donde queráis controlar algo.

Vídeo del ejemplo del ESP32 con LoRa

Compra de los TTGO ESP32 con LoRa

  • Podéis comprar los TTGO ESP32 con LoRa aquí (precio de la pareja) o aquí. Sale más económico normalmente en el primero, Banggood.

Código de ejemplo

De momento solo he hecho la prueba con la transmisión y recepción, por lo que podéis probarlos como he hecho yo. Para compilarlos y flashearlos, he usado el IDE de Arduino, y, para ello, he tenido que instarla dentro de él lo siguiente:

  • Instalamos los microcontroladores de expressif. Para ello, si no lo tenéis ya, tendréis que ir, dentro de Arduino IDE a Archivo > Preferencias y en “Gestor de URL Adicionales de Tarjetas” poner esta URL:
https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json

Debería quedar algo así:

Arduino IDE con las URL de las placas de expressif

  • Ahora vamos a instalar las librerias que necesitaremos, para ello, nos vamos a Herramientas > Administrar Bibliotecas y tenemos que instalar las siguientes:
    • Buscamos “SSD1306” e instalamos la que pone Adafruit SSD1306 by Adafruit
    • Buscamos “GFX” e instalamos Adafruit GFX Library by Adafruit
    • Boscamos “LoRa” e instalamos LoRa by Sandeep Minstry

Después de tener instaladas todas, reiniciamos Arduino IDE y comenzamos con el código.

Emisor y Receptor de LoRa

Para poder trabajar con el ejemplo, vamos a implementar un emisor que lanzará los packetes LoRa con un número y un receptor que lo recogerá y mostrará el número así como la calidad de la señal. En ambos casos, la pantalla estará mostrando tanto el mensaje enviado como el recibido.

Emisor LoRa

//Libraries for LoRa
#include 
#include 

//Libraries for OLED Display
#include 
#include 
#include 

//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
//915E6 for North America
#define BAND 866E6

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#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(1);
  display.setCursor(0,0);
  display.print("LORA SENDER ");
  display.display();
  
  //initialize Serial Monitor
  Serial.begin(115200);
  
  Serial.println("Prueba de envio LoRa");

  //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);
  }
  Serial.println("LoRa Inicializacion OK!");
  display.setCursor(0,10);
  display.print("Inicializacion OK!");
  display.display();
  delay(2000);
}

void loop() {
   
  Serial.print("Enviando paquete: ");
  Serial.println(counter);

  //Send LoRa packet to receiver
  LoRa.beginPacket();
  LoRa.print("DEC ");
  LoRa.print(counter);
  LoRa.endPacket();
  
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("DOMOTICA EN CASA");
  display.setCursor(0,20);
  display.setTextSize(1);
  display.print("Paquete LoRa enviado.");
  display.setCursor(0,30);
  display.print("Contador: ");
  display.setCursor(60,30);
  display.print(counter);      
  display.display();

  counter++;
  
  delay(10000);
}

Una vez que lo tenemos, le podemos dar a subir, y, si tenemos el dispositivo en el USB debería poder flashearlo directamente, ya que, las placas incluyen el CP2102 para poder flashearlo sin tener que usar nada adicional.

Receptor LoRa

//Libraries for LoRa
#include 
#include 

//Libraries for OLED Display
#include 
#include 
#include 

//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
//915E6 for North America
#define BAND 866E6

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

String LoRaData;

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(1);
  display.setCursor(0,0);
  display.print("LORA RECEIVER ");
  display.display();
  
  //initialize Serial Monitor
  Serial.begin(115200);

  Serial.println("LoRa Receiver 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);
  }
  Serial.println("LoRa Initializing OK!");
  display.setCursor(0,10);
  display.println("LoRa Inicializacion OK!");
  display.display();  
}

void loop() {

  //try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    //received a packet
    Serial.print("Received packet ");

    //read packet
    while (LoRa.available()) {
      LoRaData = LoRa.readString();
      Serial.print(LoRaData);
    }

    //print RSSI of packet
    int rssi = LoRa.packetRssi();
    Serial.print(" with RSSI ");    
    Serial.println(rssi);

   // Dsiplay information
   display.clearDisplay();
   display.setCursor(0,0);
   display.print("DOMOTICA EN CASA");
   display.setCursor(0,20);
   display.print("Mensaje recibido:");
   display.setCursor(0,30);
   display.print(LoRaData);
   display.setCursor(0,40);
   display.print("RSSI:");
   display.setCursor(30,40);
   display.print(rssi);
   display.display();   
  }
}

Hacemos lo mismo en el caso del receptor, y, una vez finalizado, debemos poder encender ambos deberíamos ver lo siguiente:

ttgo esp32 con lora

Ahora, como digo, esto es un primer contacto y, por tanto, tocará modificarlo para poder detectar el sensor de puerta en la patilla correspondiente y, si queremos, podemos añadir más cosas y hacer que lo mande, por ejemplo, temperatura y humedad.

Quisiera probar firmware como OpenMqttGateway y ESPHome para ver si es posible usar LoRa así como el display del dispositivo e integrarlos de una forma más cómoda en Home Assistant, no obstante, con este código de ejemplo, ya se puede ir empezando a jugar con los dispositivos.

La entrada Primeros pasos con el módulo ESP32 TTGO con LoRa se publicó primero en Domótica en Casa.

Eduardo Ruiz

Informático de vocación, apasionado de la tecnología y blogger desde hace mucho tiempo, escribo de lo que me entretiene y disfruto con ello. Si deseas seguirme, usa el rss del blog o en mi perfil de .