IoT DevKit - 8. Envio de Dados por LoRaWAN

Introdução
No tutorial anterior tivemos o nosso primeiro contato com o módulo LoRaWAN Bee, porém não chegamos a fazer o que realmente se espera de um dispositivo IoT, ou seja, ainda não nos conectamos à rede. Consequentemente ainda não chegamos a enviar a nossa primeira mensagem.
Neste tutorial iremos aprender como configurar corretamente a plataforma online, como utilizar os comandos da biblioteca para estabelecermos a primeira conexão e enviar a primeira mensagem.
Lista de Materiais

Lista completa de produtos
comprar
IoT DevKit - LoRaWAN
Configuração da Plataforma
Neste kit usaremos a PROIoT como plataforma de exibição de dados, portanto primeiramente crie a sua conta na plataforma para que possamos prosseguir. Além disso, iremos utilizar uma linha ATC paga para nos conectar e enviar as mensagens, portanto realize a compra do plano antes de tentar qualquer conexão com a plataforma. Lembre-se de verificar a disponibilidade da linha ATC na sua região antes de efetuar a compra.
Criação do Dispositivo
Agora que a conta está criada e o plano está comprado, temos que criar uma "Aplicação" dentro da sua "Organização" antes de configurar um dispositivo LoRaWAN. Para isso, acesse a seção "Organização" da plataforma, onde será exibido um resumo de sua "Organização" com o número de "Aplicações", "Tokens API", "Gateways", "Perfis - LoRa Privado" e "Perfis - ATC LoRaWAN". Então clique sobre esta janela de resumo, como na primeira imagem abaixo. Caso você ainda não tenha uma "Organização", apenas clique no botão "+ Organização" digite um nome para ela e pressione o botão de confirmação verde. Ao clicar sobre a janela de resumo, você é redirecionado para uma página de configuração da "Organização", mais especificamente para a seção de "Aplicações". Com esta seção aberta, pressione o botão "+ Aplicação" digite um nome para ela e pressione o botão de confirmação verde, como na segunda imagem abaixo.


Assim que a "Organização" e a "Aplicação" estiverem corretamente criadas e configuradas, acesse a seção "Dispositivos" da plataforma para iniciarmos a configuração. Ao acessar essa seção, clique sobre o botão "+ Dispositivo" da página, como na imagem abaixo.

Ao pressionar o botão, é exibida uma janela de criação de um novo dispositivo, como na imagem a seguir.

Neste momento temos de escolher a tecnologia que utilizaremos para conectar o nosso dispositivo à plataforma. Para este tutorial, selecione a opção "LoRaWAN". Após a seleção da tecnologia, temos que selecionar o "Modelo" de dispositivo, e, como o LoRaWAN Bee não está listado nas opções, temos que selecionar a opção "Dispositivo genérico", como na próxima imagem.

Agora que a tecnologia e o modelo de dispositivo estão devidamente configurados, temos que selecionar o tipo de conectividade que usaremos com este dispositivo. No caso deste tutorial, usaremos a opção "Rede ATC LoRaWAN", como na imagem a seguir.

Com a conectividade selecionada, a plataforma irá apresentar uma janela de configuração dos dados do dispositivo, como na imagem abaixo. Com esta janela aberta, digite o nome de seu dispositivo no campo "Nome do Dispositivo". Além do nome do dispositivo, aproveite para selecionar a sua rede ATC adquirida no campo "Conectividade LoRaWAN", antes de conectarmos o LoRaWAN Bee ao computador. Se não houver nenhuma opção nesse campo de conectividade, significa que não há um plano ATC disponível e você deve adquirir um (veja nosso tutorial sobre esse passo a passo).

Agora que estas coisas mais simples estão configuradas na plataforma, podemos atrelar e salvar as informações que serão usadas de fato pelo dispositivo. Primeiramente digite o "Device EUI" (que aprendemos como obter no tutorial anterior), no campo "Device EUI" na plataforma. Feito isso, vamos gerar aleatoriamente os códigos "Application EUI" e "Application Key", que possuem 16 e 32 caracteres hexadecimais (8 e 16 bytes), respectivamente. Para gerar estes valores aleatoriamente, basta clicar sobre a seta em formato circular nos respectivos campos, como na imagem a seguir.

