Pular para o conteúdo principal

Conectando ao TTN

Neste capítulo, veremos o uso básico da plataforma TTN e como retransmitir os dados do sensor por meio da plataforma TTN.

Atualizável para sensores industriais​

Com o controlador S2110 SenseCAP e o registrador de dados S2100 SenseCAP, você pode facilmente transformar o Grove em um sensor LoRaWAN®. A Seeed não só o ajuda com a prototipagem, mas também oferece a possibilidade de expandir seu projeto com a série SenseCAP de robustes sensores industriais.

O gabinete IP66, a configuração por Bluetooth, a compatibilidade com a rede global LoRaWAN®, a bateria interna de 19 Ah e o poderoso suporte do APP tornam o SenseCAP S210x a melhor escolha para aplicações industriais. A série inclui sensores para umidade do solo, temperatura e umidade do ar, intensidade de luz, CO2, EC e uma estação meteorológica 8 em 1. Experimente o mais recente SenseCAP S210x para o seu próximo projeto industrial bem-sucedido.

Sensor Industrial SenseCAP
S2100
Registrador de Dados
S2101
Temperatura do Ar & Umidade
S2102
Luz
S2103
Temperatura do Ar & Umidade & CO2
S2104
Umidade do Solo & Temperatura
S2105
Umidade do Solo & Temperatura & EC
S2110
Controlador LoRaWAN®
S2120
Estação Meteorológica 8 em 1

Se você não tem nenhuma experiência com TTN, recomendamos que leia primeiro sobre o console do TTN.

pir

Introdução ao TTN

Neste capítulo, apresentaremos os controles do console do TTN que usamos para obter uma primeira impressão do console do TTN.

Vamos começar >
nota

Antes de iniciar esta seção, certifique-se de que você tenha cobertura TTN LoRaWAN® em torno do seu ambiente de implantação, caso contrário você não poderá adicionar dispositivos ao TTN via LoRa®. Para mais detalhes, leia TTN LoRaWAN®.

Adicionando dispositivos Grove - Wio-E5 ao console TTN​

Para retransmitir os dados do sensor para fora do TTN, o primeiro passo é adicionar o Grove - Wio-E5 ao TTN Application para criar a conexão entre o dispositivo local e a plataforma TTN.

Passo 1. Obter o DevEUI, AppEUI para o Grove - Wio-E5.

Por favor, baixe o ambiente necessário para Arduino e Wio Terminal na pre-approved content.

Clique aqui para baixar o código para o DevEUI, AppEUI que vem com o Grove - Wio-E5 e carregá-lo no 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);
}

Abra o monitor de porta serial da Arduino IDE, defina a taxa de baud para 9600 e observe a configuração.

Anote os 16 dígitos após DevEUI e AppEUI, que serão usados na seção de adição de dispositivo no TTN.

Passo 2. Adicionar uma aplicação

Clique no botão Add application no canto superior direito.

Preencha os campos com asterisco e defina o conteúdo de acordo com sua preferência.

Em seguida, clique em Create Application.

Passo 3. Adicionar dispositivos

Vá para End devices no menu à esquerda e clique em + Add end device para acessar a página de registro de dispositivos finais.

Para usar o Grove - Wio-E5 no repositório de dispositivos, certifique-se de que a guia From the LoRaWAN® Device Repository esteja selecionada.

Em seguida, clique nas seguintes opções para selecionar.

  • Brand -- SenseCAP
  • Modelo -- Módulo LoRa-E5 STM32WLE5JC
  • Versão de Hardware -- 1.0
  • Versão de Firmware -- 1.0
  • Perfil (Região) -- Escolha um plano de frequência apropriado para a sua região.
nota

Escolha um plano de frequência apropriado para a sua região. Seu dispositivo e gateway devem usar o mesmo plano de frequência para se comunicarem. Diferentes regiões do mundo usam diferentes planos de frequência, por ex. 863-870 MHz para a Europa, 902-928 MHz para a América do Norte, etc.

Aqui, vou escolher a banda do gateway TTN que utilizo, EU868.

Em seguida, preencha o DevEUI e o AppEUI que você acabou de obter nos campos correspondentes do TTN.

Quanto ao AppKey, clique no botão Generate e depois faça o upload para o Wio Terminal usando o código a seguir para habilitar o Grove - Wio-E5.

Observe que o AppKey de 32 bits gerado pelo TTN é substituído pelo conteúdo no código.

lorae5.sendATCommand("AT+KEY=APPKEY,\"2B7E151628XXXXXXXXXX158809CF4F3C\"","","+KEY: ERROR","",1000,false,NULL);

Aqui está o 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);
}

Neste ponto, os três códigos para Grove - Wio-E5 e TTN foram configurados. Basta clicar em Register end device.

Escrever função de decodificação para diferentes sensores​

