サーミスタを使って安く温度を測定する

LEDを光らせる「Lチカ」の次に、IoTで電子工作といえば温度を無意味に測る必要があります。

一般的にマイコン内部に組み込まれている温度センサや、インテリジェントな温度センサを使う作例が多いですが、今回は昔ながらのアナログセンサーを使ってみます。


# サーミスタ

サーミスタは温度で抵抗値が変わるセンサーです。
秋月電子だと5個で200円ですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3c0e3d59-f7eb-ec90-84c5-553b28228946.png)
構造が簡単ということもあり、もともとは安いデバイスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/81f72831-321b-46ad-48d3-339333a6e630.png)

残念ながらあまり高温は測れません。


# 動作原理

温度によって抵抗値が変わります。

以下は「IoTピザ窯、または巨大災害レジリエンスで娘に怒られたこと」https://qiita.com/nanbuwks/items/0bb92acf7f7ee075a6b5
より抜粋。

### 計算式

```
R=Ro×e^(B(1/T)-(1/To))
```

- Ro ：基準温度 To における抵抗値
 - ここでは10kΩ  (25℃　・・・298K)
- R		: 測りたい温度 T における抵抗値
- B		： サーミスタの種類による定数
 - ここでは3380 (25〜50℃)

### 抵抗を求めるには ??
以下の回路を使うと5Vの値がRとTHの抵抗の割合で分圧される
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/92fa0eb1-0589-a6c6-91d7-d6d3221caec2.png)


# ESP32 で測る

以下のようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fb420985-f8da-6f73-16d7-fc17e8c06917.png)


空中配線です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f2cd4c8-2acb-510a-a954-3a1d7e4e25b5.png)

ESP32に接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9b6ca901-f4b2-634e-c514-ac147f02a562.png)

氷水に浸して、0℃になるかどうか調べてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/01db813f-543a-bba9-cbba-2073ff588d55.png)


```
2643 2474 2768  8.807373 15.802673 9.355316 
2667 2477 2779  8.141357 15.737732 9.108154 
2651 2473 2774  8.583099 15.823425 9.220245 
2639 2473 2770  8.906250 15.823425 9.310791 
2658 2476 2775  8.388733 15.759796 9.198151 
2673 2475 2777  7.977997 15.780518 9.153107 
2650 2473 2775  8.610992 15.823425 9.198151 
2646 2467 2774  8.722992 15.952789 9.220245 
```

前3つの値が、AnalogRead で読んだ値、右3つが、それから計算した温度です。全然ダメですね

AnalogRead で読んだ値は 0〜4095 の間なので、抵抗値の計算は以下のようにしてみました。

```
  readW = analogRead(34);
  thermistor_r = ( 1000 * readW )/ (4096 - readW );
``` 

これ、取得電圧が `3.3V * ( (AnalogRead値) / 4096 )` となる想定なのですが、AnalogRead は電圧に比例していないので、補正が必要になります。

# 補正
ESP32 で 補正済みの電圧を取得する  ` analogReadMilliVolts ` という命令があります。
これを使って、以下のようにしてみました。

```
  readW = analogReadMilliVolts(34)+5;
  thermistor_r = ( 1000 * readW )/ (3300 - readW );
```

これを元にしたら以下の様に表示されました。

```
2343 2547 2519  1.385925 -0.089691 0.810028 
2346 2548 2516  1.277069 -0.121979 0.905640 
2351 2549 2522  1.100220 -0.154785 0.714417 
2342 2546 2518  1.425659 -0.057312 0.841858 
2340 2546 2518  1.495331 -0.057312 0.841858 
2343 2548 2515  1.385925 -0.121979 0.937042 
2340 2548 2514  1.495331 -0.121979 0.969116 
2353 2548 2519  1.031830 -0.121979 0.810028 
2338 2546 2512  1.565277 -0.057312 1.032196 
2341 2542 2519  1.455475 0.072205 0.810028 
```

前3つの値が、AnalogRead で読んだ値、右3つが、それから計算した温度です。うーん、もうちょっと。


これはセンサー3つのうちのはじめのものが、1k なのですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bd056900-913b-0a03-158d-01c4f0e7ba03.png)
これに3.3Vをかけていると、25℃ だと 電流が1.7mV ぐらい流れます。そのために、サーミスタ自体で発熱が起こってしまします。

なので、このように変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f983269-c513-e90e-a38b-db5d51eb2ee5.png)

測定するときだけ、GPIO25をHigh にして、サーミスタに電圧をかけます。
これだとアイドル時には発熱しないので、より正確な値を取得することができます。


また、GPIOから出力する電圧は正確に3.3Vではないので、GPIO35で電圧を取得して内部で以下のように計算しています。
```
  digitalWrite(25,HIGH);
  readW = analogReadMilliVolts(34)+5;
  readF = analogReadMilliVolts(35)+5;
  digitalWrite(25,LOW);
  thermistor_r = ( 1000 * readW )/ (readF - readA );
```

# 水中での測定

発熱問題について、サーミスタの抵抗値が高ければ発熱を抑えることができてより正確な値を得ることができます。
しかしながらどうしてTH1は 1kという低い抵抗値を使っているのでしょうか? それは TH1 は水没させて水中の
温度を測ろうとしているからです。密封されていますが、水が染み込んだ場合に水の電気伝導で値が狂います。その効果を減らすために水の電気伝導度よりも小さな抵抗値を選択しています。また、水中なら発熱の効果も低くなるだろうということも考えています。

TH2、TH3は水中測定を想定してはいないため、10Kとしています。しかしながらテストでは氷水につけました。そこでやはり電気伝導によりTH2,TH3 が5℃ほど高くなる効果が現れました。そのために不完全ながら裸線にテープを巻いて電気伝導を減らす工夫を追加しています。

# 配線不良

デジタルは少し接触不良だとエラー率が上がるという感じで、トラブルシュートは割と時間がかかります。
しかしながらアナログは出力信号を直接見ながらあちこち叩くという方法が使えて直感的にトラブルシュートができます。

https://twitter.com/nanbuwks/status/1638071138730512384

# アナログは楽しい!

アナログはいろんな要素が絡み合って、ひとつひとつ解きほぐすのが楽しいです。

みなさんもやってみよう!