2021年07月29日 更新
どうも、クラゲです。
Web Bluetooth APIを超簡単に扱えるBlueJellyを使って今回はReadを行います
BLEデバイスのセンサー値やスイッチのOFF/ONなどを読むことができます。
Scan と同様
Scan と同様
micro:bitが手元にない人は、HTML側のUUIDと受信データフォーマットを変更すれば、他のBLEデバイスでも対応可能です
micro:bitに内蔵されている温度センサの値をReadボタンを押す度に取得して表示します。
WEB上で試せるデモページはこちら
BlueJelly Sample : Read
ローカル環境で試したい方はこちらのGitHubからダウンロードし、read.html
を開いて実行してください。
成功すると、数値(単位は℃)が表示されます。再びReadボタンを押すと値が更新されます。micro:bitを冷蔵庫で冷やしたり、ドライヤーなどで温めるとわかりやすいですが、やり過ぎて壊さないようにご注意ください
ScanとConnectから順番に学習してきた人は気づいていると思いますが、今回ScanとConnectボタンがありません。
実はBlueJellyのReadは、ScanやConnectを行っていない場合は、先にScanやConnectを行った後にReadする仕様となっています。
逆にScanやConnectが完了している場合は、Readのみ行う仕様です。
なので、ScanボタンやConnectボタンはあってもなくてもどちらでもOKです。ボタンが多いとごちゃごちゃするので今回は消しました。
それではプログラムの解説に入ります。
前回のConnectサンプルプログラムから追加点は2点のみ。
HTMLのScanボタンとConnectボタンを消して、Readボタンを追加しました。
<button id="read" class="button">Read</button>
HTMLにデータ値を表示させるための場所を追加しました。 デフォルト表示は無しとしました。
<div id="data_text"> </div>
readのフローもscanやconnectと同様です
scanとconnectのフローは省略しています。
まず今回のUUIDは温度サービス用に設定しています
window.onload = function () {
//UUIDの設定
ble.setUUID("UUID1", BlueJelly.MICROBIT_TEMPERATURE_SERVICE, BlueJelly.MICROBIT_TEMPERATURE);
}
次にREAD後に、何をするかを記述します。
bluejelly.jsにてREAD処理が終わるとonReadイベントが呼ばれ、引数にはデータ値とUUID名が入ります
ここでは、8bitのデータとして取得して変数valueへ入力しています。
valueの値をコンソールとHTMLの両方に表示し、UUID名とステータスをHTMLに表示しています。
ble.onRead = function (data, uuid){
//フォーマットに従って値を取得
value = data.getInt8(0);//8bitの場合のフォーマット
//コンソールに値を表示
console.log(value);
//HTMLにデータを表示
document.getElementById('data_text').innerHTML = value;
document.getElementById('uuid_name').innerHTML = uuid;
document.getElementById('status').innerHTML = "read data"
}
ボタンが押されたときの関数呼び出しを指定します
今回はreadなので、ble.read(uuid)で呼び出しています。
document.getElementById('read').addEventListener('click', function() {
ble.read('UUID1');
});
特にmicro:bit以外を使っていてうまくいかない人は、以下の3点を確かめてください
data.getInt16(0)
などに変えてみるこのように感じた人は多いのではないでしょうか?
連続でReadしたい場合は、onReadの中で ble.read を行ったり、タイマーを使って ble.readを呼び出したりすることを思いついたはずです。
このやり方も間違ってはいませんが、BLEではもっとスマートなRead方法があります。
それはNotifyです。セントラル(PCやスマホ)側からのタイミングで読むのではなく、ペリフェラル(BLEデバイス)側のタイミングで通知してもらう手法です。
これがもっとも適切で無駄なく早く値を取得できます。
次回は、Notifyについて実践していましょう
以上、Readでデータ読み込みでした!