Grove - LoRa-E5

Grove LoRa-E5 embedded with LoRa-E5 STM32WLE5JC, powered by ARM Cortex M4 ultra-low-power MCU core and LoRa SX126x, is a wireless radio module supporting LoRa and LoRaWAN protocol on the EU868 & US915 frequency and (G)FSK, BPSK, (G)MSK, LoRa modulations. Grove - LoRa-E5 can endow your development boards' strong features of ultra-long transmitting range by easily plug and play with Grove connector on board.

As an upgrade of our old version - Grove - LoRa Radio - powered by RFM95 ultra-long-range Transceiver Module, Grove LoRa-E5 embedded with LoRa-E5 STM32WLE5JC Module is a high-performance and easy-to-use wireless radio LoRa module supporting LoRaWAN protocol.

LoRa-E5 LoRaWAN STM32WLE5JC module is the major functional part integrated into Grove - LoRa-E5. It is a LoRaWAN module that embedded with ARM Cortex M4 ultra-low-power MCU core and LoRa SX126x, as the world-first combo of LoRa RF and MCU chip into one single tiny module, it supports (G)FSK, BPSK, (G)MSK, and LoRa modulations, and is FCC, CE certified. (Learn more about LoRa-E5 from LoRa-E5 wiki)

More comparison between the LoRa-E5 and RFM95 chip:

By connecting Grove - LoRa-E5 to your development boards, your devices are able to communicate with and control LoRa-E5 conveniently by AT command through UART connection. Grove LoRa-E5 will be a superior choice for IoT device development, testing, and long-distance, ultra-low power consumption IoT scenarios like smart agriculture, smart office, and smart industry. It is designed with industrial standards with a wide working temperature at -40℃ ~ 85℃, high sensitivity between -116.5 dBm and -136 dBm, and power output between 10 dBm and 22 dBm.


  • LoRa-E5 (STM32WLE5JC) embedded
  • Support LoRaWAN protocol on EU868/US915 frequency band
  • Ultra-long transmitting range up to 10km (Ideal value in open space)
  • Easy control by AT command via UART connection
  • Rapid prototyping with plug-and-play Grove interfaces
  • Ultra-low power consumption and high performance

Harware Overview

  1. LoRa-E5 STM32WLE5JC (Datasheet)

  2. MHF IPEX Connector

  3. Wire Antenna

  4. Grove Connector

  5. LED Indicators

Platform Supported

Arduino Raspberry Pi


General Parameters
Voltage Supply:  3.3V - 5V
Power Output:  Up to +20 dBm at 3.3V
Working Frequency 868/915MHz
Protocol LoRaWAN
Sensitivity -116.5dBm ~ -136dBm
Modulation LoRa, (G)FSK, (G)MSK and BPSK
Current Only 60uA in sleep mode
Size 20*40mm
Working Temperature -40℃ ~ 85℃
Part List:
Grove - LoRa-E5 PCBA *1
Grove Universal Cable *1


  • Works for LoRaWAN sensor nodes and any wireless communication application

  • IoT device testing and development

Application Notes

1. Factroy AT Firmare

LoRa-E5 series has a built-in AT command firmware, which supports LoRaWAN Class A/B/C protocol and a wide frequency plan: EU868/US915/AU915/AS923/KR920/IN865. With this AT command firmware, developers can easily and quickly build their prototype or application.

The AT command firmware contains a bootloader for DFU and the AT application. The "PB13/SPI_SCK/BOOT" pin is used to control LoRa-E5 to stay in the bootloader or jump to the AT application. When PB13 is HIGH, the module will jump to AT application after reset, with a default baud rate of 9600. When PB13 is LOW (press the "Boot" button on LoRa-E5 Dev Board or LoRa-E5 mini), the module will stay in the bootloader, and keep transmitting "C" character every 1S at baud rate 115200.


  • Factory AT Firmware is programmed with RDP(Read Protection) Level 1, developers need to remove RDP first with STM32Cube Programmer. Note that regression RDP to level 0 will cause a flash memory mass to erase and the Factory AT Firmware can't be restored again.
  • The "PB13/SPI_SCK/BOOT" pin on the LoRa-E5 module is just a normal GPIO, not the "BOOT0" pin of the MCU. This "PB13/SPI_SCK/BOOT" pin is used in the bootloader of the Factory AT firmware, to decide to jump to APP or stay in bootloader(for DFU). The real "BOOT0" pin doesn't pinout to the module, so users need to be careful when developing the low-power applications.

