Skip to main content

Grove - Wio-E5 TTN Demo

Comenzando

The Things Network proporciona una red LoRaWAN global y abierta con un conjunto de herramientas abiertas para construir tu próxima aplicación IoT a bajo costo, con máxima seguridad y listo para escalar. A través de un cifrado robusto de extremo a extremo, se construye una red de Internet de las Cosas segura y colaborativa que se extiende por muchos países alrededor del mundo. Ahora opera miles de gateways proporcionando cobertura a millones de personas.

Preparativos

Aquí hay una demostración que te muestra cómo conectar TTN (The Things Network) y el módulo Seeeduino XIAO a través del módulo Grove - Wio-E5. Estos módulos son capaces de recopilar parámetros de temperatura y humedad del ambiente y enviarlos de vuelta a TTN. Las luces LED parpadeantes en el Seeeduino Xiao indican el estado del sensor de temperatura y humedad al conectarse a la nube TTN.

caution

Por favor asegúrate de la consistencia de la banda de frecuencia entre los nodos finales, gateway y la configuración de TTN que estás usando siguiendo esta instrucción. El plan de frecuencia que aplica esta demostración es para EU868.

Hardware Requerido

Seeeduino XIAOGrove - Wio-E5Seeeduino XIAO Expansion BoardGrove - Temperature & Humidity Sensor (DHT11)

pir

pir

pir

pir

note

Si esta es tu primera vez usando Seeeduino XIAO, por favor consulta la wiki de Seeeduino XIAO. Si esta es tu primera vez usando Arduino, el sitio web de Arduino es un gran recurso para que comiences tu viaje con Arduino.

Conexión de Hardware

  • Paso 1. Conecta el módulo Wio-E5 directamente al slot "UART".

  • Paso 2. Coloca el DH11 en el socket "A0/D0".

  • Paso 3. Descarga el código, por favor consulta la parte de software.

Preparación de Software

note

Si esta es la primera vez que trabajas con Arduino, te recomendamos encarecidamente que veas Comenzando con Arduino antes de empezar. Haz clic para aprender en detalle sobre cómo instalar una librería de Arduino

Descargar Librería

Código de Software

Descarga el ejemplo; copia el código y pégalo en el IDE de Arduino y luego súbelo.

# 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)

DHT dht(DHTPIN, DHTTYPE);

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);
va_end(args);
delay(200);
startMillis = millis();

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

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

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)
{
return;
}
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)))
{
Serial.println(data);
u8x8.setCursor(2, 4);
u8x8.print("led :");
led = !!data;
u8x8.print(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)))
{
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)))
{
u8x8.setCursor(0, 7);
u8x8.print(" ");
u8x8.setCursor(2, 7);
u8x8.print("snr :");
u8x8.print(snr);
}
}

void setup(void)
{
u8x8.begin();
u8x8.setFlipMode(1);
u8x8.setFont(u8x8_font_chroma48medium8_r);

Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);

Serial1.begin(9600);
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");
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 !");
}

dht.begin();

u8x8.setCursor(0, 2);
u8x8.setCursor(2, 2);
u8x8.print("temp:");

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

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

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

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

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

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

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;
}
else
{
at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
Serial.print("JOIN failed!\r\n\r\n");
delay(5000);
}
}
else
{
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)
{
recv_prase(recv_buf);
}
else
{
Serial.print("Send failed!\r\n\r\n");
}
delay(5000);
}
}
else
{
delay(1000);
}
}

Configuración de la Consola TTN

  • Paso 1. Visita el sitio web de The Things Network y regístrate para crear una nueva cuenta

  • Paso 2. Después de iniciar sesión, haz clic en tu perfil y selecciona Console

pir

  • Paso 3. Selecciona un clúster para comenzar a agregar dispositivos y gateways

pir

  • Paso 4. Haz clic en Go to applications

pir

  • Paso 5. Haz clic en + Add application

pir

  • Paso 6. Completa el Application ID y haz clic en Create application

pir

Nota: Aquí Application name y Description no son campos obligatorios. Si Application name se deja en blanco, utilizará el mismo nombre que Application ID por defecto

La siguiente es la aplicación recién creada

pir

  • Paso 7: Navega a Payload formatters > Uplink, selecciona Formatter Type como Javascript y completa el Formatter parameter como se muestra a continuación

pir

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;
}
  • Paso 8: Sube el código de Arduino al Seeeduino XIAO como se explicó anteriormente, y abre el monitor serie para ver la siguiente salida
Humidity: 50%       Temperature: 25.00 *C
AT+JOIN
+JOIN: Start
+JOIN: NORMAL
+JOIN: Join failed
+JOIN: Done
AT+ID
+ID: DevAddr, 24:40:00:7C
+ID: DevEui, 2C:F7:F1:20:24:90:03:63
+ID: AppEui, 80:00:00:00:00:00:00:07
+JOIN: Join failed

Anota el DevEui y AppEUi generados anteriormente

  • Paso 9: Regresa a la página Overview de la aplicación creada y haz clic en + Add end device

pir

pir

  • Paso 10. Haz clic en Manually, para ingresar las credenciales de registro manualmente

pir

  • Paso 11. Selecciona el Frequency plan según tu región. También asegúrate de usar la misma frecuencia que el gateway al cual conectarás este dispositivo. Selecciona MAC V1.0.2 como la LoRaWAN® version y PHY V1.0.2 REV B como la Regional Parameters version. Estas configuraciones corresponden al stack LoraWAN® del Wio-E5.

pir

  • Paso 12. Copia y pega la información obtenida previamente del paso 8 en los campos DevEUI y AppEUI. El campo End device ID se llenará automáticamente cuando completemos DevEUI. Para el campo AppKey, usa: 2B7E151628AED2A6ABF7158809CF4F3C.

pir

Finalmente haz clic en Register end device

  • Paso 13. Registra tu Gateway LoRaWAN® con la Consola TTN. Por favor consulta las instrucciones mostradas aquí

Si ves la siguiente salida en el monitor serie después de que todo esté configurado, ¡eso significa que el Seeeduino XIAO se conectó exitosamente con TTN y está enviando los datos del sensor de temperatura y humedad!

pir

  • Paso 14. Regresa a la página de la aplicación y navega a End devices, selecciona el dispositivo creado y haz clic en Live data

pir

¡Aquí verás los datos del sensor de temperatura y humedad mostrados en tiempo real!

  • Paso 15. Navega a Messaging > Downlink, escribe 01 bajo Payload y haz clic en Schedule downlink para encender el LED amarillo integrado en el Seeeduino XIAO.

pir

  • Paso 16. Envía el Payload como 00 para apagar el LED amarillo integrado

Recursos

Hoja de datos:

Certificaciones:

SDK relevante:

Soporte Técnico y Discusión de Productos

Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte para asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para satisfacer diferentes preferencias y necesidades.

Loading Comments...