この記事はMbed Advent Calendar 2017の4日目の記事です。
Mbedオンラインコンパイラでmicro:bitの開発をやってみます。 初めての開発なので、作るのは単純な温度計です。
micro:bitにはLEDアレイが搭載されていて、そこに文字を表示できるようになっています。 なので、温度をLEDアレイに表示するようにしてみました。
用意したもの
micro:bit本体とベースボード、温度センサーです。これらを使って作成します。
Grove ShieldとTemperature SensorはP0/P14
のポートに接続しました。
コード
#include "MicroBit.h" MicroBit uBit; const int B = 4275; // B value of the thermistor const int R0 = 100000; // R0 = 100k MicroBitPin P0(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_ANALOG); int main() { uBit.init(); while (1) { wait(1.0); float R = 1024.0 / P0.getAnalogValue() - 1.0; R = R0*R; float temperature = 1.0/(log(R/R0)/B + 1.0/298.15) - 273.15; char fmt[6]; sprintf(fmt, "%02.2fC", temperature); uBit.display.scroll(fmt); } }
通常のMbedのコードと異なる点があるので説明していきます。
- 最初にincludeするものが
mbed.h
ではなくMicroBit.h
になる。 - IOを使うためにはMicroBitPinを使う。
- MicroBitPinの引数となるピンの定数はMessage Bus IDとして定義されているものを使う。
以上の2つの点が大きな違いです。
MicroBitPinは DigitalIn
やAnalogIn
とメソッドが異なるので注意が必要です。だいぶシンプルなメソッドになっている印象を受けました。
PIN_CAPABILITY_ANALOG
はhttps://lancaster-university.github.io/microbit-docs/ubit/io/#microbitpin-int-id-pinname-name-pincapability-capabilityに記載されている定数で、アナログピンとして使用する設定です。
float R = 1024.0 / P0.getAnalogValue() - 1.0; R = R0*R; float temperature = 1.0/(log(R/R0)/B + 1.0/298.15) - 273.15;
のあたりの計算式は Grove - Temperature Sensor V1.2 - Seeed Wiki からのコピペです。
最初コードを書いたときに 1024.0 / P0.getAnalogValue()
の部分を1024 / P0.getAnalogValue()
と書いてしまったがために、割り算の結果がintで丸められてしまい、出力される値が変化しなくなってしまっていました。
そのデバッグに結構時間を使ってしまったので、型には気をつけないといけないですね・・・
感想
コードのデバッグではまってしまったところはあったものの、電子回路の部分は挿すだけで良いので楽に作れます。 ピン定義の部分さえ理解すれば、それ以外のところは理解しやすいAPIになっているように感じました。
明日の記事は toyowataさんの「MAと私」です。