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í:
- 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 <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 //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 <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 //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:
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.
Buenas, Eduardo. ¿Lograste configurar y conectar uno de los nodos como gateway?