Conectando a TTN
En este capítulo, repasaremos el uso básico de la plataforma TTN y cómo retransmitir datos de sensores a través de la plataforma TTN.
Actualizable a Sensores Industriales
Con el controlador S2110 de SenseCAP y el registrador de datos S2100, puedes convertir fácilmente el Grove en un sensor LoRaWAN®. Seeed no solo te ayuda con la creación de prototipos, sino que también te ofrece la posibilidad de expandir tu proyecto con la serie SenseCAP de robustos sensores industriales.
La carcasa IP66, configuración Bluetooth, compatibilidad con la red global LoRaWAN®, batería integrada de 19 Ah y el potente soporte de la APP hacen del SenseCAP S210x la mejor opción para aplicaciones industriales. La serie incluye sensores para humedad del suelo, temperatura y humedad del aire, intensidad de luz, CO2, EC, y una estación meteorológica 8 en 1. Prueba el último SenseCAP S210x para tu próximo proyecto industrial exitoso.

Si no tienes experiencia con TTN, te recomendamos que primero leas sobre la consola de TTN.
Introducción a TTN En este capítulo, presentaremos los controles de la consola de TTN que utilizamos para obtener una primera impresión de la consola de TTN. Comencemos > |
Antes de comenzar esta sección, asegúrate de tener cobertura LoRaWAN® de TTN alrededor de tu entorno de despliegue, de lo contrario no podrás añadir dispositivos a TTN a través de LoRa®. Para más detalles, por favor lee TTN LoRaWAN®.
Añadiendo dispositivos Grove - Wio-E5 a la consola de TTN
Para retransmitir datos de sensores fuera de TTN, el primer paso que necesitamos es añadir Grove - Wio-E5 a la Aplicación de TTN para construir la conexión entre el dispositivo local y la plataforma TTN.
Paso 1. Obtener el DevEUI, AppEUI para Grove - Wio-E5.
Por favor descarga el entorno necesario para Arduino y Wio Terminal en contenido pre-aprobado.

Haz clic aquí para descargar el código para el DevEUI, AppEUI que viene con Grove - Wio-E5 y súbelo a Wio Terminal.
#include <Arduino.h>
#include "disk91_LoRaE5.h"
Disk91_LoRaE5 lorae5(&Serial); // Where the AT command and debut traces are printed
void setup() {
Serial.begin(9600);
uint32_t start = millis();
while ( !Serial && (millis() - start) < 3000 ); // Open the Serial Monitor to get started or wait for 3.0"
// init the library, search the Wio-E5 over the different WIO port available
if ( ! lorae5.begin(DSKLORAE5_SEARCH_WIO) ) {
Serial.println("Wio-E5 Init Failed");
while(1);
}
}
void loop() {
//Grove - Wio-E5 allows querying DevEUI, AppEUI, but not AppKey.
lorae5.sendATCommand("AT+ID=DevEui","","+ID: ERROR","",1000,false,NULL);
lorae5.sendATCommand("AT+ID=AppEUI","","+ID: ERROR","",1000,false,NULL);
delay(30000);
}
Abre el monitor del puerto serie del IDE de Arduino, establece la velocidad de baudios a 9600 y observa la configuración.

Por favor, anota los 16 dígitos después de DevEUI y AppEUI, que se utilizarán en la sesión de agregar dispositivo de TTN.
Paso 2. Agregar una aplicación
Haz clic en el botón Add application en la parte superior derecha.

Completa los campos con asterisco y solicita el contenido según tu preferencia.

Luego haz clic en Create Application.
Paso 3. Agregar dispositivos
Ve a End devices en el menú izquierdo y haz clic en + Add end device para llegar a la página de registro de dispositivos finales.

Para usar el Grove - Wio-E5 en el repositorio de dispositivos, asegúrate de que la pestaña From the LoRaWAN® Device Repository esté seleccionada.
Luego, por favor haz clic en las siguientes opciones para seleccionar.
- Brand -- SenseCAP
- Model -- LoRa-E5 STM32WLE5JC Module
- Hardware Ver. -- 1.0
- Firmware Ver. -- 1.0
- Profile (Region) -- Elige un plan de frecuencia apropiado para tu región.

Elige un plan de frecuencia apropiado para tu región. Tu dispositivo y gateway deben usar el mismo plan de frecuencia para comunicarse. Diferentes regiones del mundo usan diferentes planes de frecuencia, por ejemplo, 863-870 MHz para Europa, 902-928 MHz para América del Norte, etc.
Aquí, elegiré la banda del gateway de TTN que uso, EU868.
Luego, por favor completa el DevEUI y AppEUI que acabas de obtener en los campos correspondientes de TTN.

