Seeed Studio’s LoRa-E5 series is a powerful line of LoRaWAN modules embedding STM32WLE5JC MCU and SX126X RF module in a single chip. It can be used in a LoRaWAN network as well as to setup your own LoRa network. This guide is about the latter.
Requirements
Two LoRa-E5 modules. It can be any of the Wio-E5 series such as Wio-E5 Development Kit, Wio-E5 Mini board or Groove-Wio-E5
Any Arduino board with at least two serial interfaces
A ESP32 or ESP8266
Jumper wires
An Ubidots account
Arduino IDE installed
Ubidots library running on Arduino
Arduino library “ArduinoJson” installed
1. Set Up the Module Acting as Gateway
Connect the ESP32 or ESP8266 module to the Wio-E5 Groove module in the following way:
If you are using Wio-E5 mini:
Connect the ESP32’s “RX” terminal to “TX” on the LoRa-E5 mini (the one with the green label)
Connect the ESP32’s “TX” terminal to “RX” on the LoRa-E5 mini (the one with the green label)
Connect ESP32’s “3V3” terminal to “V+” on the LoRa-E5 mini
Connect ESP32’s “GND” terminal to “V-” on the LoRa-E5 mini
If you are using Wio-E5 DevKit:
Connect the ESP32’s “RX” terminal to “TX” on the LoRa-E5 DevKit
Connect the ESP32’s “TX” terminal to “RX” on the LoRa-E5 DevKit
Connect ESP32’s “3V3” terminal to “Vin” on the LoRa-E5 DevKit
Connect ESP32’s “GND” terminal to “GND” on the LoRa-E5 DevKit
Pro Tip: Remember to connect the antenna to your Wio-E5 device before operation in order to avoid chip damages.
The following step requires you to have installed the Ubidots library for either ESP32 or ESP8266. Follow the given links in you haven’t done so yet
Launch the Arduino IDE
Connect the ESP32 or ESP8266 to the PC via USB cable
Go to “Tools” → "Board" and select the device that you are using\
Select the appropriate “Port” to which your device is connected
Upload the following code to the ESP32 taking into account that you must change the following settings:
const char* UBIDOTS_TOKEN = "your-token"; set this variable to your Ubidots token
const char* WIFI_SSID = "SSID"; set this variable to match your WIFi SSID
const char* WIFI_PASS = "PASS"; set this variable so it matches your WIFi password
#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"; // Put here your Wi-Fi password
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("Received null");
return;
}
char *p_start = NULL;
char data[128]; // To hold the received bytes as characters
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;
}
}
// Convert the characters to a 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("Checking if the module is connected\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];
// Transmit HEX Value
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("sent succesfull");
}
else Serial.println("not sent");
}
else
Serial.println("Receive failed!\r\n\r\n");
delay(500);
}
2. Set up Connections for the Module Acting as a Node
This guide uses an Arduino Mega board, however you can use any of your choice, just keep in mind that you should use the “TX1” and “RX1” instead of “TX0” and “RX0” since the latter serial interface is used for the communication with the PC. E.g. On a Arduino Uno board, the “TX1” and “RX1” are the pins labeled as “~6” and “~7” respectively.
Connect the Wio-E5 series device to the Arduino board in the following way
If you are using either the Wio-E5 DevKit or Wio-E5 groove, you can make the connections based on the information from section 1.
Launch the Arduino IDE
Connect the Arduino board to the PC via USB cable
Select the appropriate board and port just as in the previous section
Upload the following code to the Arduino
#include <ArduinoJson.h>
#define LoRa Serial1
static 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("Sending command: ");
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("module response: ");
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("Checking if the module is connected\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("Sent succesfull");
else
Serial.println("Send failed!\r\n\r\n");
delay(5000);
}
If everything is wired correctly, you should be able to see both devices communicating to each other using LoRa. The following is Arduino’s Serial monitor output:
3. Visualize data on Ubidots
Go to your Ubidots account → “Devices” and you’ll see a newly created device with data being ingested
The code was based on the one found here.
4. Feedback, Suggestions, and Related Articles
Feel free to post questions or suggestions in our community portal, or contact us via support@ubidots.com.
Other users also found helpful...