XIAO ESP32S3 interfacing with Grove - Wio-E5

Hi, I am also new to the LoRa and LoRaWan World. I have an XIAO ESP32S3 and the expansion board as well as the Grove Wio E5 and I am trying to use it with TTN however when I use the code provided on Grove - Wio-E5 TTN Demo | Seeed Studio Wiki it does not seem to detect the wio module. I have tweaked the code to send data from the Grove Sunlight Sensor but the core functionality does not work as it does not seem to find the wio module. this is my code: When i run this I get the output printing out the IR and Visible values however initially i get: No E5 module found. I am really confused why and cant seem to get anything working. I have run some code from GitHub - andresoliva/LoRa-E5: Advanced application of SeedStudio module Grove-Wio-E5 based on chip STM32WLE5JC from STM connected to an Arduino Nano 33 BLE Sense board. Works with any Arduino that supports UART. This confused me more since I got a response which was a devEui however the setup on the TTN did not seem to get any data and it seems like that code breaks quite a lot of fair play policies. Any help will be appreciated. I have attached an image of my setup as well as pasted the code below.

#include <Arduino.h>            // Include Arduino core library
#include <U8x8lib.h>            // Include U8x8 library for OLED display
#include <Wire.h>               // Include Wire library for I2C communication
#include "Si115X.h"             // Include Si115X sensor library

Si115X si1151;                  // Create an instance of Si115X sensor

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/*reset=*/U8X8_PIN_NONE); // Create an instance of OLED display

static char recv_buf[512];      // Buffer to store received data
static bool is_exist = false;   // Flag to check if E5 module exists
static bool is_join = false;    // Flag to check if LoRaWAN network is joined
static int led = 0;             // LED state

// Function to send AT command and check response
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)); // Clear receive buffer
    va_start(args, p_cmd);
    Serial1.printf(p_cmd, args);   // Print formatted command to Serial1
    Serial.printf(p_cmd, args);     // Print formatted command to Serial
    va_end(args);
    delay(200);
    startMillis = millis(); // Get current time

    if (p_ack == NULL)
    {
        return 0;
    }

    do
    {
        while (Serial1.available() > 0)
        {
            ch = Serial1.read();
            recv_buf[index++] = ch; // Store received character
            Serial.print((char)ch); // Print received character
            delay(2);
        }

        if (strstr(recv_buf, p_ack) != NULL) // Check if expected response received
        {
            return 1;
        }

    } while (millis() - startMillis < timeout_ms); // Continue until timeout
    return 0;
}