Com esses valores gerados, garanta que o dispositivo da plataforma está configurado com o método de conexão "OTAA" no campo "Ativação de Segurança", como na imagem abaixo.

Por fim, basta verificar se os campos "Criptografia de Segurança", "Classe de Dispositivo" e "Tamanho do Contador" estão selecionados como "NS", "A" e "4", respectivamente. Além disso, altere o campo "Formato de Payload", que está com a opção "Hexadecimal" pré-selecionada pela plataforma, para a opção "JSON". Quando tudo estiver certo, o seu dispositivo deve estar parecido com o da próxima imagem.

Com o dispositivo finalmente configurado, clique sobre o símbolo de confirmação verde na parte de baixo da página para que a criação do dispositivo seja finalizada. Após pressionar o botão, é exibido na lista de "Dispositivos" o dispositivo que acabamos de criar, como na imagem a seguir.

Configuração da Variável
Agora que o nosso dispositivo está criado e devidamente configurado, podemos criar uma variável para armazenar os valores que enviaremos posteriormente. Para isso, clique sobre o dispositivo criado e então pressione o botão "+ Variável" para entrar no campo de criação, como na imagem a seguir.

Com esta janela de configuração aberta, digite um nome para a sua variável, e então digite sua unidade como "%", já que vamos receber a porcentagem de luminosidade ambiente na plataforma. Além disso, certifique-se que os "Pontos Decimais" estão configurados como "0", e digite o nome "Luminosidade" no campo "Alias" (o código de exemplo deste tutorial possui este nome de Alias pré configurado, porém você você pode utilizar outro nome se preferir, lembrando de alterar a variável no código também). Após estas configurações, sua variável deve estar como a da imagem abaixo.

Com a variável devidamente configurada, pressione o botão de confirmação verde para que a variável seja criada. Após pressionar o botão, é possível observar a variável na lista do dispositivo.
Edição do Painel
Agora temos que acessar o nosso "Painel", para adicionarmos um "Widget" para exibir as mensagens que enviaremos para a plataforma. Com o painel aberto, selecione o botão "+ Widget" e selecione a opção "Métrico", como na imagem a seguir.

Ao pressionar esta opção, você é direcionado para uma página de edição do "Widget". Nesta janela, configure primeiramente a sua "Organização" e a sua "Aplicação", e então selecione a variável criada neste tutorial, dentro do dispositivo previamente configurado (ela deve aparecer embaixo do nome do dispositivo - "test-device" na imagem). Com estas primeiras configurações feitas, altere o "Nome do Widget", a cor de exibição da variável e adicione um ícone de exibição, se desejar. Por fim, a sua tela de configuração deve estar parecida com a da próxima imagem.

Com a configuração concluída, pressione o botão de confirmação verde, e observe o "Widget" ser adicionado ao seu painel, como na imagem abaixo.

Vale lembrar que você pode editar o tamanho de exibição do "Widget", se desejar. Basta pressionar o botão direito do mouse sobre a seta no canto inferior direito do "Widget" e arrastá-lo para "dentro" ou para "fora" enquanto o botão está pressionado.
Software
Biblioteca
No tutorial anterior já instalamos a biblioteca "SMW_SX1276M0", porém para fazermos o envio de dados neste tutorial, iremos usar a biblioteca "ArduinoJson". Para instalá-la vamos acessar o "Gerenciador de Bibliotecas" da IDE, através do caminho da imagem abaixo.

Com o gerenciador aberto, digite na barra de pesquisa "arduinojson" e então pressione "Enter" no seu teclado, assim a lista exibirá como primeira opção a biblioteca que usaremos neste tutorial, como na próxima imagem.

Agora basta pressionar o botão "Instalar" e aguardar alguns instantes. Quando a biblioteca estiver instalada, será exibida a etiqueta "Instalada" ao lado do nome dela, como na imagem a seguir.

