Conectándose a Helium
En este capítulo, repasaremos el uso básico de la plataforma Helium y cómo retransmitir datos de sensores a través de la plataforma Helium.
Actualizable a sensores industriales
Con el controlador SenseCAP S2110 y el registrador de datos S2100, puedes convertir fácilmente el Grove en un sensor LoRaWAN®. Seeed no solo te ayuda con el prototipado, sino que también te ofrece la posibilidad de expandir tu proyecto con la serie SenseCAP de robustos sensores industriales.
La carcasa IP66, la configuración vía Bluetooth, la compatibilidad con la red global LoRaWAN®, la batería integrada de 19 Ah y el potente soporte desde 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 lumínica, CO2, CE y una estación meteorológica 8 en 1. Prueba el último SenseCAP S210x para tu próximo proyecto industrial exitoso.

Helium Introduction En este capítulo, te presentamos los controles de la consola Helium para que tengas una primera impresión de su funcionamiento. . Let's get started > |
Antes de comenzar esta sección, asegúrate de tener cobertura Helium LoRaWAN® en tu entorno de despliegue, de lo contrario no podrás agregar dispositivos a Helium vía LoRa®. Para más detalles, por favor lee Helium LoRaWAN®.
Agregar dispositivos Grove - Wio-E5 a la consola Helium
Para retransmitir datos de sensores desde Helium, el primer paso es agregar Grove - Wio-E5 a la consola Helium para establecer la conexión entre el dispositivo local y la plataforma Helium.
Para agregar Grove - Wio-E5, ve a Devices y haz clic en el icono + Añadir dispositivo en la parte superior derecha de la ventana.

Como se describió anteriormente para el dispositivo de la consola Helium, en este punto se genera automáticamente un triplete de datos: DevEUI, AppEUI y AppKey.
Comenzaremos llenando el nombre del dispositivo, aquí lo llamaré lora wio terminal.

Por favor descarga el entorno necesario para Arduino y Wio Terminal en contenido pre-aprobado.

Grove - Wio-E5 permite a los usuarios establecer su propio DevEUI, AppEUI y AppKey, por lo que podemos llenar la información del triplete generado por Helium arriba en las columnas correspondientes.
Abre el IDE de Arduino y copia el siguiente código en el IDE de Arduino.
#include <Arduino.h>
#include "disk91_LoRaE5.h"
Disk91_LoRaE5 lorae5(&Serial); // Where the AT command and debut traces are printed
#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";
void setup() {
Serial.begin(9600);
uint32_t start = millis();
while ( !Serial && (millis() - start) < 1500 ); // Open the Serial Monitor to get started or wait for 1.5"
// init the library, search the LORAE5 over the different WIO port available
if ( ! lorae5.begin(DSKLORAE5_SEARCH_WIO) ) {
Serial.println("LoRa E5 Init Failed");
while(1);
}
// Setup the LoRaWan Credentials
if ( ! lorae5.setup(
Frequency, // LoRaWan Radio Zone EU868 here
deveui,
appeui,
appkey
) ){
Serial.println("LoRa E5 Setup Failed");
while(1);
}
}
void loop() {
}
El código anterior no tiene restricciones sobre la conexión del Grove - Wio-E5, buscará automáticamente el puerto Grove al que está conectado el Grove - Wio-E5, pero el proceso de búsqueda puede tardar un rato (alrededor de un minuto).
Por favor, selecciona la banda LoRaWAN® que deseas usar. Esta banda debe coincidir con la banda del gateway que estás utilizando. Las bandas de frecuencia disponibles están en los comentarios del código a continuación. En los tutoriales que usamos, el valor por defecto es la banda EU868.
#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
*/
La banda EU868 se usa comúnmente en la región Europea.
La banda US915 se usa comúnmente en Norteamérica.
La banda AU915 se usa comúnmente en la región de Australia.
Por favor reemplaza el DevEUI, AppEUI y AppKey generados por Helium con el código siguiente.
char deveui[] = "2CF7FXXXXXX0A49F";
char appeui[] = "80000XXXXXX00009";
char appkey[] = "2B7E151628XXXXXXXXXX158809CF4F3C";

Carga el código para el Wio Terminal y abre el monitor de puerto serial del Arduino IDE, configura la velocidad en baudios a 9600 y observa la configuración.

Después de asegurarte que la información anterior está completa, haz clic en Guardar dispositivo abajo para terminar de agregar el dispositivo.

Por favor espera pacientemente mientras se agrega el dispositivo. (Esto tomará alrededor de 20 minutos.)

