Nous contrĂ´lons les LED Ă  l'aide de l'API Web Bluetooth et d'Arduino



- Bouilloires, balances, jouets, ampoules, machines à café ... Des modules Bluetooth sont intégrés à ces appareils et à d'autres.
- Pourquoi?
- Pour permettre à l'utilisateur de gérer ses appareils via l'application. Par exemple, contrôlez l'éclairage de la pièce.
- Oh, est-il possible d'assembler un appareil simple et de le gérer directement via le navigateur?
- Oui! Et cet article est juste Ă  ce sujet.


Un peu de théorie


Ici, je vais donner quelques termes de base dont nous avons besoin pour mettre en œuvre la tâche (nous en parlerons un peu plus tard) dans la vie.


Bluetooth


Norme radio sans fil qui connecte différents types d'appareils sur de courtes distances. Pour contrôler les glandes via l'API Web Bluetooth, nous avons besoin de Bluetooth v4.0.


Gatt


Les attributs génériques sont une arborescence de capacités constamment diffusée d'un périphérique Bluetooth.


Les services


Il existe des services à l'intérieur du périphérique Bluetooth. Un service lui-même est un ensemble de fonctionnalités et de relations avec d'autres services. Chaque service a son propre UID et son propre nom. Souvent, des «services inconnus» apparaissent. Cela est dû au fait que le nombre d'appareils et leurs cas d'utilisation est important.


CARACTÉRISTIQUES


À l'intérieur de chaque service, il existe des caractéristiques dans lesquelles vous pouvez les écrire, les lire et également vous y abonner. La fonctionnalité a également son propre UID.


Défi


Comme tâche, j'ai choisi une implémentation de site qui peut:


  • Allumez les LED de diffĂ©rentes couleurs et Ă©teignez-les.
  • Faites scintiller les LED de diffĂ©rentes couleurs.

Et, comme vous pouvez le comprendre à partir de l'énoncé du problème, vous devez apprendre à vous connecter et à vous déconnecter d'un périphérique Bluetooth.


Composants


Pour terminer la tâche, j'ai sélectionné la liste suivante des nécessaires:


  • Arduino
  • Module Bluetooth v4.0 (HM-10 dans mon cas).
  • Deux LED tricolores.
  • Planche Ă  pain.
  • Fils de connexion.
  • RĂ©sistances

Cette liste n'est pas stricte pour la mise en œuvre. Je suis sûr que vous pouvez remplacer Arduino par quelque chose d'autre et choisir un module Bluetooth différent. Mais l'article examinera l'interaction avec ces composants.


Comment ça devrait fonctionner


En bref, l'essentiel est le suivant: nous nous connectons au module Bluetooth et transmettons un certain code (de 1 Ă  4 inclus). Si le code est valide, l'une des trois couleurs s'allume ou les LED clignotent avec toutes les couleurs possibles (rouge, vert, bleu) pendant un certain temps.


Cuisine


Vous devez d'abord collecter un diagramme de travail et charger un croquis Arduino. Ci-dessous, je donne le circuit (Fig. 1) et le code de croquis que j'ai obtenu.



Fig. 1 (schéma de montage)


#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; } } 

Dernière cuisson


Nous avons donc téléchargé le croquis, connecté le circuit à l'alimentation. Et ensuite? Pour travailler avec l'API Web Bluetooth, nous devons connaître le nom de notre appareil et le service auquel nous voulons accéder. Pour cela, vous pouvez utiliser l'application «nRF Connect».


Nous activons l'application et voyons une liste des appareils Bluetooth près de nous (Fig.2).