Nas seções anteriores, mostramos como usar o Wio Terminal para ler os valores dos sensores individuais do kit. Para enviar os valores dos sensores para o TTN via Grove - Wio-E5, é necessário usar comandos AT para isso. Os dados enviados são recebidos pelo TTN e precisam ser decodificados antes de se tornarem dados reais que possamos ler. Esta é a razão pela qual escrevemos o decodificador.

Além disso, como o formato de dados enviado não é uniforme, com sensores tendo dados inteiros, float, positivos e negativos, etc., o código do decodificador necessário para cada sensor é diferente.

Tipo de sensorEndereço para download
Sensor de luz integrado do Wio TerminalDownload
Sensor IMU integrado do Wio TerminalDownload
Sensor de Umidade do SoloDownload
Sensor de Gás VOC e eCO2 (SGP30)Download
Sensor de Temperatura & Umidade (SHT40)Download
Módulo Vision AIDownload

Opção 1. Decodificador de dados do Sensor de Luz do Wio Terminal​

Na seção anterior Wio Terminal Light Sensor, usamos uma variável inteira light para armazenar o valor de luz lido pelo sensor de luz e enviamos esse valor usando a função send_sync(). Portanto, o objetivo do decodificador que escrevemos no TTN é ser capaz de analisar esses dados inteiros.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save Function para salvar este decodificador.

function Decoder(bytes, port) {

var decoded = {};
if (port == 8) {
decoded.light = bytes[0]<<8 | bytes[1];
}

return decoded;
}

Clique em Payload formatters --> Uplink --> Custom Javascript formatter do dispositivo, nesta ordem.

Em seguida, basta colar o código do decodificador acima em Formatter code.

Podemos inserir os dados de um sensor de luz de 8 bits na janela Test no lado direito para verificar se o decodificador analisa corretamente.

Opção 2. Decodificador de dados do Sensor IMU do Wio Terminal​

Na seção anterior Wio Terminal IMU Sensor, usamos números float x_values, y_values, z_values para armazenar os três eixos de dados retornados pela IMU, e multiplicamos esses três conjuntos de dados por 100 para convertê-los em inteiros e depois enviá-los juntos.

Em particular, é importante notar que esses dados podem ser tanto positivos quanto negativos, portanto também precisamos analisá-los e restaurá-los para um número float.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save changes para salvar 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 inserir os dados de um sensor IMU de 48 bits em Test no lado direito para verificar se o decodificador analisa corretamente.

Opção 3. Decodificador de dados do Sensor de Umidade do Solo Grove​

Na seção anterior Grove Soil Moisture Sensor, usamos uma variável inteira sensorValue para armazenar o valor de umidade do solo lido pelo sensor de umidade do solo e enviamos esse valor usando a função send_sync(). Portanto, o objetivo do decodificador que escrevemos no TTN é ser capaz de analisar esses dados inteiros.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save changes para salvar este decodificador.

function Decoder(bytes, port) {

var decoded = {};
if (port == 8) {
decoded.soil = bytes[0]<<8 | bytes[1];
}

return decoded;
}

Podemos inserir os dados de um sensor de umidade do solo de 8 bits em Test no lado direito para verificar se o decodificador analisa corretamente.

Opção 4. Decodificador de dados do Sensor de Gás VOC e eCO2 Grove (SGP30)​

Na seção anterior Grove VOC and eCO2 Gas Sensor (SGP30), usamos as variáveis inteiras tvoc_ppb e co2_eq_ppm para armazenar os valores de VOC e eCO2.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save changes para salvar 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 inserir os dados de um SGP30 de 16 bits em Test no lado direito para verificar se o decodificador analisa corretamente.

Opção 5. Decodificador de dados do Sensor de Temperatura & Umidade Grove (SHT40)​

Na seção anterior Grove Temp&Humi Sensor (SHT40), usamos variáveis float temperature e humidity para armazenar os valores de temperatura e umidade. E enviamos os dois valores depois de tê-los ampliado cem vezes em inteiros.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save changes para salvar 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 inserir os dados de 32 bits do SHT40 em Test no lado direito para verificar se o decodificador analisa corretamente.

Opção 6. Decodificador de dados do Grove Vision AI Module​

Na seção anterior Grove Vision AI Module, usamos variáveis int model e confi para armazenar o tipo de modelo identificado e seu nível de confiança.

O código de configuração do seu decodificador é o seguinte. Cole o código a seguir na seção de código do TTN. Clique em Save changes para salvar 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 inserir os dados de 16 bits do Vision AI em Test no lado direito para verificar se o decodificador analisa corretamente.

Enviar código de upload de dados para o TTN​

Nas diferentes páginas de sensores, fornecemos códigos detalhados para upload de dados. Você também pode encontrar o código do sensor que deseja usar na lista abaixo.

nota

