Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

温度センサー

温度センサーは、温度を測定するために使用される入力デバイスです。家庭内のさまざまな場所で見つけることができ、たとえば暖房や冷房システムを制御するサーモスタットなどに使われています。多くの温度センサーはディスプレイ付きのデバイスに内蔵されているため、温度の読み取り値を直接確認できます。

micro:bit には、nRF52 プロセッサの内部に温度センサーが含まれています。これはチップの内部温度を測定するもので、周囲の気温のおおよその値を知ることができます。

注: この読み取り値はチップの内部温度を反映するものであり、周囲の気温を直接測定したものではありません。ただし、周囲の温度のおおよその目安にはなります。

このセンサーの精度はおよそ +/-5°C(未校正)で、-40°C から 105°C の範囲の温度を検知できます。

テンプレートからプロジェクトを作成

今回も Embassy を使いますが、今回は BSP なしで進めます。代わりに、embassy-nrf HAL を直接使って作業します。

cargo generate --git https://github.com/ImplFerris/mb2-template.git --rev 3d07b56
  • プロジェクト名を尋ねられたら、"temperature" のような名前を入力します。

  • async を使うかどうかを尋ねられたら、"true" を選択します。

  • "BSP" と "HAL" のどちらを使うかを選ぶよう求められたら、"HAL" を選択します。

コード全体

今回は、いきなり完全なコード例から始めます。理由は単純で、ここで関わる概念は、先に説明しようとするとかなりの理論が必要になるからです。そこで、まずはコードを実行してから、それを一歩ずつ分解して見ていきます。

この例では、embassy-nrf HAL が公開している "TEMP" ペリフェラル(温度センサー)を使います。HAL は "Temp" という struct も提供しており、これを使って温度ハードウェアを操作できます。

ただし、もう 1 つ必要なものがあります。それは Interrupt Request Handler と呼ばれるものの設定です。はい、これはまだ説明していない新しい概念です。割り込みハンドラの経験があるなら素晴らしいことです。もしなくても心配いりません。これが何を意味し、どのように動くのかを詳しく見ていきます。

#![no_std]
#![no_main]

use defmt::info;
use embassy_executor::Spawner;
use embassy_time::Timer;
use {defmt_rtt as _, panic_probe as _};

use embassy_nrf::{
    bind_interrupts,
    temp::{self, Temp},
};

bind_interrupts!(struct Irqs {
    TEMP => temp::InterruptHandler;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) -> ! {
    let p = embassy_nrf::init(Default::default());
    let mut temp = Temp::new(p.TEMP, Irqs);

    loop {
        let value = temp.read().await;
        info!("temperature: {}℃", value.to_num::<u16>());
        Timer::after_secs(1).await;
    }
}

ループの中では、温度を読み取り、それを defmt の "info!" マクロを使って表示しているだけです。これを micro:bit に書き込むと、温度の読み取り値がコンピューターのコンソールに表示され始めます。なかなかすごいですよね? これはこれまであまり活用してこなかったことです。でもその通りで、ボード上でプログラムを実行しながら、コンピューターでライブログを見ることがちゃんとできるのです!

既存のプロジェクトをクローンする

私が作成したプロジェクトをクローン(または参照)して、hal-embassy/temperature フォルダーへ移動することもできます。

git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/hal-embassy/temperature

実行

プログラムを micro:bit に書き込むと、ログがコンピューターに表示されるはずです。

cargo run

ここで表示される温度は、正確な室温ではありません。先ほど述べたように、このセンサーが測定しているのは周囲の空気ではなく、チップ内部の温度です。そのため、より正確な室温を得たい場合は、自分で校正する必要があります。つまり、さまざまな環境でテストし、実際の温度計と比較し、その結果に基づいてコード内の値を調整する必要があります。

より正確な温度の読み取り値が必要であれば、外部センサーを購入して使用することもできます。それらの使い方は、今後の章で見ていきます。