マイクロビットでの温度
今回はTFab Worksの気温/湿度/気圧センサーを使ってみます。マイクロビットには標準で温度を取得する機能があります。ただし、取得できる温度はマイクロビット本体のCPUのものです。つまり取得できるのは外気温ではありません。CPU温度なので外気温よりも高く計測されます。より正確に気温を取得したい場合はマイクロビットにセンサーを接続しなければいけません。マイクロビットはセンサーをI2Cなどで制御できますが実際のところ制御するのは面倒です。そんな時に便利なのが今回使用するTFab Worksの気温/湿度/気圧センサーです。
・micro:bit用温度・湿度・気圧センサー TFW-EN1
https://tfabworks.com/product/tfw-en1/
上記のページによると計測範囲は以下のようになります。
温度:-40〜+85℃、±1℃ 湿度:0〜100%、±3% 気圧:300〜1100hPa、±1hPa
計測範囲は結構広く、また誤差も少なめですのでマイクロビットで使用するには十分です。センサーもマイクロビットに差し込むだけという至ってシンプルな構造です。
TFab Worksでは、もう1つ温度センサーがありますが、これについては次回取り扱います。
センサーモジュールを読み込む
気温/湿度/気圧センサーを使うためには拡張機能を読み込む必要があります。この機能拡張を読み込むと気温/湿度/気圧センサーだけでなくTFab Worksの他の製品も扱う事ができるようになっています。 「拡張機能」の項目が表示されていない場合は「高度なブロック」の項目をクリックします。
「拡張機能」の項目をクリックします。
拡張機能一覧が表示されます。
検索ボックスに「https://github.com/tfabworks/pxt-stem」のURLを入力し検索ボタン(虫眼鏡)をクリックします。
「stem」の項目が表示されるのでクリックします。
するとTfab WorksのSTEM製品の拡張機能が読み込まれます。
STEMモジュールで使えるブロックは以下のようになっています。
他のモジュールの機能もありますが、今回使用するのはEN1と書かれたカテゴリのブロックになります。
温度を表示する
それでは最初にマイクロビットのLEDに温度を表示してみましょう。単純にマイクロビットのLEDに数値として温度を表示しますので、基本のカテゴリから「数を表示(0)」ブロックを「ずっと」のブロック内に入れます。
次に追加したカテゴリのSTEMの中から「温度℃」を「数を表示(0)」ブロックの中に入れます。
これでできあがりです。JavaScriptコードの場合は以下のようになります。
basic.forever(function () {
basic.showNumber(stem.getTemperature())
})
プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気温がLEDに表示されます。
湿度と気圧を表示する
今度は湿度と気圧を表示させてみましょう。 温度のブロックの代わりに湿度、気圧のブロックを入れるだけです。 湿度の場合は以下のようになります。
プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された湿度がLEDに表示されます。
JavaScriptコードの場合は以下のようになります。
basic.forever(function () {
basic.showNumber(stem.getHumidity())
})
気圧も同様に表示されることができます。気圧の場合は以下のようになります。
プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気圧がLEDに表示されます。なお、映像で表示される気圧は低くなっていますが、これは長野県塩尻市で計測している(標高が高い)ためです(晴天の日に計測)。
JavaScriptコードの場合は以下のようになります。
basic.forever(function () {
basic.showNumber(stem.getPressure())
})
なお、温度、湿度、気圧とも整数値の表示になっていますが、これはブロックが整数値を返す設定になっているためです。用意されているブロックで小数値を返すようにする場合はブロックの右側にある(+)ボタンをクリックします。
すると(-)となり、その左側に「整数」と表示されます。
この「整数」の部分をクリックすると「整数」「小数」を選択できるようになります。
JavaScriptコードの場合は以下のようになります。
basic.forever(function () {
basic.showNumber(stem.getHumidity(OutputNumberFormat.FLOAT))
})
プログラムをダウンロードしマイクロビットに転送して動作を確認します。小数点が表示されますが、値によってはかなり長い値が連続して表示されてしまうことがあります。計算時以外は整数値の表示で十分でしょう。
標高を表示する
次に標高を表示してみましょう。この標高は気圧から計算していると思われます。このため数十メートル近くの誤差が発生する可能性があります。あくまでも簡易的な標高計算として利用するのが無難です。 標高の計算も温度などと同様にブロックで用意されています。
標高の設定値は1013となっていますが、誤差が気になる場合は値を調整してください。 LEDに標高を表示するには以下のようになります。
JavaScriptコードの場合は以下のようになります。
basic.forever(function () {
basic.showNumber(stem.getAltitude(1013))
})
プログラムをダウンロードしマイクロビットに転送して動作を確認します。サンプルは長野県塩尻市なので標高650m程度になりますが、30mくらいの誤差はあるようです。値も数m変わりますので、簡易的に標高がわかるという程度にしておくのがよいでしょう。
不快指数を表示する
それでは最後に気温と湿度から不快指数を計算して表示してみます。不快指数は気温や湿度からどの程度不快なのかを数値で示すものです。不快指数が75以上なら不快ということになります。
・不快指数
https://ja.wikipedia.org/wiki/不快指数
不快指数は上記のWikiに掲載されている以下の計算式を利用します。
0.81×気温+0.01×湿度×(0.99×気温-14.3)+46.3
マイクロビットのブロックで1つの計算式として組むと分かりにくいので、ここでは変数を用意し以下のように分割して計算し、最後にまとめるようにしました。もちろん、変数を使わずにまとめてしまっても構いません。
・変数と対応する計算
n1 0.81×気温
n2 0.01×湿度
n3 0.99×気温-14.3
n4 変数n2×変数n3。この段階で0.01×湿度×(0.99×気温-14.3)の計算結果になります。
n5 合計した値。これが不快指数になります
作成するブロックは以下のようになります。
JavaScriptコードの場合は以下のようになります。
let n1 = 0
let n2 = 0
let n3 = 0
let n4 = 0
let n5 = 0
basic.forever(function () {
n1 = 0.81 * stem.getTemperature(OutputNumberFormat.FLOAT)
n2 = 0.01 * stem.getHumidity(OutputNumberFormat.FLOAT)
n3 = 0.99 * stem.getTemperature(OutputNumberFormat.FLOAT) - 14.3
n4 = n2 * n3
n5 = n1 + n4
n5 = n5 + 46.3
basic.showNumber(Math.round(n5))
})
プログラムをダウンロードしマイクロビットに転送して動作を確認します。
不快指数を数値で表示するのではなく、値に応じてLEDに顔マークなどを表示して、どのくらい不快なのかを示してみるのもよいでしょう。
著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/