GPIOを扱う練習として、GROVE温度センサの値を読んでみます。
本当はM5シリーズ謹製の環境センサがよかったのですが、ディスコンで入手不可ということでこれにしました。まさか買うときにこんなどつぼにはまるとはつゆしらず...。
はまったポイント
ESP32シリーズのanalogRead
analogReadはArduino言語に用意されている、アナログセンサの値を読み取る関数です。本家Arduino Unoでは0~1024の値をとります。
ところがESP32では0~4096になっています。つまり同じセンサでも4096/1024=4倍大きい値が出てきます。そのためseeedの公式サンプルを使うとNaNが出力されます(logの中がマイナスになる)。
電圧
電源端子には5Vと3.3Vがあります。不勉強なのでよくわからないのですが、5Vでは正しい値を得られませんでした。3.3Vの端子に差すと正しい値が得られました。GROVE端子は5Vなので、GROVEケーブルでつなぐと正しい値を得られません。
アナログ入力できるピン
アナログ入力できるのは25番と33番のみなようです。
サンプルコード
githubにもあげています。
// for GROVE temperature sensor v1.2 // https://wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/ #include "M5Atom.h" const int pin_temperature = 25; const int B = 4275; const int R0 = 100000; float read_temperature(int pin_number); void setup() { M5.begin(true, false, true); Serial.print("\nhello\n"); } void loop() { float temperture = read_temperature(pin_temperature); for (uint32_t i = 0; i < 25; i++) { M5.dis.drawpix(i, 0xf00000); delay(25); } // delay(500); for (uint32_t i = 0; i < 25; i++) { M5.dis.drawpix(i, 0x000000); delay(25); } // delay(500); } float read_temperature(int pin_number){ int raw_temperature = analogRead(pin_number); float R = 1023.0 / (raw_temperature/4.0) -1.0; float temperature = 1.0 / (log(R)/ B + 1 / 298.15) - 275.15; Serial.println(temperature); return temperature; }