Antes de usar o código fornecido nesta seção, observe que o Device EUI, App EUI e App Key no código são consistentes com as informações do dispositivo adicionadas pelo TTN. E verifique se a banda de frequência configurada para o Grove - Wio-E5 é a mesma que a banda do gateway em sua área ou do TTN. Caso contrário, isso pode resultar em falha de acesso à rede.

O código para definir a banda LoRaWAN® é o seguinte, e a configuração padrão é a banda EU868. (A banda EU868 é comumente usada na região europeia.)
#define Frequency DSKLORAE5_ZONE_EU868
Banda US915 (A banda US915 é comumente usada na América do Norte.)
#define Frequency DSKLORAE5_ZONE_US915
Banda AU915 (A banda AU915 é comumente usada na região da Austrália.)
#define Frequency DSKLORAE5_ZONE_AU915

Tipo de SensorEndereço para Download
Sensor de luz integrado do Wio TerminalDownload
Sensor IMU integrado do Wio TerminalDownload
Sensor de Umidade do SoloDownload
Sensor de Gás VOC e eCO2 (SGP30)Download
Sensor de Temperatura e Umidade (SHT40)Download
Vision AI ModuleDownload

O código acima para envio de dados do sensor pode ser enviado diretamente para o Wio Terminal a partir do Arduino IDE e executado. Nesse momento, ligue o monitor serial e ajuste a taxa de baud para 9600 para observar a transmissão de dados em tempo real.

Para mais detalhes, volte à seção sobre o uso de sensores individuais no catálogo de referência.

Dados em tempo real​

Na guia Application, podemos clicar em Live data para ver as informações sobre os dados recebidos pelo TTN.

Podemos ver diretamente as informações dos dados após a decodificação pelo decodificador.

Análise do Código-fonte​

Se você quiser aplicar o conteúdo deste tutorial ao desenvolvimento do seu próprio projeto, aprender a entender o significado do código é essencial. Aqui usaremos o código do sensor SHT40 como exemplo para explicar a lógica de implementação do código.

No início do programa, precisamos preparar as informações necessárias da tríade para conectar ao TTN e definir a frequência do 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";

Em seguida, uma função data_decord() é definida. Esta função converte os valores do sensor em quadros de dados que podem ser analisados pelo decodificador do TTN e que também estejam em conformidade com o protocolo LoRaWAN®, e os armazena no array data[].

Em geral, para evitar estouro de dados, precisamos considerar os valores máximos e mínimos que o sensor pode ler. E dividir em números hexadecimais que não irão estourar.

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 o sensor SHT40, ele terá dois dados, um é o dado de temperatura e o outro é o dado de umidade, e há valores positivos e negativos, então os números negativos precisam ser processados, e também as casas decimais precisam ser tratadas.

int_temp = temperature*100;
int_humi = humidity*100;

O próximo passo é a inicialização do SHT40 e a configuração inicial do Wio-E5. Tudo isso será executado na função setup().

lorae5.begin(DSKLORAE5_SWSERIAL_WIO_P2)

No código de inicialização, DSKLORAE5_SWSERIAL_WIO_P2 representa a interface Grove no lado direito do Wio Terminal, enquanto DSKLORAE5_SWSERIAL_WIO_P1 representa a interface Grove no lado esquerdo. Para outros projetos sem sensores externos, você também pode usar DSKLORAE5_SEARCH_WIO, que pesquisará automaticamente a interface Grove à qual seu Wio-E5 está conectado.

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
)

O papel importante da função send_sync() é enviar os valores do sensor pela LoRaWAN®. O primeiro parâmetro indica o número do canal para enviar os dados, o segundo parâmetro indica o conteúdo dos dados enviados e o terceiro parâmetro indica o comprimento dos dados enviados. Em geral, só precisamos nos concentrar no conteúdo dos três primeiros parâmetros.

delay(15000);

O atraso no final do programa determina com que frequência você deseja enviar dados. Não recomendamos o envio em uma taxa inferior a 10 segundos, pois o envio em uma frequência tão alta pode fazer com que o Wio-E5 funcione de forma anormal e pode ser reconhecido pelo TTN como um dispositivo anormal e bloqueado devido à alta frequência.

Para saber mais sobre o código e os recursos do Grove - Wio-E5, consulte o link do repositório no GitHub. Agradecimentos especiais a Paul Pinault (disk91) por escrever a biblioteca para o Grove - Wio-E5.

Fique ligado para mais conteúdo!

Suporte Técnico & Discussão de Produto​

Obrigado por escolher nossos produtos! Estamos aqui para fornecer diferentes formas de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Declaração​

  • A marca LoRa® é uma marca registrada da Semtech Corporation ou de suas subsidiárias.
  • LoRaWAN® é uma marca usada sob licença da LoRa Alliance®.
Loading Comments...