PR

RMEE02に温度計機能を追加する

トランジスタ技術 2022年10・11月号の「E24系列表示付き! Arduino抵抗測定器の製作」のオマケ記事。

装置全体の構成などはトランジスタ技術誌に掲載。

トランジスタ技術 2022年 11 月号

トランジスタ技術 2022年 11 月号

1,440円(11/21 17:35時点)
Amazonの情報を掲載しています

専用基板についてはこちらの記事

追加機能の構想と仕様

ちょっとした改造で温度計にしてみる。必要な部品はサーミスタとスイッチを一つ。元々が抵抗計なので、被測定抵抗としてサーミスタを使い、その値を測定する。あとは、その測定値(抵抗値)を温度に変換するだけ。スイッチは抵抗計と温度計の切替え(および、温度表示のリセット)。

表示部(LCD)が広いので、現在の温度だけでなく、最低値と最高値も表示させる。

上の写真が完成形。右に見えるのがサーミスタ。画面上段が現在の温度で、下段が起動してからの最低温度と最高温度。

回路(ハードウェア改造)

スイッチはArduinoの空き端子を使う。RMEE02では六つの空き端子を用意している(0、1、2、A1、A2、A3)。どれでもいいのだけど、ここでは「0」を使うことにする。この端子にスイッチ(タクトスイッチ)をつなげる。スイッチのもう一方はGNDにつなぐ。

上の写真のように、ユニバーサルスペースを使ってタクトスイッチを取り付ける。上に書いたとおり、スイッチは0とGNDに接続する(配線は基板裏)。

ハードウェアの改造はこれだけ。普通に考えればスイッチにプルアップ抵抗が必要なように思うが、ATmega328Pではポートを内部でプルアップする機構があるのでそれを使う(ソフトウェアで設定)。また、チャタリングが問題になるようなものでもないので、そうした回路も省略。

測定用のサーミスタの接続は元々ある抵抗の測定端子を使えばよい。バナナ端子につなぐようにするのが実用的だと思う。サーミスタは10kΩのNXFT15XH103FA2B050を使用する(秋月電子扱い)。

ソフトウェア

ソフトウェアで追加する主な機能は三つ。

  1. モード切替え(抵抗測定モード/温度測定モード)
  2. 抵抗値→温度変換(および、表示)
  3. 最低値・最高値保持とリセット

モード切替え

起動時にスイッチを付けたポート(0)の状態を読み取り、どちらのモードで動作するかを決定する。

  • High: 抵抗計
  • Low(スイッチを押した状態): 温度計

ポートの定義の際、上述のとおり、内部プルアップを指定する。

なお、モードを変更するにはArduinoのリセットから行う(動作中に切り替える必要はないでしょう)。

抵抗値→温度変換

サーミスタの抵抗値と温度の関係は下の式で表される。

\(R=R_0 \times \exp{(B \times (\frac{1}{T}-\frac{1}{T_0}))}\)

ここで、Rはサーミスタの抵抗値、Tがそのときの温度(絶対温度)、R0は温度T0におけるサーミスタの抵抗値、BはサーミスタのB定数。

この式をTについて解けば、サーミスタの抵抗値から温度が計算できる(下のとおり)。

\( \log{\frac{R}{R_0}}=B \times (\frac{1}{T}-\frac{1}{T_0}) \\ \frac{1}{T}-\frac{1}{T_0}=\frac{\log{\frac{R}{R_0}}}{B} \\ \frac{1}{T}=\frac{\log{\frac{R}{R_0}}}{B}+\frac{1}{T_0} \\ T=1/(\frac{\log{\frac{R}{R_0}}}{B}+\frac{1}{T_0}) \)

どのみち計算機に計算させるので、面倒なことは考えずに単純に解いた。なお、温度は絶対温度なので、セ氏温度で扱うには273.15度の補正を行う。

サーミスタNXFT15XH103FA2B050の仕様は以下の通り。

  • R0: 10kΩ±1%(25℃)
  • B: 3380±1%(25~50℃)

Bの値は上記の温度範囲超えると変る(言い換えれば、25~50℃の範囲以外は精度が落ちる)。

最低値・最高値保持とリセット

最高値と最低値は静的変数を用いれば問題ない。測定値がそれまでの値を更新したら、その変数を書き換える。

最高値と最低値のリセットは、追加したスイッチ(モード設定と同じスイッチ)で行う。温度計測のタイミングでスイッチをチェックし、Lowならリセットする。したがって、温度測定のタイミング(概ね1秒ごと)までスイッチを押し続けないとリセットされない。割り込みを使って実現すれば即座にリセットできるけれど、そこまでは必要ないだろうとの判断(シンプルさ優先)。

ソースコード

以上の機能を組み込んだソースコード(Arduinoスケッチ)は下のリンク先。

少しだけ説明しておく。

  • サーミスタのB定数やピン定義などをヘッダ部に追加
  • 測定モードの判定をsetup()に追加
  • loop()では測定モードに従って抵抗/温度のどちらかの測定を実行
  • 温度測定はmeasure_temperature()
    • 最低値・最高値の処理(更新)
    • 最低値・最高値のリセット処理
    • サーミスタの抵抗値を測定
    • その抵抗値を温度に変換し、表示

使い方

  • 抵抗測定
    電源をつなぐと起動し、そのまま放置すれば抵抗測定モード(これまで通り)。
  • 温度測定
    起動後、電圧表示をしている間にモードスイッチ(今回追加したスイッチ)を押す(電圧表示を終えた時点でスイッチの状態を判断するので、それまで押し続ける)。
    最低値・最高値をリセットするには、モードスイッチを押し続ける(温度表示更新のタイミングでスイッチの状態を判定する)。
  • モード切替え
    Arduinoをリセットし、モードスイッチを適宜操作する。

以上。

ケース付きの一体型はこちら

コメント