2. Clock Configuration

2.1 HSE

  • 32MHz TCXO

  • TCXO power supply: PB0-VDD_TCXO

2.2 LSE

  • 32.768KHz crystal oscillator

3. RF Switch

LoRa-E5 module ONLY transmits through RFO_HP:

  • Receive: PA4=1, PB5=0

  • Transmit(high output power, SMPS mode): PA4=0, PB5=1

Getting Started


Here is a demo showing you how to connect TTN (The Things Network) and Seeeduino XIAO module via Grove - LoRa-E5 module. These modules are able to collect temperature and humidity parameters from the environment and send them back to TTN. The flashing LED lights on the Seeeduino Xiao indicate the status of the temperature and humidity sensor as connecting to TTN cloud.


Please ensure the consistent of the frequency band among the end nodes, gateway, and TTN configuration you are using by following this instruction. The frequency plan this demo applied is for EU868.

Hardware Required

Seeeduino XIAO Grove - LoRa-E5 Seeeduino XIAO Expansion Board Grove - Temperature & Humidity Sensor (DHT11)
Get ONE Now Get ONE Now Get ONE Now Get ONE Now


If this is your first time using Seeeduino XIAO, please refer to Seeeduino XIAO's wiki. If this is your first time to use Arduino, Arduino’s website is a great resource for you to start your Arduino journey.

Hardware Connection

  • Step 1. Connect the LoRa-E5 module directly to the "UART" slot.

  • Step 2. Put DH11 into the "A0/D0" socket. As shown below.

  • Step 3. Download the code, please refer to the software part.

point to point transmission with grove lora e5

Software Preparation


If this is the first time you work with Arduino, we strongly recommend you to see Getting Started with Arduino before the start. Click to learn about detail about how to install an Arduino Library

Download Library

Software Code

Download the example; copy the code stick onto the Aruino IDE and then upload it.

#include <Arduino.h>
#include <U8x8lib.h>
#include "DHT.h"

#define DHTPIN 0 // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
// #define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)


U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/U8X8_PIN_NONE);
// U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // OLEDs without Reset of the Display

static char recv_buf[512];
static bool is_exist = false;
static bool is_join = false;
static int led = 0;

static int at_send_check_response(char *p_ack, int timeout_ms, char *p_cmd, ...)
    int ch;
    int num = 0;
    int index = 0;
    int startMillis = 0;
    va_list args;
    memset(recv_buf, 0, sizeof(recv_buf));
    va_start(args, p_cmd);
    Serial1.printf(p_cmd, args);
    Serial.printf(p_cmd, args);
    startMillis = millis();

    if (p_ack == NULL)
        return 0;

        while (Serial1.available() > 0)
            ch = Serial1.read();
            recv_buf[index++] = ch;

        if (strstr(recv_buf, p_ack) != NULL)
            return 1;

    } while (millis() - startMillis < timeout_ms);
    return 0;

static void recv_prase(char *p_msg)
    if (p_msg == NULL)
    char *p_start = NULL;
    int data = 0;
    int rssi = 0;
    int snr = 0;

    p_start = strstr(p_msg, "RX");
    if (p_start && (1 == sscanf(p_start, "RX: \"%d\"\r\n", &data)))
        u8x8.setCursor(2, 4);
        u8x8.print("led :");
        led = !!data;
        if (led)
            digitalWrite(LED_BUILTIN, LOW);
            digitalWrite(LED_BUILTIN, HIGH);

    p_start = strstr(p_msg, "RSSI");
    if (p_start && (1 == sscanf(p_start, "RSSI %d,", &rssi)))
        u8x8.setCursor(0, 6);
        u8x8.print("                ");
        u8x8.setCursor(2, 6);
    p_start = strstr(p_msg, "SNR");
    if (p_start && (1 == sscanf(p_start, "SNR %d", &snr)))
        u8x8.setCursor(0, 7);
        u8x8.print("                ");
        u8x8.setCursor(2, 7);
        u8x8.print("snr :");

