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.
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 XIAO | Grove - Wio-E5 | Seeeduino XIAO Expansion Board | Grove - Temperature & Humidity Sensor (DHT11) |
---|---|---|---|
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
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
-
Paso 1. Instala la librería u8g2
-
Paso 2. Instala la librería del sensor DHT
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
- Paso 3. Selecciona un clúster para comenzar a agregar dispositivos y gateways
- Paso 4. Haz clic en Go to applications
- Paso 5. Haz clic en + Add application
- Paso 6. Completa el Application ID y haz clic en Create application
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
- Paso 7: Navega a
Payload formatters > Uplink
, selecciona Formatter Type como Javascript y completa el Formatter parameter como se muestra a continuación
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
- Paso 10. Haz clic en Manually, para ingresar las credenciales de registro manualmente
- 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.
- 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.
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!
- 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
¡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.
- 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.