青ポスの部屋

旅と技術とポエムのブログ

ATOM Matrix (3) 温度センサの値を読む

GPIOを扱う練習として、GROVE温度センサの値を読んでみます。

www.switch-science.com

本当は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番のみなようです。

ATOM MatrixのセンサとIO - Qiita

サンプルコード

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;
}

参考サイト

rikoubou.hatenablog.com

github.com