Escribir función decodificadora para diferentes sensores
En las secciones anteriores, te indicamos cómo usar el Wio Terminal para leer los valores de los sensores individuales del kit. Para enviar los valores del sensor a Helium a través de Grove - Wio-E5, es necesario usar comandos AT. Los datos enviados son recibidos por Helium y necesitan ser decodificados antes de convertirse en datos reales que podamos leer. Por eso escribimos el decodificador.
Además, dado que el formato de datos enviado no es uniforme, con sensores que tienen datos enteros, flotantes, positivos, negativos, etc., el código decodificador requerido para cada sensor es diferente.
Tipo de Sensor | Dirección de Descarga |
---|---|
Sensor de luz integrado en Wio Terminal | Descarga |
Sensor IMU integrado en Wio Terminal | Descarga |
Sensor de humedad del suelo | Descarga |
Sensor de gases VOC y eCO2 (SGP30) | Descarga |
Sensor de temperatura y humedad (SHT40) | Descarga |
Módulo Vision AI | Descarga |
Opción 1. Decodificador de datos del sensor de luz del Wio Terminal
Creamos un nuevo Script Personalizado y lo nombramos Light_data.

En la sección anterior Sensor de luz Wio Terminal, usamos 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 Helium es poder interpretar estos datos enteros.
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 Helium. Haz clic en Guardar función para guardar este decodificador.
function Decoder(bytes, port) {
var decoded = {};
if (port == 8) {
decoded.light = bytes[0]<<8 | bytes[1];
}
return decoded;
}

Podemos ingresar los datos del sensor de luz de 8 bits en el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Opción 2. Decodificador de datos del sensor IMU del Wio Terminal
Creamos un nuevo Script Personalizado y lo nombramos IMU_data.

En la sección anterior Sensor IMU Wio Terminal, usamos números de punto flotante x_values
, y_values
, z_values
para almacenar los datos de los tres ejes que devuelve el IMU, y multiplicamos estos tres valores por 100 para convertirlos en enteros y enviarlos juntos.
En particular, es importante notar que estos datos pueden ser tanto positivos como negativos, por lo que también necesitamos interpretar esto y restaurarlos a números de punto 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 Helium. Haz clic en Guardar función 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 el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Opción 3. Decodificador de datos del sensor de humedad del suelo Grove
Creamos un nuevo Script Personalizado y lo nombramos Soil_data.

En la sección anterior Sensor de humedad del suelo Grove, usamos una variable entera sensorValue
para almacenar el valor de humedad del suelo leído por el sensor y enviamos ese valor usando la función send_sync(). Por lo tanto, el objetivo del decodificador que escribimos en Helium es poder interpretar estos datos enteros.
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 Helium. Haz clic en Guardar función 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 el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Opción 4. Decodificador de datos del sensor de gases VOC y eCO2 Grove (SGP30)
Creamos un nuevo Script Personalizado y lo nombramos SGP30_data.

En la sección anterior Sensor de gases VOC y eCO2 Grove (SGP30), usamos 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, pega el siguiente código en la sección de código de Helium. Haz clic en Guardar función 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 del sensor SGP30 de 16 bits en el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Opción 5. Decodificador de datos del sensor Temp&Humi Grove (SHT40)
Creamos un nuevo Script Personalizado y lo nombramos SHT40_data.

En la sección anterior Sensor Temp&Humi Grove (SHT40), usamos variables de punto flotante temperature
y humidity
para almacenar los valores de temperatura y humedad. Y enviamos los dos valores después de haberlos multiplicado por cien para convertirlos a enteros.
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 Helium. Haz clic en Guardar función 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 de 32 bits del sensor SHT40 en el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Opción 6. Decodificador de datos del módulo Grove Vision AI
Creamos un nuevo Script Personalizado y lo nombramos AI_Version_data.

En la sección anterior Módulo Grove Vision AI, usamos variables enteras 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, pega el siguiente código en la sección de código de Helium. Haz clic en Guardar función 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 de 16 bits del Vision AI en el VALIDADOR DE SCRIPT (SCRIPT VALIDATOR) al lado derecho para verificar si el decodificador interpreta correctamente.

Regresa a Flujos (Flows) y conecta el dispositivo al decodificador.