En cuanto al AppKey, haz clic en el botón Generate y luego súbelo a Wio Terminal usando el siguiente código para habilitar Grove - Wio-E5.
Ten en cuenta que el AppKey de 32 bits generado por TTN es reemplazado por el contenido en el código.
lorae5.sendATCommand("AT+KEY=APPKEY,\"2B7E151628XXXXXXXXXX158809CF4F3C\"","","+KEY: ERROR","",1000,false,NULL);
Aquí está el código completo.
#include <Arduino.h>
#include "disk91_LoRaE5.h"
Disk91_LoRaE5 lorae5(&Serial); // Where the AT command and debut traces are printed
void setup() {
Serial.begin(9600);
uint32_t start = millis();
while ( !Serial && (millis() - start) < 3000 ); // Open the Serial Monitor to get started or wait for 3.0"
// init the library, search the Wio-E5 over the different WIO port available
if ( ! lorae5.begin(DSKLORAE5_SEARCH_WIO) ) {
Serial.println("Wio-E5 Init Failed");
while(1);
}
}
void loop() {
//Grove - Wio-E5 allows querying DevEUI, AppEUI, but not AppKey.
lorae5.sendATCommand("AT+KEY=APPKEY,\"2B7E151628XXXXXXXXXX158809CF4F3C\"","","+KEY: ERROR","",1000,false,NULL);
delay(30000);
}

En este punto, los tres códigos para Grove - Wio-E5 y TTN han sido configurados. Solo haz clic en Register end device.

Escribir función de decodificadores para diferentes sensores
En las secciones anteriores, te instruimos sobre cómo usar el Wio Terminal para leer los valores de los sensores individuales en el kit. Para enviar los valores de los sensores a TTN a través de Grove - Wio-E5, es necesario usar comandos AT para hacerlo. Los datos enviados son recibidos por TTN y necesitan ser decodificados antes de convertirse en datos reales que podamos leer. Esta es la razón por la que escribimos el decodificador.
Además, dado que el formato de datos enviado no es uniforme, con sensores que tienen datos enteros, flotantes, positivos y negativos, etc., el código del decodificador requerido para cada sensor es diferente.
Tipo de Sensor | Dirección de Descarga |
---|---|
Sensor de luz integrado del Wio Terminal | Descargar |
Sensor IMU integrado del Wio Terminal | Descargar |
Sensor de Humedad del Suelo | Descargar |
Sensor de Gas VOC y eCO2 (SGP30) | Descargar |
Sensor de Temp&Humedad (SHT40) | Descargar |
Módulo Vision AI | Descargar |
Opción 1. Decodificador de datos del sensor de luz Wio Terminal
En la sección anterior Sensor de luz Wio Terminal, utilizamos una variable entera light
para almacenar el valor de luz leído por el sensor de luz y enviamos ese valor usando la función send_sync(). Por lo tanto, el objetivo del decodificador que escribimos en TTN es poder analizar estos datos enteros.
El código de configuración de su decodificador es el siguiente. Por favor, pegue el siguiente código en la sección de código de TTN. Haga clic en Save Function para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
if (port == 8) {
decoded.light = bytes[0]<<8 | bytes[1];
}
return decoded;
}
Haz clic en Formateadores de carga útil --> Enlace ascendente --> Formateador Javascript personalizado del dispositivo en orden.
Luego simplemente pega el código del decodificador anterior en el Código del formateador.

Podemos introducir los datos del sensor de luz de 8 bits en la ventana Test del lado derecho para verificar si el decodificador analiza correctamente.

Opción 2. Decodificador de datos del sensor Wio Terminal IMU
En la sección anterior Sensor Wio Terminal IMU, utilizamos números flotantes x_values
, y_values
, z_values
para almacenar los datos de los tres ejes devueltos por IMU, y multiplicamos estos tres conjuntos de datos por 100 para convertirlos a enteros y luego enviarlos juntos.
En particular, es importante tener en cuenta que estos datos pueden ser tanto positivos como negativos, por lo que también necesitamos analizar esto y restaurarlo a un número flotante.
El código de configuración de su decodificador es el siguiente. Por favor pega el siguiente código en la sección de código de TTN. Haz clic en Guardar cambios para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
if (value >= 32768) {
value = 32768 - value;
}
value = value/100.0;
return value;
}
if (port == 8) {
decoded.x = transformers(bytes.slice(0,2));
decoded.y = transformers(bytes.slice(2,4));
decoded.z = transformers(bytes.slice(4,6));
}
return decoded;
}
Podemos ingresar los datos del sensor IMU de 48 bits en Test en el lado derecho para verificar si el decodificador analiza correctamente.