Código
Agora que todas as bibliotecas necessárias já estão instaladas, copie e carregue o código a seguir para a sua placa. Antes de carregar, apenas lembre-se de alterar as variáveis que armazenam o "Application EUI" (APPEUI
), o "Application Key" (APPKEY
) e o Alias (ALIAS
) com os valores configurados na plataforma.
Entendendo o Código
Primeiramente verificamos se o modelo de placa selecionado na Arduino está correto e retornamos uma mensagem de erro personalizada caso não esteja. Em seguida incluímos no código as bibliotecas que usaremos para nos comunicar com o módulo, conectar com a rede, enviar mensagens e converter os valores lidos pelo sensor de luminosidade.
Com as bibliotecas adicionadas, criamos o objeto LoRaSerial
a partir da biblioteca "HardwareSerial" e definimos os pinos digitais do ESP32 que usaremos para nos comunicar com o LoRaWAN Bee. Com o objeto LoRaSerial
criado, nós o utilizamos para criar o objeto lorawan
a partir da biblioteca "SMW_SX1276M0", configurando assim que o programa utilizará a comunicação serial dos pinos RXD2
e TXD2
para enviar e receber informações do módulo.
Então nós declaramos as variáveis APPEUI
e APPKEY
, que armazenam justamente os códigos do "Application EUI" e do "Application Key", respectivamente, que foram gerados aleatoriamente pela plataforma. Logo em seguida, a variável ALIAS
é declarada para armazenar o nome do Alias que você configurou na sua variável da plataforma. Antes destas variáveis, nós criamos o objeto resposta
do tipo CommandResponse
da biblioteca "SMW_SX1276M0", pois ele será responsável por armazenar as respostas dos comandos executados.
Como não queremos que o código envie mensagens muito rapidamente, para não acabar com o número máximo de "Uplinks" antes do final do mês, nós declaramos a variável TEMPO_ESPERA
que armazena o tempo que o módulo irá levar entre uma mensagem e outra, juntamente com a variável intervalo
, que ajudará a realizar este intervalo entre envios. Por fim declaramos a variável PINO_LDR
, que armazena o pino em que o sensor está conectado; a variável leitura_LDR
, que armazena a leitura do sensor; e a função event_handler
, que verifica se o módulo se conectou à rede.
Já na configuração do código, começamos iniciando o monitor serial com a velocidade de 115200 bps ("bits per second"), a mesma velocidade de comunicação usada para configurar a comunicação com LoRaWAN Bee através do comando LoRaSerial.begin(115200, SERIAL_8N1, RXD2, TXD2)
. Entretanto, antes da inicialização da comunicação na ESP32, nós configuramos o pino de reset do módulo (conectado ao pino 5 da ESP32) e efetuamos a reinicialização para iniciar corretamente a comunicação. Juntamente com estas inicializações, nós declaramos o pino conectado ao sensor como uma entrada do sistema e atribuímos a função event_handler
ao objeto lorawan
.
Agora finalmente começamos a obter e a configurar informações no módulo, e a primeira delas é o "Device EUI", que é impresso no monitor serial se o módulo retornar uma mensagem "<OK>", como vimos no tutorial anterior. Com esta mesma condição, nós configuramos no módulo os códigos para o "Application EUI" e para o "Application Key", juntamente com a configuração do método de conexão para OTAA. Para finalizar a configuração do código, nós enviamos a requisição de conexão para a rede através da função lorawan.join()
.
Atenção: cada procedimento de conexão na rede (join) em modo OTAA consome uma mensagem de "Downlink" para notificar o dispositivo que o acesso foi bem-sucedido.
Finalmente na repetição do código, nós iniciamos cada repetição aguardando por informações do módulo através do comando lorawan.listen()
. Na sequência, verificamos se o módulo está conectado na rede através da condição if(lorawan.isConnected())
. Então, caso ele não tenha se conectado ainda, nós mantemos ele tentando, enquanto imprimimos pontos (".") no monitor serial a cada 5 segundos.
Entretanto, quando o módulo consegue se conectar, passamos a executar o envio de mensagens com intervalos de 5 minutos. Para isso, atribuímos à variável leitura_LDR
a leitura analógica do pino que está conectado ao sensor, e então mapeamos essa leitura de uma valor entre 0 e 4095 para um valor entre 0 e 100, para trabalharmos com porcentagem. Como queremos converter essas leituras para uma mensagem em JSON, temos que criar primeiramente o objeto json
com o tamanho unitário (JSON_OBJECT_SIZE(1)
) e a classe DynamicJsonDocument
da biblioteca "ArduinoJson". Em seguida criamos um elemento com o nome ALIAS
e com o valor igual à leitura mapeada do sensor.
Com essa configuração do objeto json
, nós criamos a variável tamanho_mensagem
, que é então atribuída à soma unitária do comprimento da mensagem JSON do objeto json
. Essa adição é necessária para inserir o caractere de final de texto ('\0') na conversão a seguir. Depois criamos a string mensagem
de acordo com o tamanho tamanho_mensagem
, que será responsável por armazenar a mensagem JSON para o envio. Após esta criação, nós realizamos uma cópia do objeto json
para a variável mensagem
de acordo com o comprimento tamanho_mensagem
, através da função serializeJson()
da biblioteca "ArduinoJson". Por fim, nós finalmente enviamos uma mensagem em formato de texto para a porta "1" da rede através do comando resposta = lorawan.sendT(1, mensagem)
, e atualizamos a contagem de tempo do código para iniciar novamente o envio de mensagem após 5 minutos.
Ao final do código temos a função event_handler
, que foi declarada anteriormente. Nela apenas verificamos se o módulo se conectou à rede utilizando a condição if(type == Event::JOINED)
, para retornar essa informação no monitor serial, pois quando o módulo se conecta à rede, ele retorna a mensagem "EVENT [JOINED]".
O Que Deve Acontecer
Quando o código terminar de ser carregado para a placa com as variáveis mencionadas devidamente configuradas, abra o monitor serial em 115200 bps e observe os resultados. O módulo deve se conectar à rede após alguns instantes, e então enviar a primeira mensagem, como na imagem a seguir.