// Function to parse received message
static void recv_prase(char *p_msg)
{
    if (p_msg == NULL)
    {
        return;
    }
    char *p_start = NULL;
    int data = 0;
    int rssi = 0;
    int snr = 0;

    // Parse received data
    p_start = strstr(p_msg, "RX");
    if (p_start && (1 == sscanf(p_start, "RX: \"%d\"\r\n", &data)))
    {
        // Print received data to serial monitor
        Serial.println(data);
        // Display LED status on OLED
        u8x8.setCursor(2, 4);
        u8x8.print("led :");
        led = !!data;
        u8x8.print(led);
        // Toggle LED
        if (led)
        {
            digitalWrite(LED_BUILTIN, LOW);
        }
        else
        {
            digitalWrite(LED_BUILTIN, HIGH);
        }
    }

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

// Arduino setup function
void setup(void)
{
    u8x8.begin();                               // Initialize OLED display
    u8x8.setFlipMode(1);
    u8x8.setFont(u8x8_font_chroma48medium8_r);

    Serial.begin(115200);                       // Initialize serial communication
    pinMode(LED_BUILTIN, OUTPUT);               // Set LED pin as output
    digitalWrite(LED_BUILTIN, HIGH);            // Turn off LED

    Serial1.begin(9600);                        // Initialize serial communication with E5 module
    Serial.print("E5 LORAWAN TEST\r\n");
    u8x8.setCursor(0, 0);

    Wire.begin();                               // Initialize I2C communication
    if (!si1151.Begin()) {
        Serial.println("Si1151 is not ready!");
        while (1) {
            delay(1000);
            Serial.print(".");
        };
    } else {
        Serial.println("Si1151 is ready!");
    }

    // Check if E5 module exists and configure LoRaWAN parameters
    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");
        delay(200);
        u8x8.setCursor(5, 0);
        u8x8.print("LoRaWAN");
        is_join = true;
    }
    else
    {
        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.print("IR:");

    u8x8.setCursor(2, 3);
    u8x8.print("Visible:");

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

// Arduino loop function
void loop(void)
{
    float irValue = si1151.ReadIR();       // Read IR value from sensor
    float visibleValue = si1151.ReadVisible(); // Read visible light value from sensor

    Serial.println("IR: " + String(irValue) + " Visible: " + String(visibleValue)); // Print sensor values to serial monitor

    u8x8.setCursor(0, 2);
    u8x8.print("      ");
    u8x8.setCursor(2, 2);
    u8x8.print("IR:");
    u8x8.print(irValue);
    u8x8.setCursor(2, 3);
    u8x8.print("Visible:");
    u8x8.print(visibleValue);

    // If E5 module exists, perform LoRaWAN operations
    if (is_exist)
    {
        int ret = 0;
        if (is_join)
        {
            // Attempt to join LoRaWAN network
            ret = at_send_check_response("+JOIN: Network joined", 12000, "AT+JOIN\r\n");
            if (ret)
            {
                is_join = false;
            }
            else
            {
                at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
                Serial.print("JOIN failed!\r\n\r\n");
                delay(5000);
            }
        }
        else
        {
            // Send sensor data over LoRaWAN
            char cmd[128];
            sprintf(cmd, "AT+CMSGHEX=\"%04X%04X\"\r\n", (int)irValue, (int)visibleValue);
            ret = at_send_check_response("Done", 5000, cmd);
            if (ret)
            {
                recv_prase(recv_buf); // Parse received response
            }
            else
            {
                Serial.print("Send failed!\r\n\r\n");
            }
            delay(5000);
        }
    }
    else
    {
        delay(1000);
    }
}

removed by Knucklehead, who didn’t read it correctly… :disguised_face:

Hi, Is there not a USER LED under the boot button:

Also I am worried about why the WIO-E5 can not be detected

Sketch uses 314593 bytes (9%) of program storage space. Maximum is 3342336 bytes.
Global variables use 19568 bytes (5%) of dynamic memory, leaving 308112 bytes for local variables. Maximum is 327680 bytes.
esptool.py v4.5.1
Serial port /dev/cu.usbmodem1101
Connecting...
Chip is ESP32-S3 (revision v0.2)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 74:4d:bd:81:b4:40
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x0005cfff...
Compressed 15104 bytes to 10399...
Writing at 0x00000000... (100 %)
Wrote 15104 bytes (10399 compressed) at 0x00000000 in 0.3 seconds (effective 459.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 384.2 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 601.3 kbit/s)...
Hash of data verified.
Compressed 314960 bytes to 179936...
Writing at 0x00010000... (9 %)
Writing at 0x0001b5e9... (18 %)
Writing at 0x00024773... (27 %)
Writing at 0x0002a0b0... (36 %)
Writing at 0x0002f78a... (45 %)
Writing at 0x00034b1a... (54 %)
Writing at 0x0003a31e... (63 %)
Writing at 0x00042fd8... (72 %)
Writing at 0x0004b573... (81 %)
Writing at 0x00051a0a... (90 %)
Writing at 0x000570cb... (100 %)
Wrote 314960 bytes (179936 compressed) at 0x00010000 in 2.6 seconds (effective 961.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Hi there,
My bad, I thought you were using an ESP32C3
as you were. LOL
sorry,
GL :slight_smile: PJ
Which BSP are you using, Try the 2.0.8 , see it it changes?
:v:

No worries. I tried using 2.0.8 and it didn’t change anything

Ok, So what about the Wire.begin before your begin for serial ports?

u8x8.begin();                               // Initialize OLED display
    u8x8.setFlipMode(1);
    u8x8.setFont(u8x8_font_chroma48medium8_r);
**Wire.begin();**
    Serial.begin(115200);                       // Initialize serial communication
    pinMode(LED_BUILTIN, OUTPUT);               // Set LED pin as output
    digitalWrite(LED_BUILTIN, HIGH);            // Turn off LED

I have tried that just now and no difference. I think it may be the commands I am sending to the module and I am starting to read up on them but I am quite new to all of this and it seems like quite the learning curve

Hi there,
Yea, there is that too, The command syntax and timing can be finicky, You’ll get it.
Look at some of the examples on Wiki and on Here, (GPS-DEMO) is similar, i.e. 2 serial ports.
HTH
GL :slight_smile: PJ

I see this in the examples Git,

/*Init the LoRa class after initing the serial print port */
  lora.init();/* call lora.init(Arduino_Tx_PIN,Arduino_Rx_PIN) to use software serial. Example: lora.init(D2,D3) */ /*First get device EUI for later printing*/
  lora.getId(char_temp,DevEui); /*100 ms is more than enough to get a response from the module*/
  /*set up device. You must set up all your parameters BEFORE Joining.

I see they comment on Naming the TX & RX of the INIT?
info from here…

Great thanks, I shall have a look into this.