Opción 3. Decodificador de datos del Sensor de Humedad del Suelo Grove
En la sección anterior Sensor de Humedad del Suelo Grove, utilizamos una variable entera sensorValue
para almacenar el valor de humedad del suelo leído por el sensor de humedad del suelo y enviamos ese valor usando la función send_sync(). Por lo tanto, el objetivo del decodificador que escribimos en TTN es poder analizar estos datos enteros.
El código de configuración de su decodificador es el siguiente. Por favor, pegue el siguiente código en la sección de código de TTN. Haga clic en Save changes para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
if (port == 8) {
decoded.soil = bytes[0]<<8 | bytes[1];
}
return decoded;
}
Podemos ingresar los datos del sensor de humedad del suelo de 8 bits en Test en el lado derecho para verificar si el decodificador analiza correctamente.

Opción 4. Decodificador de datos del Sensor de Gas VOC y eCO2 Grove (SGP30)
En la sección anterior Sensor de Gas VOC y eCO2 Grove (SGP30), utilizamos las variables enteras tvoc_ppb
y co2_eq_ppm
para almacenar los valores de VOC y eCO2.
El código de configuración de su decodificador es el siguiente. Por favor, pegue el siguiente código en la sección de código de TTN. Haga clic en Save changes para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
return value;
}
if (port == 8) {
decoded.voc = transformers(bytes.slice(0,2));
decoded.eco2 = transformers(bytes.slice(2,4));
}
return decoded;
}
Podemos ingresar los datos de 16 bits del SGP30 en Test en el lado derecho para verificar si el decodificador analiza correctamente.

Opción 5. Decodificador de datos del Sensor de Temp&Humedad Grove (SHT40)
En la sección anterior Sensor de Temp&Humedad Grove (SHT40), utilizamos las variables float temperature
y humidity
para almacenar los valores de temperatura y humedad. Y enviamos los dos valores después de haberlos ampliado cien veces convirtiéndolos en enteros.
El código de configuración de su decodificador es el siguiente. Por favor, pegue el siguiente código en la sección de código de TTN. Haga clic en Save changes para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
if (value >= 32768) {
value = 32768 - value;
}
value = value/100.0;
return value;
}
if (port == 8) {
decoded.temp = transformers(bytes.slice(0, 2));
decoded.humi = transformers(bytes.slice(2, 4));
}
return decoded;
}
Podemos ingresar los datos del SHT40 de 32 bits en Test en el lado derecho para verificar si el decodificador analiza correctamente.

Opción 6. Decodificador de datos del Módulo Vision AI Grove
En la sección anterior Módulo Vision AI Grove, utilizamos las variables int model
y confi
para almacenar el tipo de modelo identificado y su nivel de confianza.
El código de configuración de su decodificador es el siguiente. Por favor, pegue el siguiente código en la sección de código de TTN. Haga clic en Save changes para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
return value;
}
if (port == 8) {
decoded.model = transformers(bytes.slice(0,2));
decoded.confidence = transformers(bytes.slice(2,4));
}
return decoded;
}
Podemos ingresar los datos del Vision AI de 16 bits en Test en el lado derecho para verificar si el decodificador analiza correctamente.

Subir código para enviar datos a TTN
En las diferentes páginas de sensores proporcionamos códigos detallados para subir datos. También puedes encontrar el código del sensor que deseas usar en la lista a continuación.
Antes de usar el código proporcionado en esta sección, ten en cuenta que el Device EUI, App EUI y App Key en el código sean consistentes con la información del dispositivo agregada por TTN. Y verifica si la banda de frecuencia configurada para Grove - Wio-E5 es la misma que la banda del gateway en tu área o TTN. No hacerlo puede resultar en falla de acceso a la red.
El código para configurar la banda LoRaWAN® es el siguiente, y la configuración predeterminada es la banda EU868. (La banda EU868 se usa comúnmente en la región europea.)
#define Frequency DSKLORAE5_ZONE_EU868
Banda US915 (La banda US915 se usa comúnmente en América del Norte.)
#define Frequency DSKLORAE5_ZONE_US915
Banda AU915 (La banda AU915 se usa comúnmente en la región de Australia.)
#define Frequency DSKLORAE5_ZONE_AU915
Tipo de Sensor | Dirección de Descarga |
---|---|
Sensor de luz integrado de Wio Terminal | Descargar |
Sensor IMU integrado de Wio Terminal | Descargar |
Sensor de Humedad del Suelo | Descargar |
Sensor de Gas VOC y eCO2 (SGP30) | Descargar |
Sensor de Temp&Humedad (SHT40) | Descargar |
Módulo Vision AI | Descargar |
El código anterior para enviar datos del sensor puede cargarse directamente al Wio Terminal desde el IDE de Arduino y ejecutarse. En ese momento, por favor enciende el monitor serie y ajusta la velocidad de baudios a 9600 para observar la transmisión de datos en tiempo real.
Para más detalles, por favor regresa a la sección sobre el uso de sensores individuales en el catálogo de referencia.
Datos en tiempo real
En la pestaña Application, podemos hacer clic en Live data para ver la información sobre los datos recibidos por TTN.
Podemos ver directamente la información de datos después de la decodificación por el decodificador.

