IoTIoT関連の知的好奇心を探求するブログです2020-02-18M5StickCと非接触温度センサHat(MLX90614搭載)でお手軽非接触温度計を作ったM5StickC新型コロナウイルスが猛威を振るっている武漢で、かざすだけで(非接触で)体温が分かる装置を使って建物に入る前に体温を検査しているビデオを見ました。その時は特に注目もしていなかったのですが、たまたまスイッチサイエンスのサイトでM5StickC用の非接触温度センサHatを見つけて、「ああ、こんなのを使っていたんだ!」って興味が湧いたんです。この製品の公開日が「2020年2月12日」で見つけた日は13日で出たばっかり!さらに、お値段も1,200円程度でとても安かったんです。「これは買うしかない!」と思って、さっそく秋葉原の千石電商やマルツに行ってみたんですが、どこにも置いてなかったんです。仕方なく部屋に戻って製品ぺージを見たら、「在庫多数」と表示されていたハズの在庫が「7個」ぐらいになっていたんです。スイッチサイエンスのサイトでは既に在庫「0」で次回入荷が「未定」となっていましたが、この記事を書いている17日の昼は千石電商の店頭に並んでいるのを見かけたので、欲しい方はダッシュでお店に行きましょう!お手軽非接触温度計の写真M5StickCに非接触温度センサHatを付けるとこんな感じです。簡単で、非常にコンパクトです!でも、非接触温度センサHatは下に付いているピンだけで支えているために、本体との上の接触部分に隙間ができて少しぐらぐらするんです。そのため、下の写真のように赤枠部分に両面テープを貼って本体とピッタリ付くようにしました。M5StickCは小さいですがバッテリーを内蔵しているので、少しの間であればこれだけで色々なもの温度を測ることができるんですよ。お手軽非接触温度計のビデオ動作時のビデオを撮ったので、まずはご覧ください。センサーを向けた物体表面の温度を表示する単純なものですが、スマホのようにM5StickCの向きに応じて表示が回転するようにしました。Aボタンに押した時の画面に固定されるスクリーンロック機能と、Bボタンにローテーションを禁止するローテーションロック機能を付けています。プログラムUIFlowを使ってPythonでプログラムを書きたいと思っているのですが、使い慣れているArduinoでまずは作って見ることにしました。「M5StickC」ライブラリの「NCIR_HAT」スケッチ例をベースとして、表示のローテーション機能やローテーションのロック機能、スクリーンロック機能などを付け加えています。delay(100);}温度の取得(26行目から38行目)非接触温度測定ができるMLX90614赤外線温度センサーはI2Cで温度を取得することができます。Adafruitなどからライブラリが提供されていますが、M5StickCのスケッチ例「NCIR_HAT」はライブラリを使わずに直接I2Cを扱うようになっていたので、温度を取得するコードを「measurement」ファンクションにまとめてそのまま使いました。すごく短いコードなので理解しやすいと思います。MLX90614のI2Cアドレス「0x5A」に「0x07」を送信した後、「0x5A」アドレスから2バイト受信した値に係数0.02を掛けて絶対零度273.15を引くと摂氏温度になるようです。&accZ)でX軸・Y軸・Z軸の加速度が取得できます。M5StickCの横向きの加速度はX軸で取得できるので、X軸が0より大きかったら上側が左向き、X軸が0より小さかったら上側が右向きで文字が読めるように画面をローテイションさせています。実際のローテーションは毎回のループで行うのではなく、上下の向きの変化があったときだけ行うようにしています。文字表示に関するチョットしたことスケッチ例は文字色だけで文字の背景色を指定せずに表示を行っています。それだと同じ場所に文字を表示すると、前の文字が消えずに上書きしてしまうため文字が読めなくなってしまいます。そのため、文字を表示する前に背景色の長方形で塗りつぶしてから、新しい文字を表示するようなコードになっていました。そのコードだと文字がチラついて表示されるんです。そのため、文字の背景色を黒にして、いちいち文字を表示するまえに表示する部分を長方形で塗りつぶさなくてもよくして、表示がちらつかないようにしました。その弊害がコードの99行目から104行目に出ています。これは、表示桁数が減った時にマイナス表示や前の数値が残ってしまうのを防ぐために、空白で背景色だけの文字を表示するためのコードなんです。UIFlowのBlocklyで作ってたらこうなったM5Stackが用意しているブロックプログラミング環境UIFlowのBlocklyで同様のプログラムを作ってみました。(図をクリックすると拡大表示します)しかし、緑色の「画面の向きのモードを[]に設定する」ブロックが正常に動作しなくて、M5StickCをX軸方向に傾けても画面のローテーションが行われませんでした。使用できる文字のフォントセットがArduinoと違っていて、Arduinoで使用していたカッコいい「48ピクセル7セグ風フォント」を使うことができませんでした。作られたPythonコードBlocklyで作ったプログラムはPythonでも見ることができます。それで、Pythonのコードを確認したら、57行目と59行目の後にあるはずの画面をローテーションするコードlcd.setRotation()がありませんでした。コードがなければ動作する訳はないですよね。wait_ms(2)よくよくPythonのコードを見ると、最終行になぜかBlocklyにはないwait_ms(2)があったりとちょこちょこおかしなところがあります。今回使用したUIFlowのバージョンはV1.4.4ですが、まだ少し問題が残っているようです。UIFlowで大まかなプログラムを組んでから、作られたPythonコードを修正する方が、最初からPythonでコードを書くより早いと感じました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。