環境センサー

 今回は複数のセンサー(気温、湿度、気圧、環境光、環境音)を搭載したボードを使ってみます(以下、このボードについては環境センサーと記します)。開発元はPimoroniで、国内ではスイッチサイエンスから購入することができます。

・enviro:bit https://www.switch-science.com/catalog/6232/
・Pimoroni https://shop.pimoroni.com/products/enviro-bit

 環境センサーの説明はGitHub上に用意されています。

https://github.com/pimoroni/pxt-envirobit

 この環境センサーには白色LEDが2つ搭載されていますが、2020/6/22時点では上記のページには記載がありません。ただし、この白色LEDはブロックエディタから制御することができます。
 今回は環境センサーで計測した値を、もいう1台のマイクロビットにBluetoohを使ってデータを転送し液晶画面に表示します。液晶画面への表示は第23回〜25回の時に使用した液晶モジュールを使用します。今回表示するのは文字のみなので第23回だけ参照してもらえば十分です。

・1.8inch colorful display module for micro:bit, 160x128 https://www.waveshare.com/1.8inch-lcd-for-micro-bit.htm
https://www.amazon.co.jp/dp/B07HD2TXQZ/
・第23回 液晶モジュールを使ってみよう(文字表示) https://news.mynavi.jp/article/makeprogram-23/

環境センサーモジュールを読み込む

 環境センサーを使うためには最初に拡張機能を読み込む必要があります。 「拡張機能」の項目が表示されていない場合は「高度なブロック」の項目をクリックします。

「拡張機能」の項目をクリックします。

拡張機能一覧が表示されます。

検索ボックスに「enviro:bit」と入力し検索ボタン(虫眼鏡)をクリックします。

「envirobit」の項目が表示されるのでクリックします。

すると拡張機能が読み込まれ、Enviro:Bitのカテゴリが追加されます。

環境センサーで使えるブロックは以下のようになっています。

Expertカテゴリのブロックは、1/100の精度で処理したい場合に使います。今回は1/100の精度までは必要ないので、このカテゴリのブロックは使用しません。

気温、湿度、気圧を表示する

 それでは最初にマイクロビットのLEDに気温を表示してみましょう。単純にマイクロビットのLEDに数値として気温を表示しますので、基本のカテゴリから「数を表示(0)」ブロックを「ずっと」のブロック内に入れます。

次に追加したカテゴリのEnviro:Bitの「Air & Weather」カテゴリの中にある「Get tempreature」ブロックを「数を表示(0)」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getTemperature())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気温がLEDに表示されます。

 次に湿度を表示してみましょう。湿度は気温と同じAir & Weatherのカテゴリ内にある「Get humidity」ブロックを使います。この「Get humidity」ブロックを「Get tempreature」の代わりに「数を表示(0)」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getHumidity())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気温がLEDに表示されます。

 次に気圧を表示してみましょう。気圧は気温や湿度と同じAir & Weatherのカテゴリ内にある「Get pressure」ブロックを使います。この「Get pressure」ブロックを「Get tempreature」もしくは「Get humidity」の代わりに「数を表示(0)」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getPressure())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気温がLEDに表示されます。

明るさを取得する

 次に明るさ(環境光)の値を取得してみます。明るさは全体だけでなく赤、青、緑の3つの色別に取得することもできます。単純にマイクロビットのLEDに数値として明るさを表示しますので、これまでと同様にEnviro:Bitの「Colour & Light」カテゴリの中にある「getLight」ブロックを「数を表示(0)」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getLight())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された明るさがLEDに表示されます。

 次に赤色の明るさを表示してみましょう。「Colour & Light」カテゴリの中にある「getRed」ブロックを「数を表示(0)」ブロックの中に入れます。赤色ではなく青色なら「GetBlue」ブロック、緑色なら「GetGreen」

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getRed())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された気温がLEDに表示されます。

環境音を取得する

 次に環境音の値を取得してみます。環境音に応じて処理することもできます。拍手など大きな音がしたらLEDを点灯させたりすることもできます。
