【Raspberry Pi Pico入門 – 18】サーミスタを使ってみる

Raspberry Pi Pico入門,基本編Arduino,Raspberry Pi Pico

概要

今回はサーミスタを使って周囲の気温を計測してみます。サーミスタとは抵抗の1種で、通常の抵抗よりも温度による抵抗の変化が大きくなるように作られています。この性質を用いることで温度を測定(温度を電気信号に変換)することが出来ます。

温度を測定する方法は他にも熱電対などいくつかあるのですが、サーミスタの一番の特徴は安くて簡単に使えることです。デメリットは誤差が大きいことで、安いものだと1~2℃ズレることもあるのでザックリとした温度を測るときに使うことが多いですね。

実行環境

IDE:Arduino IDE 2.2.1
MCU:Raspberry Pi Pico

サーミスタはスターターキットのものを使います。型式はわかりませんが、おそらく↓これだと思います。

サーミスタ 10KB3435-L30

回路

以下のように配線します。サーミスタには極性は無いので、向きはどちらでも大丈夫です。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

#include <math.h>

/* GPIO設定 */
const int THERMISTOR_PIN = 26;

/* サーミスタのパラメータ */
const float B = 3950.0;
const float R0 = 10000.0;
const float T0 = 25.0;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);
  pinMode(THERMISTOR_PIN, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  float temp = readThermistorTemp(analogRead(THERMISTOR_PIN));
  Serial.print("temp = ");
  Serial.println(temp);

  if (temp > 30.0) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }

  delay(200);
}

float readThermistorTemp(int adc_val) {
  /* ADC値から電圧を計算 */
  float volt = (float)adc_val * 3.3 / 4096.0;
  /* 電圧からサーミスタの抵抗を計算 */
  float r = ((3.3 / volt) - 1.0) * R0;
  /* サーミスタの抵抗から温度を計算 */
  float T_bar = (1.0 / B) * log(r / R0) + (1 / (T0 + 273.15));
  /* 計算結果はケルビン温度の逆数になっているので摂氏に戻す */
  float T = (1.0 / T_bar) - 273.15;

  return T;
}

動作確認

Arduino IDEのシリアルコンソールを開くと温度が0.2秒毎に出力されていると思います。サーミスタを指でつまんで暖めたときに温度が高くなり、30℃以上でRaspberry Pi Pico内蔵のLEDが点灯すれば成功です。

解説

サーミスタの抵抗から温度への換算

サーミスタの抵抗値はある法則に従って変化します。サーミスタには基準となる温度と抵抗値があり、今回のものは25℃の時に10kΩとなり、温度が変わるとB定数という数に従って抵抗値が変化します。

B定数=3950、基準温度=25℃、基準温度での抵抗値=10kΩでのデータ

今回使用しているものは「NTCサーミスタ」と呼ばれるもので、抵抗値Rの式は下のようになります。

$$R=R_0 \exp(B(\frac{1}{T}-\frac{1}{T_0}) \\ T: 現在の温度 \\ T_0: 基準温度 \\ R: サーミスタの抵抗値 \\ R_0: 基準温度での抵抗値 \\ B: B定数$$

このままではプログラムで使いにくいので、抵抗値から温度を計算する式に式変形します。

$$\frac{1}{T}=\frac{1}{B}\ln(\frac{R}{R_0})+\frac{1}{T_0} \\ T: 現在の温度 \\ T_0: 基準温度 \\ R: サーミスタの抵抗値 \\ R_0: 基準温度での抵抗値 \\ B: B定数$$

回路

今回の回路図は以下のようになっています。CdSセルとほぼ同じ回路構成にしており、サーミスタの抵抗値が変わるとSIG電圧が変わるように設計しています。(温度が高くなる → サーミスタの抵抗値が下がる → 電圧が大きくなる)

SIG電圧は3.3Vを分圧した電圧なので、以下の式で表すことが出来ます。

$$SIG = \frac{R_2}{R_1+R_2}*3.3$$

このままではプログラムで使いにくいので、SIG電圧からR2を求める式に式変形します。

$$R_2 = (\frac{SIG}{3.3}-1)R_1$$

SIG電圧はGPIO26のADC機能を使って測定できるので、この式とサーミスタの式を使えばSIG電圧からサーミスタの温度を計算することが出来ます。

コードの解説

今回のプログラムの難所は「log」の計算をするところだと思います。サーミスタの式の「ln」は底がeのlogを略して書いた形です。
Arduinoにはlogを計算する機能がないので、複雑な計算をするためのライブラリを使う必要があります。これが「math.h」です。このライブラリはArduino特有のものではなく、C言語のプログラムでよく使われているライブラリです。

他にも三角関数や指数の計算をするときにもmath.hはよく使います。

実際にプログラミングするときは、計算を1行するごとに想定通りの値になっているかSerial.println()等で確認しながら進めるとバグが避けられます。サーミスタの計算は関数電卓がないと難しいので、↓ここを使うと便利です。