Fig. 2 (Liste des appareils trouvés par l'application)

L'appareil avec le nom «CC41-A» m'a intéressé et pas en vain.


Après la connexion à l'appareil, une liste de ses services devient disponible pour nous (Fig. 3). Il est peu probable que nous trouvions quelque chose d'intéressant dans les «Informations sur l'appareil», nous cliquons donc hardiment sur le «Service inconnu».



Fig. 3 (Liste des services de l'appareil)

Dans la capture d'écran ci-dessous (Fig.4), vous pouvez remarquer la chose la plus importante pour nous: écrire sur la caractéristique et la lire.


Lorsque j'ai résolu le problème décrit ci-dessus, j'ai essayé d'envoyer la valeur «2» à la caractéristique. En conséquence, ma paire de LED a commencé à devenir verte. Presque un succès. Maintenant, nous devons faire la même chose, mais pas via une application mobile, mais via un navigateur.



Fig. 4 (caractéristique inconnue)

Voici la liste des données que nous avons reçues de l'application pour continuer la tâche:


  1. Le nom de l'appareil.
  2. UID du service.
  3. Caractéristiques UID.

Implémentation Web


Avant de commencer à écrire du code JavaScript, il y a quelques points à noter:


  1. L'API est expérimentale.
  2. Fonctionne dans Chrome et Samsung Internet.
  3. Une connexion via HTTPS est requise.
  4. Je ne donnerai pas d'exemples de code HTML et CSS, car dans le cadre de cet article il n'y a rien d'intéressant en eux, mais je laisserai un lien vers le référentiel et le site internet à la fin de l'article.

Javascript


L'utilisation de l'API Web Bluetooth est basée sur Promise. Ci-dessous, je donnerai des exemples de code progressif. Le code source complet se trouve dans le référentiel dans lequel le lien sera laissé.


Nous devons d'abord nous connecter à l'appareil. Nous demandons des appareils et dans le filtre, nous transférons le nom de l'appareil et l'UID de service avec lesquels nous travaillerons. Si vous ne spécifiez pas le service à l'avance, il ne sera plus possible à l'avenir d'interagir avec lui.


 navigator.bluetooth.requestDevice({ filters: [ { name: MY_BLUETOOTH_NAME }, { services: [SEND_SERVICE] }, ] }) 

Après avoir cliqué sur le bouton «Connecter», une fenêtre s'ouvrira (Fig. 5), dans laquelle vous devrez sélectionner un appareil et cliquer sur le bouton de connexion.



Fig. 5 (FenĂŞtre avec appareil accessible pour la connexion)

Une fois connecté, une promesse contenant un «appareil» est retournée, à laquelle vous pouvez vous connecter. Ok, écrivons-le dans une variable et créons une connexion.


 .then(device => { myDevice = device; return device.gatt.connect(); }) 

Après cela, une promesse contenant «serveur» nous est retournée. Ensuite, nous demandons «service» au «serveur», en y passant l'UID du service (que nous avons espionné via l'application). Ensuite, nous obtenons une promesse contenant «service», à partir de laquelle nous demandons «caractéristique», en lui passant l'UID (que nous avons également jeté un œil à travers l'application).


 .then(server => server.getPrimaryService(SEND_SERVICE)) .then(service => service.getCharacteristic(SEND_SERVICE_CHARACTERISTIC)) 

Et seulement maintenant, nous pouvons déjà commencer à faire quelque chose. Par exemple, je stocke une caractéristique dans une variable et raccroche les gestionnaires de clic de bouton. Dans leurs attributs de données, ils contiennent un code qui sera écrit dans la caractéristique lorsque vous cliquez dessus.


Les gestionnaires de clic de bouton contiennent le code suivant:


 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) ); }); 

Il est nécessaire de passer un tableau uint8 à la caractéristique, par conséquent, pour convertir le code qui lui sera transmis, vous devez utiliser Uint8Array.


Comme prévu, le code 1 fait clignoter les LED en trois couleurs puis s'éteint. Mais comment éteindre la LED si le code 3 lui a été transmis et que la LED est toujours allumée? Ou activer une couleur différente?


J'ai lu la valeur qui se trouve dans la caractéristique, je la convertis à l'aide de getUint8 et, si le code correspond, j'envoie une valeur non valide (par exemple, 0). Si la valeur est valide, je vais la convertir en unité de tableau8 et l'écrire dans la caractéristique.


Pour la solution finale de la tâche, il vous suffit d'apprendre à vous déconnecter de l'appareil. Nous avons déjà un eventListener sur le bouton "Disconnect", dans lequel le périphérique se déconnecte du périphérique Bluetooth, les eventListeners sont supprimés, les boutons de contrôle sont masqués et undefined est écrit dans les variables.


 myDevice.gatt.disconnect(); toggleItemsEventListeners('removeEventListener'); toggleButtonsVisible(); toggleLigthCharacteristic = undefined; myDevice = undefined; 

Résumé


Nous avons créé une page Web simple avec laquelle vous pouvez vous connecter et contrôler un appareil Bluetooth. Comme vous pouvez le voir, c'est assez simple. Et les appareils que vous pouvez assembler et gérer de cette manière ne sont limités que par votre imagination!


Liens utiles


Source: https://habr.com/ru/post/fr416579/


All Articles