Mbedオンラインコンパイラでmicro:bitを使う(温度計編)

この記事はMbed Advent Calendar 2017の4日目の記事です。

Mbedオンラインコンパイラでmicro:bitの開発をやってみます。 初めての開発なので、作るのは単純な温度計です。

micro:bitにはLEDアレイが搭載されていて、そこに文字を表示できるようになっています。 なので、温度をLEDアレイに表示するようにしてみました。

f:id:mia_0032:20171205023045g:plain

用意したもの

f:id:mia_0032:20171205020943p:plain

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のコードと異なる点があるので説明していきます。

以上の2つの点が大きな違いです。

MicroBitPinは DigitalInAnalogIn とメソッドが異なるので注意が必要です。だいぶシンプルなメソッドになっている印象を受けました。

PIN_CAPABILITY_ANALOGhttps://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と私」です。