Após o envio da mensagem, acesse o seu painel na PROIoT para observar que a variável da plataforma foi atualizada com o mesmo valor da mensagem enviada, como na próxima imagem.

Conclusão
Neste tutorial demos um passo importante para o nosso aprendizado sobre a conectividade LoRaWAN e finalmente nos conectamos à rede para enviar nossa primeira mensagem pelo LoRaWAN Bee. Agora podemos avançar nos estudos e expandir as possibilidades deste protocolo tão recente e popular.
Solução de Problemas
Se mesmo seguindo as soluções propostas abaixo você não conseguir solucionar o seu problema, encaminhe um e-mail para suporte@robocore.net para que possamos te ajudar da melhor maneira possível.
Arduino IDE Retornou a Mensagem "#error Use this example with the ESP32"
Como vimos anteriormente, esta é uma mensagem personalizada que criamos no início do código para quando o modelo de placa selecionado não está corretamente selecionado, portanto certifique-se que o modelo da placa nas "Ferramentas" da IDE está como "ESP32 Dev Module".
Monitor Serial Apresenta Pontos Infinitamente e Não se Conecta
Se o seu módulo não estiver se conectando após alguns pontos, você pode reiniciar o conjunto e para tentar novamente. Mas antes, deixe ele tentar se conectar sozinho, portanto aguarde alguns minutos. Entretanto, lembre-se de verificar se a sua posição atual está dentro da área coberta pela rede ATC.
Caso mesmo reiniciando, o módulo não se conecta, verifique a inserção dos códigos para "Application EUI" e "Application Key", assim como a configuração do dispositivo na plataforma PROIoT, e tente novamente. Além disso, nas informações sobre o dispositivo, verifique se ele está conectado, com as opções de "Uplink" e "Downlink" selecionadas, caso contrário, selecione estas opções, como na imagem abaixo.

Mensagem Enviada Não é Igual à Mensagem Recebida
Se o valor atualizado na plataforma não for igual ao valor exibido no monitor serial, verifique nas "Opções de Payload" da plataforma se a opção "JSON" está realmente selecionada, como na próxima imagem.
