温度センサー
温度センサーは、温度を測定するために使用される入力デバイスです。家庭内のさまざまな場所で見つけることができ、たとえば暖房や冷房システムを制御するサーモスタットなどに使われています。多くの温度センサーはディスプレイ付きのデバイスに内蔵されているため、温度の読み取り値を直接確認できます。
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
ここで表示される温度は、正確な室温ではありません。先ほど述べたように、このセンサーが測定しているのは周囲の空気ではなく、チップ内部の温度です。そのため、より正確な室温を得たい場合は、自分で校正する必要があります。つまり、さまざまな環境でテストし、実際の温度計と比較し、その結果に基づいてコード内の値を調整する必要があります。
より正確な温度の読み取り値が必要であれば、外部センサーを購入して使用することもできます。それらの使い方は、今後の章で見ていきます。