Subir código para enviar datos a Helium
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 que aparece 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 deben coincidir con la información del dispositivo agregada en Helium. Además, verifica que la banda de frecuencia configurada para Grove - Wio-E5 sea la misma que la banda del gateway en tu área o en Helium. No hacerlo puede ocasionar fallas en el 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 es comúnmente usada en la región Europea.)
#define Frequency DSKLORAE5_ZONE_EU868
US915 band (The US915 band is commonly used in North America.)
#define Frequency DSKLORAE5_ZONE_US915
AU915 band (The AU915 band is commonly used in Australia Region.)
#define Frequency DSKLORAE5_ZONE_AU915
Tipo de Sensor | Link de Descarga |
---|---|
Sensor de luz integrado en Wio Terminal | Descarga |
Sensor IMU integrado en Wio Terminal | Descarga |
Sensor de humedad de suelo | Descarga |
Sensor de gases VOC y eCO2 (SGP30) | Descarga |
Sensor de temperatura y humedad (SHT40) | Descarga |
Módulo Vision AI | Descarga |
El código anterior para enviar datos del sensor puede cargarse directamente en el Wio Terminal desde el Arduino IDE y ejecutarse. En ese momento, por favor enciende el monitor serial y ajusta la velocidad de transmisión a 9600 baudios 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 y depuración
Una vez que tengamos el dispositivo conectado, puedes comenzar a ver las transferencias de datos en los paquetes en tiempo real y en el registro de eventos.

En la última versión de la actualización de Helium, Helium ya no regala 10,000 CRÉDITOS DE DATOS a los usuarios nuevos, solo 250 CRÉDITOS DE DATOS. Puedes ajustar libremente la frecuencia de envío de datos para reducir el consumo de créditos, o comprarlos según tu elección.
En la pestaña My Devices, podemos hacer clic en el botón de escarabajo a la derecha de la pantalla para ver la información sobre los datos recibidos por Helium.

Podemos prestar especial atención a la información en las siguientes secciones.
payload: Información sobre los datos enviados a Helium en formato base64.
port: El número de puerto donde se recibieron los datos.
En nuestro código, el número de puerto para enviar mensajes está configurado en 8, así que en la ventana de depuración, todos los mensajes sobre el sensor deberían ser payload para el puerto 8. Para leer y decodificar el payload, puedes hacerlo con la ayuda de este sitio web de decodificación.

Análisis del Código Fuente
Si deseas aplicar el contenido de este tutorial a tu propio desarrollo de proyecto, es esencial aprender a entender el significado del código. Aquí usaremos el código del sensor SHT40 como ejemplo para explicar la lógica de la implementación del código.
Al inicio del programa, necesitamos preparar la información triada necesaria para conectarnos a Helium y para 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 data frames que pueden ser interpretados por el decodificador de Helium y que además cumplen con el protocolo LoRaWAN®, almacenándolos en el arreglo data[]
.
En general, para prevenir desbordamientos de datos, necesitamos considerar los valores máximos y mínimos que el sensor puede leer. Y dividirlos en números hexadecimales que no causen overflow.
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, tendremos dos datos: uno de temperatura y otro de humedad, y pueden ser valores positivos o negativos, por lo que los números negativos deben ser procesados, además de manejar los decimales.
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
)
La función send_sync()
tiene el papel importante de 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 retardo al final del programa determina con qué frecuencia quieres enviar datos. No recomendamos enviar a una tasa menor a 10 segundos, ya que enviar con una frecuencia tan alta puede hacer que el Wio-E5 funcione de manera anormal, y puede ser reconocido por Helium 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, por favor consulta el repositorio en GitHub. Un agradecimiento especial a Paul Pinault (disk91) por escribir la librería para Grove - Wio-E5.
La sección anterior es una guía paso a paso sobre cómo usar el dispositivo para conectarse a Helium y recibir datos. Sin embargo, desde un punto de vista práctico, los datos enviados actualmente a Helium no son legibles para humanos. Si tienes un requerimiento para la visualización de datos, puedes referirte a los siguientes pasos para completar el tutorial sobre la integración de Helium con los hubs de Microsoft Azure IoT, que te guiarán en el proceso de mostrar los datos de forma gráfica.
Integración de Helium en Azure IoT Hub Esta sección describe cómo configurar Microsoft Azure e integrarlo con Helium para subir datos a la plataforma Microsoft Azure. Comencemos > |
Sección de Plataformas en la Nube | |
Integración de Helium en Google Sheets Esta sección introduce el uso de Google Forms en la integración con Helium, y cómo usar Google Forms para almacenar datos de sensores. Ir al capítulo > | |
Integración de Helium en AWS IoT Core Esta sección describe cómo visualizar la información de datos recibidos usando la integración gratuita de la Web APP. Ir al capítulo > |
Soporte Técnico y Discusión de Producto
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes tipos de soporte y asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para atender diferentes preferencias y necesidades.
Statement
- The LoRa® Mark is a trademark of Semtech Corporation or its subsidiaries.
- LoRaWAN® is a mark used under license from the LoRa Alliance®.