Análisis del Código Fuente
Si quieres aplicar el contenido de este tutorial al desarrollo de tu propio proyecto, aprender a entender el significado del código es esencial. Aquí usaremos el código del sensor SHT40 como ejemplo para explicar la lógica de implementación del código.
Al comienzo del programa, necesitamos preparar la información de la tríada necesaria para conectar a TTN y configurar la frecuencia del Wio-E5.
#define Frequency DSKLORAE5_ZONE_EU868
/*
Select your frequency band here.
DSKLORAE5_ZONE_EU868
DSKLORAE5_ZONE_US915
DSKLORAE5_ZONE_AS923_1
DSKLORAE5_ZONE_AS923_2
DSKLORAE5_ZONE_AS923_3
DSKLORAE5_ZONE_AS923_4
DSKLORAE5_ZONE_KR920
DSKLORAE5_ZONE_IN865
DSKLORAE5_ZONE_AU915
*/
char deveui[] = "2CF7FXXXXXX0A49F";
char appeui[] = "80000XXXXXX00009";
char appkey[] = "2B7E151628XXXXXXXXXX158809CF4F3C";
A continuación, se define una función data_decord()
. Esta función convierte los valores del sensor en marcos de datos que pueden ser analizados por el decodificador de TTN y también cumple con el protocolo LoRaWAN®, y los almacena en el array data[]
.
En general, para prevenir el desbordamiento de datos, necesitamos considerar los valores máximos y mínimos que el sensor puede leer. Y dividir en números hexadecimales que no se desbordarán.
void data_decord(int val_1, int val_2, uint8_t data[4])
{
int val[] = {val_1, val_2};
for(int i = 0, j = 0; i < 2; i++, j += 2)
{
if(val[i] < 0)
{
val[i] = ~val[i] + 1;
data[j] = val[i] >> 8 | 0x80;
data[j+1] = val[i] & 0xFF;
}
else
{
data[j] = val[i] >> 8 & 0xFF;
data[j+1] = val[i] & 0xFF;
}
}
}
Para el sensor SHT40, tendrá dos datos, uno es el dato de temperatura y otro es el dato de humedad, y hay valores positivos y negativos, por lo que los números negativos necesitan ser procesados, y también los lugares decimales necesitan ser procesados.
int_temp = temperature*100;
int_humi = humidity*100;
El siguiente paso es la inicialización del SHT40 y la configuración inicial del Wio-E5. Todo esto se ejecutará en la función setup()
.
lorae5.begin(DSKLORAE5_SWSERIAL_WIO_P2)
En el código de inicialización, DSKLORAE5_SWSERIAL_WIO_P2
representa la interfaz Grove en el lado derecho del Wio Terminal, mientras que DSKLORAE5_SWSERIAL_WIO_P1
representa la interfaz Grove en el lado izquierdo. Para otros proyectos sin sensores externos, también puedes usar DSKLORAE5_SEARCH_WIO
, que buscará automáticamente la interfaz Grove a la que está conectado tu Wio-E5.
lorae5.send_sync( //Sending the sensor values out
8, // LoRaWan Port
data, // data array
sizeof(data), // size of the data
false, // we are not expecting a ack
7, // Spread Factor
14 // Tx Power in dBm
)
El papel importante de la función send_sync()
es enviar los valores del sensor a través de LoRaWAN®. El primer parámetro indica el número de canal para enviar los datos, el segundo parámetro indica el contenido de los datos enviados, y el tercer parámetro indica la longitud de los datos enviados. En general, solo necesitamos enfocarnos en el contenido de los primeros tres parámetros.
delay(15000);
El retraso al final del programa determina con qué frecuencia deseas enviar datos. No recomendamos enviar a una velocidad menor a 10 segundos, ya que enviar a una frecuencia tan alta puede causar que el Wio-E5 funcione de manera anormal, y puede ser reconocido por TTN como un dispositivo anormal y bloqueado debido a la alta frecuencia.
Para aprender más sobre el código y las características de Grove - Wio-E5, consulta el enlace de GitHub del repositorio. Un agradecimiento especial a Paul Pinault (disk91) por escribir la biblioteca para Grove - Wio-E5.
¡Mantente atento a más contenido!
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.
Declaración
- La marca LoRa® es una marca comercial de Semtech Corporation o sus subsidiarias.
- LoRaWAN® es una marca utilizada bajo licencia de LoRa Alliance®.