Primeiros passos com Wio Terminal e Wappsto IoT
Visão geral
O Wio Terminal é um microcontrolador baseado em SAMD51 com conectividade sem fio alimentado por Realtek RTL8720DN que é compatível com Arduino e MicroPython. Atualmente, a conectividade sem fio é suportada apenas pelo Arduino. Ele roda a 120MHz (Boost até 200MHz), possui 4MB de Flash externa e 192KB de RAM. Ele suporta tanto Bluetooth quanto Wi‑Fi, fornecendo a espinha dorsal para projetos de IoT. O próprio Wio Terminal vem equipado com uma tela LCD de 2,4”, IMU onboard (LIS3DHTR), microfone, buzzer, slot para cartão microSD, sensor de luz e emissor infravermelho (IR 940nm). Além disso, ele também possui duas portas Grove multifuncionais para o Ecossistema Grove e 40 pinos GPIO compatíveis com Raspberry Pi para mais expansões.
Wappsto é um aplicativo poderoso e inteligente que pode ser facilmente configurado para obter dados automaticamente de várias fontes. Ele possui um dashboard padrão integrado para monitorar e analisar seus dados.
O Wappsto também oferece ferramentas que permitem aos desenvolvedores criar aplicações de IoT como web apps com integrações e automações. Integrado ao Wappsto há também um marketplace, onde desenvolvedores e usuários podem compartilhar seus Apps.
Wappsto by Seluxit é uma poderosa plataforma de IoT com Dashboards facilmente personalizáveis que tornam a visualização de dados em tempo real ou históricos muito simples, além de muitos outros recursos, incluindo automações na nuvem.
O aplicativo Wappsto para IOS e Android também permite que você visualize e controle dispositivos em qualquer lugar.

