La serie LoRa-E5 de Seeed Studio es una potente línea de módulos LoRaWAN que incorpora el MCU STM32WLE5JC y el módulo RF SX126X en un solo chip. Se puede utilizar en una red LoRaWAN, así como para configurar tu propia red LoRa. Esta guía trata sobre lo último.
Requisitos
Dos módulos LoRa-E5. Puede ser cualquiera de la serie Wio-E5, como el Wio-E5 Development Kit, la placa Wio-E5 Mini o Groove-Wio-E5
Cualquier placa Arduino con al menos dos interfaces seriales
Un ESP32 o ESP8266
Cables de conexión
Una cuenta de Ubidots
Arduino IDE instalado
Biblioteca de Ubidots funcionando en Arduino
Biblioteca de Arduino “ArduinoJson” instalada
1. Configurar el Módulo que Actúa como Gateway
Conecta el módulo ESP32 o ESP8266 al módulo Wio-E5 Groove de la siguiente manera:
Si estás usando Wio-E5 mini:
Conecta el terminal “RX” del ESP32 a “TX” en el LoRa-E5 mini (el que tiene la etiqueta verde)
Conecta el terminal “TX” del ESP32 a “RX” en el LoRa-E5 mini (el que tiene la etiqueta verde)
Conecta el terminal “3V3” del ESP32 a “V+” en el LoRa-E5 mini
Conecta el terminal “GND” del ESP32 a “V-” en el LoRa-E5 mini
Si estás usando Wio-E5 DevKit:
Conecta el terminal “RX” del ESP32 a “TX” en el LoRa-E5 DevKit
Conecta el terminal “TX” del ESP32 a “RX” en el LoRa-E5 DevKit
Conecta el terminal “3V3” del ESP32 a “Vin” en el LoRa-E5 DevKit
Conecta el terminal “GND” del ESP32 a “GND” en el LoRa-E5 DevKit
Consejo Profesional: Recuerda conectar la antena a tu dispositivo Wio-E5 antes de operar para evitar daños en el chip.
El siguiente paso requiere que hayas instalado la biblioteca de Ubidots para ESP32 o ESP8266. Sigue los enlaces dados si aún no lo has hecho
Lanza el Arduino IDE
Conecta el ESP32 o ESP8266 a la PC a través de un cable USB
Ve a “Herramientas” → "Placa" y selecciona el dispositivo que estás usando\
Selecciona el “Puerto” apropiado al que está conectado tu dispositivo
Sube el siguiente código al ESP32 teniendo en cuenta que debes cambiar las siguientes configuraciones:
const char* UBIDOTS_TOKEN = "your-token"; establece esta variable con tu token de Ubidots
const char* WIFI_SSID = "SSID"; establece esta variable para que coincida con tu SSID de WiFi
const char* WIFI_PASS = "PASS"; establece esta variable para que coincida con tu contraseña de WiFi
#include <ArduinoJson.h>#define LoRaSerial Serial2#include "Ubidots.h"const char* UBIDOTS_TOKEN = "your-token";const char* WIFI_SSID = "SSID"; const char* WIFI_PASS = "PASS"; // Pon aquí tu contraseña de Wi-Fi Ubidots ubidots (UBIDOTS_TOKEN, UBI_HTTP); static char receiverBuffer[512];char tempBuffer[128];static int sendCommandWithACK(char *p_ack, int timeout_ms, char *p_cmd, ...){ int responseChar; int index = 0; int startMillis = 0; va_list args; memset(receiverBuffer, 0, sizeof(receiverBuffer)); va_start(args, p_cmd); Serial2.print(p_cmd); Serial.print(p_cmd); va_end(args); delay(200); startMillis = millis(); if (p_ack == NULL) return 0; do { while (Serial2.available() > 0) { responseChar = Serial2.read(); receiverBuffer[index++] = responseChar; Serial.print((char)responseChar); delay(2); } if (strstr(receiverBuffer, p_ack) != NULL) return 1; } while (millis() - startMillis < timeout_ms); Serial.println(); return 0;} static void recv_prase(char *p_msg, char *dum){ if (p_msg == NULL) { Serial.println("Recibido nulo"); return; } char *p_start = NULL; char data[128]; // Para almacenar los bytes recibidos como caracteres int bytes_len=0; p_start = strstr(p_msg, "RX"); if (p_start && (1 == sscanf(p_start, "RX \"%s\"", &data))) { for (int i=0; i<sizeof(data); i++) { if(int(data[i+1])==0) { bytes_len = i; break; } } // Convierte los caracteres a un byteArray int message_len = bytes_len/2+1; char out[message_len]; auto getNum = [](char c){ return c > '9' ? c - 'A' + 10 : c - '0'; }; for (int x=0, y=0; x<bytes_len; ++x, ++y) out[y] = (getNum(data[x++]) << 4) + getNum(data[x]); out[message_len] = '\0'; snprintf(dum, 128, "%s", out); }}bool setModuleListening(void){ Serial.print("Verificando si el módulo está conectado\r\n"); sendCommandWithACK("+AT: OK", 100, "AT\r\n"); sendCommandWithACK("+MODE: TEST", 1000, "AT+MODE=TEST\r\n"); bool temp = sendCommandWithACK("+TEST: RXLRPKT", 5000, "AT+TEST=RXLRPKT\r\n"); delay(200); return temp;}void setup(void){ bool LoRaSetup = false; Serial.begin(9600); LoRaSerial.begin(9600); ubidots.wifiConnect(WIFI_SSID, WIFI_PASS); while(!LoRaSetup) { LoRaSetup = setModuleListening(); }} void loop(void){ char cmd[128]; // Transmitir valor HEX sprintf(cmd, ""); int ret = sendCommandWithACK("+TEST: RX", 1000, ""); if (ret) { recv_prase(receiverBuffer, dum); DynamicJsonDocument doc(1024); deserializeJson(doc, tempBuffer); JsonObject obj = doc.as<JsonObject>(); long temperature = obj[String("temperature")]; Serial.print(temperature); ubidots.add("temperature", temperature); bool bufferSent = false; bufferSent = ubidots.send("wio-e5-gateway"); if(bufferSent){ Serial.println("enviado exitosamente"); } else Serial.println("no enviado"); } else Serial.println("¡Recepción fallida!\r\n\r\n"); delay(500); }
2. Configurar Conexiones para el Módulo que Actúa como Nodo
Esta guía utiliza una placa Arduino Mega, sin embargo, puedes usar cualquiera de tu elección, solo ten en cuenta que debes usar el “TX1” y “RX1” en lugar de “TX0” y “RX0” ya que esta última interfaz serial se utiliza para la comunicación con la PC. Por ejemplo, en una placa Arduino Uno, el “TX1” y “RX1” son los pines etiquetados como “~6” y “~7” respectivamente.
Conecta el dispositivo de la serie Wio-E5 a la placa Arduino de la siguiente manera
Si estás usando el Wio-E5 DevKit o Wio-E5 groove, puedes hacer las conexiones basadas en la información de la sección 1.
Lanza el Arduino IDE
Conecta la placa Arduino a la PC a través de un cable USB
Selecciona la placa y el puerto apropiados, tal como en la sección anterior
Sube el siguiente código al Arduino
#include <ArduinoJson.h>#define LoRa Serial1static char receiverBuffer[512];static int sendCommandWithACK(char *ACKMsg, int timeoutMS, char *CMD, ...){ int responseChar; int receivedMsgIndex = 0; int startMillis = 0; va_list args; memset(receiverBuffer, 0, sizeof(receiverBuffer)); va_start(args, CMD); Serial.print("Enviando comando: "); Serial.print("\n\r\t"); Serial.println(CMD); LoRa.print(CMD); va_end(args); delay(200); startMillis = millis(); if (ACKMsg == NULL) return 0; Serial.println("respuesta del módulo: "); Serial.print("\t"); do { while (LoRa.available() > 0) { responseChar = LoRa.read(); receiverBuffer[receivedMsgIndex++] = responseChar; Serial.print((char)responseChar); delay(2); } if (strstr(receiverBuffer, ACKMsg) != NULL) return 1; } while (millis() - startMillis < timeoutMS); Serial.println(); return 0;} void setup(void){ bool LoRaSetup = false; Serial.begin(9600); LoRa.begin(9600); while(!LoRaSetup) { LoRaSetup = setModuleBroadcasting(); } }bool setModuleBroadcasting(void){ Serial.print("Verificando si el módulo está conectado\r\n"); sendCommandWithACK("+AT: OK", 100, "AT\r\n"); return sendCommandWithACK("+MODE: TEST", 1000, "AT+MODE=TEST\r\n"); }void loop(void){ int sensorValue = random(20,80); char cmdBuffer[512]; char payloadBuffer[256]; char ACKBuffer[256]; snprintf(payloadBuffer, sizeof(payloadBuffer), "%s%d%s", "{'temperature':", sensorValue, "}"); snprintf(ACKBuffer, sizeof(ACKBuffer), "%s%s%s%s", "+TEST: TXLRSTR ", "\"", payloadBuffer, "\""); snprintf(cmdBuffer, sizeof(cmdBuffer), "AT+TEST=TXLRSTR,\"%s\"\r\n", payloadBuffer); int ret = sendCommandWithACK(ACKBuffer, 1000, cmdBuffer); if (ret) Serial.println("Enviado exitosamente"); else Serial.println("¡Envío fallido!\r\n\r\n"); delay(5000); }
Si todo está cableado correctamente, deberías poder ver ambos dispositivos comunicándose entre sí usando LoRa. A continuación se muestra la salida del monitor serial de Arduino:
3. Visualizar datos en Ubidots
Ve a tu cuenta de Ubidots → “Dispositivos” y verás un nuevo dispositivo creado con datos siendo ingeridos
El código se basó en el que se encuentra aquí.
4. Comentarios, Sugerencias y Artículos Relacionados
No dudes en publicar preguntas o sugerencias en nuestro portal comunitario, o contáctanos a través de support@ubidots.com.
Otros usuarios también encontraron útil...