最初にマイクロビットのLEDに数値として環境音を表示しますので、これまでと同様にEnviro:Bitの「Sound」カテゴリの中にある「Get sound」ブロックを「数を表示(0)」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

basic.forever(function () {
    basic.showNumber(envirobit.getSoundLevel())
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。計測された環境音がLEDに表示されます。

 次に大きな音がしたらマイクロビットのLEDに♥マークを表示してみます。音に反応して処理させるには「Sound」カテゴリ内にある「When I hear a clap」ブロックを使います。このブロックの中に大きな音がした時に処理するブロックを入れます。マイクロビットのLEDに♥マークを表示するので「基本」のカテゴリにある「アイコンを表示」ブロックを「When I hear a clap」ブロックの中に入れます。

 これでできあがりです。JavaScriptコードの場合は以下のようになります。

envirobit.onClap(function () {
    basic.showIcon(IconNames.Heart)
})

 プログラムをダウンロードしマイクロビットに転送して動作を確認します。大きな音に反応するとLEDに♥マークが表示されます。反応しない場合は環境センサーの近くで音を出してみてください。

無線で環境センサーのデータを送受信する

 最後に環境センサーで計測した気温をもう1台のマイクロビットに無線で送信して値を表示してみます。受信した気温を表示する側のマイクロビットには液晶モジュールを利用します。LCDモジュールの使い方については最初にも書きましたが、この連載の第23回を参照してください。
 無線を利用するには最初に無線のグループ番号を設定します。ここでは7としました。環境センサー側では無線通信でtempの文字を受信したら気温の数値を送信します。プログラムは以下のようになります。気温のみ処理するようにしていますが、文字列に応じて送信するデータを変えたり追加することもできます。

JavaScriptコードの場合は以下のようになります。

radio.onReceivedString(function (receivedString) {
    if (receivedString == "temp") {
        radio.sendNumber(envirobit.getTemperature())
    }
})
radio.setGroup(7)

 次に気温のデータを表示する側です。データを取得する場合はボタンAを押すようにしています。ボタンAが押されたら無線でtempの文字列を送信します。無線で何かの数値を受信した場合、気温の数値を受信したという解釈にして液晶画面に表示します。また、データを受信したという事を示すためにマイクロビットのLEDにチェックマークを表示しています。このプログラムは以下のようになります。

JavaScriptコードの場合は以下のようになります。

input.onButtonPressed(Button.A, function () {
    radio.sendString("temp")
})
radio.onReceivedNumber(function (receivedNumber) {
    basic.showIcon(IconNames.Yes)
    LCD1IN8.DisNumber(
    32,
    24,
    receivedNumber,
    0
    )
    LCD1IN8.LCD_Display()
})
radio.setGroup(7)
LCD1IN8.LCD_Init()
LCD1IN8.LCD_Clear()

 それぞれのマイクロビットにプログラムを転送して実行します。液晶モジュール側のマイクロビットのボタンAを押すと、しばらくして気温が表示されます。液晶モジュール側の処理速度は速くないのでボタンを連打したりすると正常に動作しなくなる可能性があります。もし、定期的に気温などを表示したいなら10秒間隔にするなど、かなり長くした方がよいでしょう。
 環境センサーを1つだけでなく、複数用意しそれぞれのセンサーからのデータを液晶モジュールに表示してみるのも(お金がかかりますが)面白いかもしれません。

  • (ボタンAを押す前)

    (ボタンAを押す前)

  • (ボタンAを押した後)

    (ボタンAを押した後)

  • (液晶画面のアップ)

    (液晶画面のアップ)

著者 古籏一浩
プログラミングをベースにして面白そうなものはとりあえずやってみるというスタンス。複雑なものよりシンプルで楽しめるものが好み。最近は30年前に移植したゲーム(mz-700版 SPACE HARRIER)の話などを書いたりしています。
著者サイト:http://www.openspc2.org/