shunnag が 2021年05月08日13時59分21秒 に編集
コメント無し
本文の変更
# はじめに obniz IoTコンテスト用に温度と湿度を取得する必要があったものの、貴重なIOを消費したくなく、また、BLEで動作確認済みの他のデバイスが少々高価だったため、比較的低価格で手に入る"Xiaomi BLE 温度湿度計 LYWSD03MMC"をobniz.jsで読めるようにしました。 標準ファームウェアのLYWSD03MMCでは温度湿度データを簡単にとることができないので、カスタムファームウェアを導入します。 # つかうもの - obniz Boardなどのobniz.jsが動くもの - Xiaomi BLE 温度湿度計 LYWSD03MMC - BLEが扱えるPCやMac上でのGoogle Chrome (または最近のMicrosoft EdgeやOperaなどのChromiumベースのBluetooth,BLEが扱えるWebブラウザ) # 参考にさせていただいたサイト [1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様](https://www.1ft-seabass.jp/memo/2020/08/11/obniz-connect-enocean-stm-550b-ble-firststep/) obnizで動くプログラムはほぼ、この記事を丸ごとコピーしてアドバタイズフォーマットに合わせて改変しただけです。 [ATCNETZ.de Custom Firmware für das 4€ Xiaomi Thermometer LYWSD03MMC](http://atcnetz.blogspot.com/2020/09/custom-firmware-fur-das-4-xiaomi.html) , ( [github ATC_MiThermometer](https://github.com/atc1441/ATC_MiThermometer) ) LYWSD03MMC用のカスタムファームウェア [github pvvx/ATC_MiThermometer](https://github.com/pvvx/ATC_MiThermometer) 上記カスタムファームウェアの機能アップ版 # 準備 **準備 1: カスタムファームウェアの導入** 1. LYWSD03MMCの電源を入れておきます。 2. BLEが使えるデバイス上のChromium系ブラウザで、[上記の機能アップ版のgithub](https://github.com/pvvx/ATC_MiThermometer)にアクセスします。 3. 少し下にスクロールして、 Table of content > Getting Started > Flashing or Updating the Firmware (OTA) をクリックします。 4. 「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」から、ファームウェアの書き込みページに行きます。 5. ページ上部の 「Connect」ボタンを押し、しばらく待つと出てくる「LYWSD03MMC」を選択し、「ペアリング/ペア設定」を押します。
6. 画面にわさわさっと設定画面が出てきます。 7. 下の方は一旦触らず、上部の「Custom Firmware ver ???」をクリック。
![キャプションを入力できます](https://camo.elchika.com/3b6c23fc4f205744e343201015613b07163a7aec/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f38363964376434352d333064652d343634652d623461332d376333613066303861623631/) 6. しばらく待つと画面が変わります。「Do Activation」ボタンを押して、操作可能な状態にします。 ![キャプションを入力できます](https://camo.elchika.com/246d3c32ab5bb812d1039da6458c92e720d1a223/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f61313766333933642d326339632d346639652d383465382d653665323733643733353536/) 7. Activationが成功すると、ファームウェアの書き込み部分が現れるので、「Custom Firmware ver ???」をクリック。 ![キャプションを入力できます](https://camo.elchika.com/d1fcecdcc641db5649653d3aecc2eab1268fdf7b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f34636235636636652d356233652d343730382d393464662d656664633033343030366134/)
8. ボタンが「Start Flashing」に変わったら、押して書き込みを開始します。
9. 終了後、LYWSD03MMCが勝手に再起動するので、その間にChromium系ブラウザをタスクトレイなど常駐系含めすべて終了しておき、Bluetoothを抱え込み次が繋がらないバグを回避します。だめならデバイスごと再起動します。
9. 終了後、LYWSD03MMCが自動的に再起動するので、その間にChromium系ブラウザをタスクトレイなど常駐系含めすべて終了しておき、Bluetoothを抱え込み次が繋がらないバグを回避します。だめならデバイスごと再起動します。
**準備 2: カスタムファームウェアの設定** 1. LYWSD03MMC(カスタムファームウェア)の電源を入れておきます。上記でファームウェアを書き換えた後の初回は、画面が出ても1~2分ほど安定しないことがあるようなので待ちます。 2. 準備1で使った「Go to the Over-the-air Webupdater Page TelinkMiFlasher.html」に再びアクセスし、同じようにConnectボタンを押します。 3. カスタムファームウェアを導入したことで、デバイス名が「ATC_??????」(??部はMACアドレスの下部6桁)に変わっているので、探して同じように接続します。==この「ATC_??????」をメモしておいてください。== 4. 設定が大量に出てきます、「Advertising type: 」を「Atc1411」に設定します。
![キャプションを入力できます](https://camo.elchika.com/30cc98aad448bee1aab4cb5bb3540918d5dca370/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f33613639393564342d343838382d343463642d613061382d373731383066326435306263/)
5. 必要に応じて、他の設定も変更してください。 RF TX Powerを変更したりintervalを変えることで、電池の消費を少し抑えられます。 6. Send Configボタンを押して設定を確定させます。 7. 以上で、平文で温度湿度(とバッテリー残量)がアドバタイズされてくるようになります。 # プログラミング 上記の [1ft-seabass.jp.MEMO 「EnOcean STM 550B マルチセンサーモジュール(BLE) を obniz の BLE で取得するメモ」 seigo様](https://www.1ft-seabass.jp/memo/2020/08/11/obniz-connect-enocean-stm-550b-ble-firststep/) を参考にさせていただき、以下のようにプログラムを入力します。 ```html: <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous" ></script> <script src="https://unpkg.com/obniz@3.14/obniz.js" crossorigin="anonymous" ></script> </head> <body> <div class="container"> <div><h2>Xiaomi 温湿度計 LYWSD03MMC(BLE)</h2></div> <div> <h3>[raw advertise data]</h3> <div id="valueLYWSD03MMC">--</div> <h3>[raw advertise data 16進数]</h3> <div id="valueLYWSD03MMC2">--</div> <h3>[Temperature]</h3> <div id="temperature">--</div> <h3>[Humidity]</h3> <div id="humidity">--</div> <h3>[Battery]</h3> <div id="battery">--</div> </div> </div> <script> let loopCount = 0; const settings = { duration: null, }; var obniz = new Obniz("OBNIZ_ID_HERE"); //Obniz IDをここに obniz.onconnect = async function () { obniz.display.print("obniz BLE"); obniz.display.print(" ↑ ↓"); obniz.display.print("LYWSD03MMC"); await obniz.ble.initWait(); var target = { localName: "ATC_000000", // カスタムファームウェア導入後のデバイス名 ATC_??????をここに }; var setting = { duration: 60, // 60 sec duplicate: true, // allow duplicate }; obniz.ble.scan.onfind = async function (peripheral) { console.log("LYWSD03MMC connect!" + new Date().getTime()); // 通常のアドバタイズデータ const adv_data = peripheral.adv_data; // 読解用。アドバタイズデータを16進法で表記することで Manufacturer ID の 0x03DA といった値が分かりやすくなります。 const adv_data16 = adv_data.map(function (value) { return value.toString(16); }); $("#valueLYWSD03MMC").text(adv_data.toString()); $("#valueLYWSD03MMC2").text(adv_data16.toString()); // 温度センサー const temperature = Math.round(adv_data[10] * 256 + adv_data[11]) / 10; $("#temperature").text(temperature); // 湿度センサー const humidity = adv_data[12]; $("#humidity").text(humidity); // バッテリー(パーセント) const battery = adv_data[13]; $("#battery").text(battery); // データを受信するたびに再スキャン // 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる await obniz.ble.scan.clearAdvertisementFilter(); await obniz.ble.scan.endWait(); }; obniz.ble.scan.onfinish = async function (peripherals, error) { loopCount++; console.log("scan timeout! [" + loopCount + "]"); // 再スキャンは endWait を走らせると onfinish が発動するのでそこで再開させる await obniz.ble.scan.startWait(target, setting); }; // 初回スタート await obniz.ble.scan.startWait(target, setting); }; </script> </body> </html> ``` # 実行 ![実際の画面](https://camo.elchika.com/e4cfbe37589d067175bcec5b814c5d86a2827b45/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39306237323036662d383734332d343439312d616235362d3763656164613763383035352f61613366373439372d373832302d343063362d396631652d326333356131626164653932/) これで無事にXiaomi BLE 温度湿度計 LYWSD03MMCから温度と湿度を取得することができました。 これをもとに、データを送信してグラフを書いたり、温度や湿度をトリガーにして色々なデバイスを動かしていきます。