前回はフォトレジスターを使って周辺の明るさに応じてLEDの光量をコントロールしてみました。
今回はサーミスタを使用して温度を測定してみたいと思います。
サーミスタとは?
サーミスタは温度によって抵抗値が変化する電子部品です。温度変化を感知するとサーミスタの抵抗値が変化するため、この特性を利用して温度を検出することができます。今回の用途とは違いますが、突入電流防止回路として使用されることもあります。(電流OFF時は冷えているので抵抗が大きく、電流が流れると温度が上がり抵抗が下がる、という特性を利用しています)
以下にサーミスタと、その回路図記号を示します。
サーミスタの抵抗値と温度の関係は、一般的に以下の式で表されます。
- Rt: 温度 T2 におけるサーミスタの抵抗値
- R: 基準温度 T1 におけるサーミスタの公称抵抗値
- EXP[n]: e (自然対数の底) の n 乗
- B: サーミスタ固有の熱定数
- T2: 絶対温度 (K) ケルビン温度 = 273.15 + セ氏温度
- T1: 基準温度 (K)
この式は、指数関数的な関係を表しており、温度が上昇するにつれてサーミスタの抵抗値は指数関数的に変化します。
今回使用するサーミスタは以下の特性です。
- B = 3950
- R = 10k (10,000Ω)
- T1 = 25°C (298.15 K)
サーミスタの接続はフォトレジスターの時と似ています。
サーミスタの抵抗値と温度の関係式を用いて、AD変換器で測定したサーミスタ両端の電圧から温度を算出することができます。
手順
- サーミスタ両端の電圧を測定: AD変換器を用いて、サーミスタ両端の電圧を測定します。
- サーミスタの抵抗値を算出: 分圧の法則を用いて、サーミスタの抵抗値を算出します。
- 温度を算出: サーミスタの抵抗値と温度の関係式を用いて、温度を算出します。
式
分圧の法則を用いて、サーミスタの抵抗値を算出する式は以下の通りです。
分圧の法則を用いて、サーミスタの抵抗値を算出する式は以下の通りです。
Rt = (Vout / Vin) * R2
- Vout: AD変換器で測定したサーミスタ両端の電圧
- Vin: 電源電圧
- R2: 直列に接続された抵抗器の抵抗値
上記の式を組み合わせることで、温度を算出する式は以下の通りになります。
T2 = 1 / (B * log(Rt / R) + 1/T1)
例
以下に、例を示します。
- サーミスタ: B = 3950, R = 10kΩ, T0 = 25°C (298.15 K)
- 電源電圧: 3.3V
- R2: 10kΩ
- Vout: 2.5V
上記の値を式に代入すると、以下のようになります。
Rt = (2.5 V / 3.3 V) * 10 kΩ ≈ 7.57 kΩ
T = 1 / (B * log(7.57 kΩ / 10 kΩ) + 1/T0) ≈ 30.2°C
回路図
接続図
コード
/**********************************************************************
Filename : Thermomter
Description : Making a thermometer by thermistor.
Auther : www.freenove.com
Modification: 2022/10/21
**********************************************************************/
#define PIN_ANALOG_IN 1
void setup() {
Serial.begin(115200);
}
void loop() {
int adcValue = analogRead(PIN_ANALOG_IN); //read ADC pin
double voltage = (float)adcValue / 4095.0 * 3.3; // calculate voltage
double Rt = 10 * voltage / (3.3 - voltage); //calculate resistance value of thermistor
double tempK = 1 / (1 / (273.15 + 25) + log(Rt / 10) / 3950.0); //calculate temperature (Kelvin)
double tempC = tempK - 273.15; //calculate temperature (Celsius)
Serial.printf("ADC value : %d,\tVoltage : %.2fV, \tTemperature : %.2fC\n", adcValue, voltage, tempC);
delay(1000);
}
今回はプログラミングというよりも工学的な内容でしたね。
温度が測れると、室温に応じてエアコンを入れるなどのスマートホームプログラムが作れるようになりますね!
次回はジョイスティックの値を読み取ってみましょう。
コメント