void setup(void)

    digitalWrite(LED_BUILTIN, HIGH);

    Serial.print("E5 LORAWAN TEST\r\n");
    u8x8.setCursor(0, 0);

    if (at_send_check_response("+AT: OK", 100, "AT\r\n"))
        is_exist = true;
        at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
        at_send_check_response("+MODE: LWOTAA", 1000, "AT+MODE=LWOTAA\r\n");
        at_send_check_response("+DR: EU868", 1000, "AT+DR=EU868\r\n");
        at_send_check_response("+CH: NUM", 1000, "AT+CH=NUM,0-2\r\n");
        at_send_check_response("+KEY: APPKEY", 1000, "AT+KEY=APPKEY,\"2B7E151628AED2A6ABF7158809CF4F3C\"\r\n");
        at_send_check_response("+CLASS: C", 1000, "AT+CLASS=A\r\n");
        at_send_check_response("+PORT: 8", 1000, "AT+PORT=8\r\n");
        u8x8.setCursor(5, 0);
        is_join = true;
        is_exist = false;
        Serial.print("No E5 module found.\r\n");
        u8x8.setCursor(0, 1);
        u8x8.print("unfound E5 !");


    u8x8.setCursor(0, 2);
    u8x8.setCursor(2, 2);

    u8x8.setCursor(2, 3);

    u8x8.setCursor(2, 4);
    u8x8.print("led :");

void loop(void)
    float temp = 0;
    float humi = 0;

    temp = dht.readTemperature();
    humi = dht.readHumidity();

    Serial.print("Humidity: ");
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(" *C");

    u8x8.setCursor(0, 2);
    u8x8.print("      ");
    u8x8.setCursor(2, 2);
    u8x8.setCursor(2, 3);

    if (is_exist)
        int ret = 0;
        if (is_join)

            ret = at_send_check_response("+JOIN: Network joined", 12000, "AT+JOIN\r\n");
            if (ret)
                is_join = false;
                at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
                Serial.print("JOIN failed!\r\n\r\n");
            char cmd[128];
            sprintf(cmd, "AT+CMSGHEX=\"%04X%04X\"\r\n", (int)temp, (int)humi);
            ret = at_send_check_response("Done", 5000, cmd);
            if (ret)
                Serial.print("Send failed!\r\n\r\n");

TTN Console Configuration Setup


  • Step 2: Add an Application:

  • Application ID: Enter a unique name.

  • Description: Enter a description.

  • Handler registration: select the same handler as the gateway router.

  • Select Add Application to continue.


  • Step 3: Add a decoding script to the application and save.


function Decoder(bytes, port) {

  var decoded = {};
  if (port === 8) {
    decoded.temp = bytes[0] <<8 | bytes[1];
    decoded.humi = bytes[2] <<8 | bytes[3];

  return decoded;
  • Step 4: Add Grove - LoRa-E5 device to the TTN Console

  • Run the downloaded program module, view the DEVEUI and APP EUI of the LoRa-E5 module through the serial port.


  1. Add these two EUIs to the application.


  • Step 5: Register Device: enter the registered device page


  1. Device ID: Enter a unique name.

  2. Device EUI: Select the E5 dev EUI.

  3. APP KEY: Use this APPkey 2B7E151628AED2A6ABF7158809CF4F3C

  4. App EUI: Select the E5 App EUI.


  • Step 6: Gateway Registration on TTN Console

Please refer to the instruction shown in The Things Indoor Gateway wiki page: The Things Indoor Gateway Get Started with SenseCAP


  • Step 7: Review Result

you can check the readings via the Serial Monitor.

Temperature and Humidity Parameters

  • Step 1: Enter the APPLICATION created in TTN, click on the data page to view the reported data

  • Step 2: LED control

Enter the current device control page. Send the specified data in the “DOWNLINK” window.

Send "01" to turn on LED light; Send "00" to turn off:




Relevant SDK:

Tech Support

Please submit any technical issue into our forum.