Recursos do Wappsto
Você pode operar a seguinte função enquanto estiver conectando ao Wappsto. Para mais informações, você pode fazer mais com seus dados aqui.
Recursos do dashboard
Tipos de dashboard
- Dashboard em branco - Tela estática limpa para combinar e misturar widgets
- Gerenciamento de frota - Tela dinâmica limpa para combinar e misturar widgets - alterne facilmente entre dispositivos para obter uma visão geral de possíveis valores discrepantes.
- Dashboard de geolocalização - Visão geral em mapa dos dispositivos, com possibilidade de filtrar com base em alarmes do dispositivo.
- Geolocalização usando filtro de listas filtradas:
Widgets do dashboard em branco e de gerenciamento de frota
- Lista filtrada - configure limites de valores do dispositivo que disparem alarmes e sinais visuais no dashboard de geolocalização.
-
Widget de localização histórica - Desenha em um mapa com base nas localizações do dispositivo dentro de um período de tempo configurado. (máximo de 1 marca por minuto e mínimo de 50 metros entre marcas)
-
Widget de gráfico - Escolha e configure múltiplas fontes de dados, período de tempo, estilo de gráfico e método de agregação. Também pode ser alternado para mostrar dados em tempo real.
- Exemplo de dados em tempo real:
-
Widget de lista de valores - Mostra dados em tempo real em uma caixa junto com valores de controle / estado desejado.
-
Widget de bússola - Mostra o ângulo de um único dispositivo com dados em tempo real.
-
Widget de gráfico de líquido - Mostra o nível relativo de um único dispositivo com dados em tempo real.
-
Widget de medidor - Mostra dados em tempo real de um único valor em um medidor, com esquema de cores e limites configuráveis.
-
Widget de localização atual - Mostra a localização atual de um ou vários dispositivos juntamente com outros widgets.
- Widget de lista de logs - Mostra logs de um ou mais dispositivos ou valores, juntamente com outros widgets.
Automação em nuvem e web APPS
- Integração com Twitter
- Integração com Hue
- Integração com Shelly
- Integração com previsão do tempo (yr.no)
- Blocks - Automações em nuvem
- Programação NoCode com Blockly
- Programação javascript com Blockly
- Configure automações e interações entre todos os dispositivos e serviços que você conectou ao Wappsto
- Exemplo de automação cruzada entre Twitter e Wappsto:bit: https://bit.wappsto.com/project/wappsto-blocks/
Recursos do Wappsto às vezes negligenciados
- Serviço de nuvem distribuída com múltiplos backups
- Compartilhamento de dispositivo
- Criptografia de ponta a ponta (criptografia de transporte)
- Segurança do dispositivo (chaves únicas de dispositivo e de rede)
- Encaminhamento de dados
- Extração de dados (CSV)
- Login inteligente entre plataformas (login por email, google, facebook, apple)
- Multiplataforma: site + aplicativos para smartphone.
Primeiros passos
Requisitos de hardware
- Wio Terminal x 1
- Computador x 1
- Cabo USB Type-C x 1
Requisitos de software
Por favor, verifique este link.
Atualizar o firmware WiFi do Wio Terminal
Por favor, verifique este link.
Pré-requisitos do Wappsto
Uma conta no Wappsto
Também é presumido que você tenha criado uma conta no Wappsto; se não, por favor, crie uma primeiro.
Arduino IDE instalado no seu PC
Se você não tiver, veja https://www.arduino.cc/en/Guide
Instalar a biblioteca ArduinoJson
No gerenciador de bibliotecas você precisa instalar a biblioteca ArduinoJson - veja https://arduinojson.org/v6/doc/installation/ para mais detalhes.
Instalar esta biblioteca do Wappsto
Para instalar esta biblioteca no Arduino IDE, baixe este projeto como um arquivo zip, clique em "Code" e escolha "Download ZIP". Depois escolha "Sketch"->"Include Library"->"Add .Zip Library..." Veja https://docs.arduino.cc/software/ide-v1/tutorials/installing-libraries para detalhes.
Gerar certificados e ID para um novo dispositivo
Para que seu dispositivo físico possa se identificar perante o Wappsto, ele precisa de um ID de rede, do certificado CA do servidor e do certificado/chave do cliente - tudo isso precisa ser gerado em Wappsto.com e colocado em (se corresponder aos exemplos) um arquivo chamado wappsto_config.h.
wappsto_config.h
Como ajuda para gerar isso você pode usar o script Python incluído neste repositório na pasta generate_config_header. Na primeira execução, talvez seja necessário instalar as bibliotecas exigidas
cd <path to downloaded arduino_wappstoiot>
cd generate_config_header
pip install -r requirements.txt
Para gerar um arquivo de cabeçalho:
- Vá para a pasta
generate_config_header:
cd generate_config_header
- Use o comando:
python main.py --type arduino
-
Em seguida, você será solicitado a fazer login usando email e senha do seu usuário no Wappsto.
-
Copie o arquivo recém-gerado
wappsto_config.hpara sua pasta de sketch do Arduino. Observe que, se gerado corretamente, ele deverá ter um UUID válido (uma string semelhante, mas diferente, a esta"d7fafe76-b020-4594-8f2a-aae11c6b6589"definida na linhaconst char* network_uuid =.
Observe que, se você tiver tanto pyhton2 quanto python3 instalados, talvez seja necessário usar
pip3 install -r requirements.txt
python3 main.py --type arduino
Se você obtiver o erro como abaixo:
ImportError: cannot import name 'soft_unicode' from 'markupsafe'
O que acontece devido a uma alteração na dependência de outra biblioteca, pode ser corrigido usando este comando.
pip install -U MarkupSafe==0.20
Reivindicação e propriedade - Não é permitido acessar valores
Se você obtiver um "not allowed to access" para valores no dispositivo que você criou, é porque você ou não o reivindicou ou a propriedade foi redefinida.
Como você seria o fabricante, ainda verá o dispositivo na sua lista de redes, poderá ver que ele está online, mas não poderá ver valores nem controlar o dispositivo.
Para reivindicar um dispositivo, vá para a aba "IoT Devices" em https://wappsto.com/devices, clique no botão "+ Add an IoT device" no canto superior direito e insira o UUID da rede na caixa.
Se você clicar no botão de exclusão de uma rede, isso removerá a propriedade do dispositivo, de modo que ele possa ser reivindicado por outro usuário. Depois que um dispositivo for reivindicado, ele não poderá ser reivindicado por outro.
Esta biblioteca Wappsto
Estrutura necessária
O ID da rede é gerado pelo Wappsto e está vinculado aos certificados.
├── "Network Name"
│ └── "Device 1 name"
│ | └── "Value 1 name"
│ | └── "Value 2 name"
| | ...
│ └── "Device 2 name"
│ └── "Value 1 name"
│ └── "Value 2 name"
...
Observe que o "name" para o dispositivo e o objeto value têm funcionalidade extra e regras.
- Uma rede não deve ter dispositivos com nomes idênticos.
- Um único dispositivo não deve ter valores com nomes idênticos. (como no exemplo acima, é permitido usar o mesmo nome em um dispositivo diferente.)
A biblioteca perguntará ao Wappsto se existe um dispositivo/valor com esse nome antes de criá-lo, para que seja vinculado ao valor correto. Se nada tiver esse nome, um novo será criado. Se um pai tiver vários filhos com o mesmo nome, a biblioteca escolherá o primeiro disponível.
Se você alterar um nome, um novo será criado, mas o antigo não será deletado. Isso você terá que fazer manualmente, por exemplo usando https://wappsto.com/devices
Inicializar o Wappsto
O Wappsto precisa de uma referência a WiFiClientSecure quando for criado, por exemplo.
WiFiClientSecure client;
Wappsto wappsto(&client);
Definir a configuração e conectar
#include "wappsto_config.h"
...
wappsto.config(network_uuid, ca, client_crt, client_key);
if(wappsto.connect()) {
// Connected
} else {
// Failed to connect
}
Parâmetros opcionais de configuração, log e ping
Além dos comandos obrigatórios, você também pode definir o intervalo de ping e o nível de log:
wappsto.config(network_uuid, ca, client_crt, client_key, ping interval in minutes, log level);
- O intervalo de ping enviará um pacote curto do dispositivo para o Wappsto para manter a conexão ativa. Se o seu dispositivo raramente envia dados, pode ser uma boa ideia adicionar isso para evitar timeout na conexão.
- O nível de log pode imprimir informações da biblioteca Wappsto na porta de depuração serial - os seguintes níveis são possíveis:
VERBOSE
INFO
WARNING
ERROR
NO_LOGS <- Default
Crie sua rede
myNetwork = wappsto.createNetwork("Network Name");
Criar um dispositivo
DeviceDescription_t myDeviceDescription = {
.name = "Device name",
.product = "Product name",
.manufacturer = "Company name",
.description = "Description of the product",
.version = "1.0",
.serial = "00001",
.protocol = "Json-RPC",
.communication = "WiFi",
};
myDevice = myNetwork->createDevice("Device Name", &myDeviceDescription);
Values
Values é provavelmente o que mais interessa a você, e pode ser um dos seguintes:
- Number - inteiros ou decimais, estes serão registrados e exibidos como um gráfico.
- String - uma string legível por humanos (UTF-8)
- Blob - dados, por exemplo uma imagem codificada em base64, valores hexadecimais, etc.
- Xml - um documento xml completo
Ler e escrever dados
Cada value pode ter um ou dois pontos de dados:
- Report: Dados lidos no dispositivo e reportados ao servidor [READ]
- Control: Dados enviados do servidor para o dispositivo para controlá‑lo [WRITE]
Seu value pode ser um deles ou ambos.
Parâmetros de value
Para explicar os parâmetros, usaremos um exemplo de um value de temperatura colocado em uma sala de estar.
- name: Um nome para o value, aqui "Living room"
- type: É uma ajuda para a interface encontrar values do tipo correto, aqui "temperature"
- O parâmetro PERMISSION_e informa à biblioteca se ela deve criar report e/ou control para este value.
- READ -> estado de report
- WRITE -> estado de control
- READ_WRITE -> estado de report e control
- min: (Number apenas) número mais baixo (a ser usado pela interface)
- max: Para number, o número mais alto; para string/blob, o comprimento máximo
- step: (Number apenas) Tamanho do passo para um número, por exemplo 1 para inteiros e 0,1 para decimais
- unit: (Numbers apenas) existe uma unidade para esse número; no exemplo de temperatura é °C
Na primeira vez que um value é criado, um número terá o valor NA, e a string/blob estará vazia, tanto para control quanto para report.
Se o value existir, os dados do value não serão alterados. Se você quiser que o value seja atualizado quando o dispositivo reiniciar, terá que chamar report/control.
Criar um value numérico
ValueNumber_t myNumberValueParameters = { .name = "Living room",
.type = "temperature", // value type
.permission = READ_WRITE,
.min = -20,
.max = 100,
.step = 0.1,
.unit = "°C",
.si_conversion = ""};
myNumberValue = myDevice->createValueNumber(&myNumberValueParameters);
Criar um value de string
ValueString_t myStringValueParameters = { .name = "Value String Name",
.type = "value type",
.permission = READ_WRITE,
.max = 200,
.encoding = ""};
myStringValue = myDevice->createValueString("Value String Name", "value type", READ_WRITE, &myStringValueParameters);
Criar um value de blob
ValueBlob_t myBlobValueParameters = { .name = "Value Blob Name",
.type = "value type",
.permission = READ_WRITE,
.max = 200,
.encoding = ""};
myBlobValue = myDevice->createValueBlob(&myBlobValueParameters);
Criar um value de xml
ValueXml_t myXmlValueParameters = { .name = "Value Xml Name",
.type = "value type",
.permission = READ_WRITE,
.xsd = "test",
.namespace = "test"};
myXmlValue = myDevice->createValueXml(&myXmlValueParameters);
Enviar um report de value
int myInt = 123;
double myDouble = 42.7;
myNumberValue.report("987"); // You can send numbers as a string you format
myNumberValue.report(myInt); // Report the number as an int
myNumberValue.report(myDouble); // Report the number as a double
myStringValue.report("Example string");
myBlobValue.report("A5FF2C");
Definir um value de control
Normalmente o value de control será atualizado apenas a partir de wappsto.com, mas você pode precisar definir um valor atual ao iniciar ou em outras situações. Definir isso é semelhante a report:
int myInt = 123;
double myDouble = 42.7;
myNumberValue.control("987"); // You can send numbers as a string you format
myNumberValue.control(myInt); // Set control as an int
myNumberValue.control(myDouble); // Set control as a double
myStringValue.control("Example string");
myBlobValue.control("A5FF2C");
Adicionar o Wappsto na sua função loop
Para que o Wappsto possa receber dados (control, refresh e pings), ele precisa ser incluído na sua função loop do Arduino - caso contrário, você nunca receberá callbacks com dados e a conexão pode sofrer timeout.
Também é recomendado não bloquear o loop por períodos prolongados.
wappsto.dataAvailable();
Receber uma solicitação de control de value
Você pode escolher se deseja que os dados de control sejam traduzidos para um double ou se você quer a string diretamente.
// Receive control with a number (double)
void controlNumberCallback(Value *value, double data, String timestamp)
{
// handle control request
}
// Receive control with a string
void controlStringCallback(Value *value, String data, String timestamp)
{
// handle control request
}
...
myNumberValue->onControl(&controlNumberCallback);
myStringValue->onControl(&controlStringCallback);
Receber uma solicitação de refresh de value (apenas value de report)
void refreshNumberCallback(Value *value)
{
// handle refresh request
}
...
myNumberValue->onRefresh(&refreshNumberCallback);
Obter os últimos dados e timestamp de um value
Você pode acessar os últimos dados recebidos/enviados e o timestamp usando estas funções. Por exemplo, após um novo boot, o último estado controlado definido no Wappsto.com será recuperado, para que seu programa possa iniciar com esse estado.
Note recuperar numberData de um value vazio retornará 0;
String ctrlData = myNumberValue.getControlData();
double ctrlDataNumber = myNumberValue.getControlNumberData();
String ctrlTime = myNumberValue.getControlTimestamp();
String reportData = myNumberValue.getReportData();
double reportDataNumber = myNumberValue.getReportNumberData();
String reportTime = myNumberValue.getReportTimestamp();
Para mais exemplos, veja o código na pasta de exemplos ou veja 'File -> Examples -> Wappsto' na IDE do Arduino.
Demonstração de Detecção de Temperatura
Aqui vamos usar o exemplo de temperatura fornecido e exibir no Wappsto como você vê abaixo:

- Passo 1. Depois de enviar o código, você pode ver que ele mostrou conexão bem‑sucedida em "IoT Devices" no site do Wappsto.

- Passo 2. Clique na coluna "Dashboards" à esquerda e selecione "Add widget"

- Passo 3. Esses blocos fornecidos podem exibir dados de várias maneiras, aqui escolhemos "Chart"

- Etapa 4. Selecione "Temperature Example" como fizemos o upload antes e clique em "Next"

- Etapa 5. Configure os dados exibidos. Aqui definimos os dados exibidos em "Line"

- Etapa 6. Depois de tudo configurado, podemos ver a saída de dados nos Dashboards
