- Chaleiras, balanças, brinquedos, lâmpadas, máquinas de café ... Os módulos Bluetooth estão embutidos nesses e em outros dispositivos.
Porque?
- Para permitir que o usuário gerencie seus dispositivos através do aplicativo. Por exemplo, controle a iluminação na sala.
- Ah, é possível montar algum dispositivo simples e gerenciá-lo diretamente através do navegador?
Sim! E este artigo é exatamente sobre isso.
Pouco de teoria
Aqui vou dar alguns termos básicos que precisamos para implementar a tarefa (falaremos sobre isso um pouco mais tarde) na vida.
Bluetooth
Um padrão de rádio sem fio que conecta vários tipos de dispositivos em curtas distâncias. Para controlar as glândulas através da API Bluetooth da Web, precisamos do Bluetooth v4.0.
Gatt
Os atributos genéricos são uma árvore de recursos constantemente transmitida por um dispositivo bluetooth.
Serviços
Existem serviços dentro do dispositivo bluetooth. Um serviço em si é uma coleção de recursos e relacionamentos com outros serviços. Cada serviço tem seu próprio UID e nome. Muitas vezes, "serviços desconhecidos" são encontrados. Isso se deve ao fato de o número de dispositivos e seus casos de uso serem grandes.
Características
Dentro de cada serviço, existem características nas quais você pode escrever, ler e também assinar. O recurso também possui seu próprio UID.
Desafio
Como tarefa, escolhi uma implementação de site que pode:
- Acenda os LEDs em cores diferentes e desligue-os.
- Faça os LEDs brilharem em cores diferentes.
E, como você pode entender na declaração do problema, precisa aprender a conectar e desconectar de um dispositivo bluetooth.
Componentes
Para concluir a tarefa, selecionei a seguinte lista de itens necessários:
- Arduino
- Módulo Bluetooth v4.0 (HM-10 no meu caso).
- Dois LEDs de três cores.
- Tábua de pão.
- Conexão de fios.
- Resistores
Esta lista não é estrita para implementação. Estou certo de que você pode substituir o Arduino por outra coisa e escolher um módulo bluetooth diferente. Mas o artigo considerará a interação com esses componentes.
Como deve funcionar
Resumidamente, a essência é esta: nos conectamos ao módulo bluetooth e transmitimos um determinado código (de 1 a 4 inclusive). Se o código for válido, uma das três cores acenderá ou os LEDs piscarão com todas as cores possíveis (vermelho, verde, azul) por algum tempo.
Cozinhar
Primeiro, você precisa coletar um diagrama de trabalho e carregar um esboço do Arduino. Abaixo, dou o circuito (Fig. 1) e o código do esboço que recebi.
Fig. 1 (diagrama de montagem)
#include <SoftwareSerial.h> int green_pin = 2; int red_pin = 3; int blue_pin = 4; int BLINK_STEPS = 3; int BLINK_DELAY = 100; SoftwareSerial mySerial(7, 8); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); pinMode(green_pin, OUTPUT); pinMode(red_pin, OUTPUT); pinMode(blue_pin, OUTPUT); } int code; void loop() { if (mySerial.available()) { code = mySerial.read(); shutDownAll(); if (code > 0 && code < 5) { analogWrite(code, 200); } if (code == 1) { blinked(); } } } void shutDownAll() { analogWrite(green_pin, 0); analogWrite(red_pin, 0); analogWrite(blue_pin, 0); } void blinked() { int steps = 0; while(steps <= BLINK_STEPS) { analogWrite(green_pin, 200); delay(BLINK_DELAY); analogWrite(green_pin, 0); delay(BLINK_DELAY); analogWrite(red_pin, 200); delay(BLINK_DELAY); analogWrite(red_pin, 0); delay(BLINK_DELAY); analogWrite(blue_pin, 200); delay(BLINK_DELAY); analogWrite(blue_pin, 0); delay(BLINK_DELAY); steps += 1; } }
Última cozedura
Então, baixamos o esboço, conectamos o circuito à energia. O que vem a seguir? Para trabalhar com a API Bluetooth da Web, precisamos saber o nome do nosso dispositivo e qual serviço queremos acessar. Você pode usar o aplicativo "nRF Connect" para isso.
Ativamos o aplicativo e vemos uma lista de dispositivos bluetooth perto de nós (Fig. 2).
Fig. 2 (lista de dispositivos que o aplicativo encontrou)
O dispositivo com o nome “CC41-A” me interessou e não em vão.
Depois de conectar ao dispositivo, uma lista de seus serviços se torna disponível para nós (Fig. 3). É improvável que encontremos algo interessante nas "Informações do dispositivo", então clicamos com ousadia no "Serviço desconhecido".
Fig. 3 (Lista de serviços do dispositivo)
Na captura de tela abaixo (Fig. 4), você pode notar o mais importante para nós: escrever a característica e lê-la.
Quando resolvi o problema descrito acima, tentei enviar o valor "2" para a característica. Como resultado, meu par de LEDs começou a ficar verde. Quase um sucesso. Agora precisamos fazer a mesma coisa, mas não através de um aplicativo móvel, mas através de um navegador.
Fig. 4 (característica desconhecida)
Aqui está a lista de dados que recebemos do aplicativo para continuar a tarefa:
- O nome do dispositivo.
- UID do serviço.
- Características de UID.
Implementação na Web
Antes de começar a escrever o código JavaScript, há alguns pontos a serem observados:
- A API é experimental.
- Funciona no Chrome e na Internet da Samsung.
- A conexão via HTTPS é necessária.
- Não darei exemplos de código HTML e CSS, pois, dentro da estrutura deste artigo, não há nada de interessante neles, mas deixarei um link para o repositório e o site no final do artigo.
Javascript
O trabalho com a API Bluetooth da Web baseia-se no Promise. Abaixo darei exemplos de código em fases. O código fonte completo pode ser encontrado no repositório no qual o link será deixado.
Primeiro, precisamos nos conectar ao dispositivo. Solicitamos dispositivos e, no filtro, transferimos o nome do dispositivo e o UID de serviço com o qual trabalharemos. Se você não especificar o serviço antecipadamente, no futuro não será possível interagir com ele.
navigator.bluetooth.requestDevice({ filters: [ { name: MY_BLUETOOTH_NAME }, { services: [SEND_SERVICE] }, ] })
Depois de clicar no botão “Conectar”, uma janela será aberta (Fig. 5), na qual você precisa selecionar um dispositivo e clicar no botão conectar.
Fig. 5 (Janela com dispositivo acessível para conexão)
Quando conectado, uma promessa contendo "dispositivo" é retornada, à qual você pode se conectar. Ok, vamos escrever em uma variável e criar uma conexão.
.then(device => { myDevice = device; return device.gatt.connect(); })
Depois disso, uma promessa contendo "servidor" é devolvida a nós. Em seguida, solicitamos "serviço" do "servidor", passando para lá o serviço UID (que espionamos através do aplicativo). Em seguida, obtemos uma promessa contendo "serviço", da qual solicitamos "característica", passando o UID (que também espiamos através do aplicativo).
.then(server => server.getPrimaryService(SEND_SERVICE)) .then(service => service.getCharacteristic(SEND_SERVICE_CHARACTERISTIC))
E só agora já podemos começar a fazer alguma coisa. Por exemplo, eu armazeno uma característica em uma variável e desligo os manipuladores de clique no botão. Em seus atributos de dados, eles contêm um código que será gravado na característica quando clicado.
Os manipuladores de clique no botão contêm o seguinte código:
const code = Number(event.target.dataset.code); if (code === 1) { toggleLigthCharacteristic.writeValue(Uint8Array.of(code)); return; } toggleLigthCharacteristic.readValue() .then(currentCode => { const convertedCode = currentCode.getUint8(0); toggleLigthCharacteristic.writeValue( Uint8Array.of(convertedCode === code ? 0 : code) ); });
É necessário passar uma matriz uint8 para a característica; portanto, para converter o código que será passado para ela, você deve usar Uint8Array.
Conforme planejado, o código 1 faz com que os LEDs pisquem em três cores e depois desliguem. Mas como desligar o LED se o código 3 lhe foi transmitido e o LED ainda estiver aceso? Ou ativar uma cor diferente?
Li o valor que está na característica, converte-o usando getUint8 e, se o código corresponder, envie qualquer valor inválido (por exemplo, 0). Se o valor for válido, vou convertê-lo na unidade da matriz8 e gravá-lo na característica.
Para a solução final da tarefa, você só precisa aprender como se desconectar do dispositivo. Já temos um eventListener no botão “Disconnect”, no qual o dispositivo se desconecta do dispositivo bluetooth, eventListeners são removidos, os botões de controle são ocultos e indefinidos são gravados nas variáveis.
myDevice.gatt.disconnect(); toggleItemsEventListeners('removeEventListener'); toggleButtonsVisible(); toggleLigthCharacteristic = undefined; myDevice = undefined;
Sumário
Criamos uma página da web simples com a qual você pode se conectar e controlar um dispositivo bluetooth. Como você pode ver, isso é bem simples. E os dispositivos que você pode montar e gerenciar dessa maneira são limitados apenas pela sua imaginação!
Links úteis