ESP32でオンラインデータロガーを作る ①Thermistorから温度の取得
Arduinoを少し前に触っていてすっかりご無沙汰だったが最近はめちゃくちゃ安いのにwifiでオンラインになるESP32というのが出てるっ知って俄然またやる気が出てきたのでポチってみた。
暫く経つと忘れるので、備忘録として残しておく。
手始めに温度ロガーを作る。取り急ぎ手元にThermistorしか無かったので、勉強も兼ねてここから温度を取得してみることにした。 Thermistorの理論や配線は以下のサイトを参照。
ESP32 - Light, Temperature, OLED! » Thoughts and stuff
10kΩの参照抵抗を付けるが、上流に着けても下流に付けても大丈夫みたい。ただ、サーミスタの抵抗値(R1)を算出する式が変わると思う。
以下がちょっと詰まった点
計算結果がおかしい
係数に値を代入する時に小数点以下を入力しなかったのが原因。最悪有効数字一桁になってdouble型でも計算が狂った。これはちゃんと勉強した人なら当たり前なことなのだろうが・・・。計算式が間違っているのかと思って時間を浪費した。
測定電圧が変・・・
入力端子をGPIO=1か0を指定したら明らかに値が変だった。どうも他用途に使われてる端子らしい。GPIO34を入力端子にしたところ解決。他にも幾つか予約済みの端子があるみたいなのでちょっと注意したいところ。ちなみにESP32は作ってるメーカやバージョンで少しピン番号も変わってるみたいなので回路図が鵜呑みにできない。
電圧3.30V, 分解能は12 bit
Arduinoは通常10 bit?,殆どの解説ブログには電圧値を求めるときにシグナルを1024で割るように書いているが、ESP32は12 bitらしいので4095で割らないといけない。また、通常使う電圧も5Vじゃなくて3.3Vの方を基本使うらしいので式が以下の様になる(端子的には5Vもあるみたいだけど・・・)。解像度が上がってるのでデータの分解能が良かった。
thermVal=analogRead(34); Vout=thermVal*3.3000/4095.000; //ESP
一応ちゃんと動いたコード(基本借文ですが)。マジで小数点以下の取り扱いが分からなかったので一先ず余剰にゼロを・・・。
#include<math.h> double Vout;//出力電圧 double R1;//サーミスタ抵抗値[kΩ] double B=4000.000; //補正係数β double T; //サーミスタ温度 (これを求める) double R0=10.000; //参照抵抗[kΩ]小数点以下まで指定 double R25=10.000; //25°Cの時の抵抗 void setup() { Serial.begin(115200); pinMode(34, INPUT); //GPIO34を入力端子 } void loop() { double thermVal; //read thermistor value thermVal=analogRead(34);//シグナル値取得 Vout=thermVal*3.3000/4095.000; //ESP32Ver.電圧に変換 R1=(3.3000/Vout-1)*R0; //サーミスタの電圧を求める I=V/R double R=R1/R25; T=1/(1/B*log(R)+1/298.1500);//温度を計算 T=T-273.15;//ケルビンからセルシウス度 //以下出力 Serial.print("Thermistor reading: "); Serial.println(thermVal); Serial.print("Vout: "); Serial.println(Vout); Serial.print("R1: "); Serial.println(R1); Serial.print("T: "); Serial.println(T, 5); Serial.print("B: "); Serial.println(B); Serial.print("R: "); Serial.println(R); delay(2000) ;//2秒休み }