M5Stack BASIC V2.7で温度センサの動作テスト

2025.3.8 Coskx Lab  

1 はじめに

M5Stack BASIC V2.7に温度センサADT7410(Analog Devices)を接続して温度を測定します。

ADT7410は,温度センサで温度を測定し,M5StackにはI2Cでデータを転送します。
ADT7410を基板上に取り付けた製品は多数ありますが,ここでは秋月電子で販売されているAE-ADT7410を使用します。
データシートによると0.5度の確度で温度を測定しています。

2 使用環境

3 接続

マニュアルのピンアサインを見てそのままつなげるだけです。
注意 AE-ADT7410説明書には「2.7~5.5V 入力」と書いてありますが,これは3.3Vのシステムでも5Vのシステムでも使えます(2.7~5.5Vのシステム)ということを表しています。
AE-ADT7410の電源に3.3Vを与えると3.3VでI2C通信し,5Vを与えると5VでI2C通信します。
M5Stackで使うとき,M5Stackの信号レベルは3.3Vであるため,3.3Vで通信したいのでAE-ADT7410の電源には3.3Vを与えます。
信号レベルが5Vのマイコンにつなげるときは,5Vで通信したいので5Vを与えます。




参考 M5Stackの裏側に書いてあるピンの名称

注意 SDA,SCLはI2C用に用途の定まったピンなので,他のピンを利用することはできません。


実際の様子です。

4 テストプログラム

http://independence-sys.net/main/?p=2912
を参考にさせていただきました。

単純なI2C通信です。AE-ADT7410のアドレスに2バイト送信要求して,2バイトを読み込みます。
2バイトの温度データは上位バイト下位バイトの順に受信します。
デフォルト設定においては,データは2バイトの左詰め上位13bitが有効で2の補数表現です。0.0625度単位の値を受け取っているため,受け取った値を16で割ると温度を摂氏度に変換できます。
(Web上に公開されている多くのサンプルプログラムは,受け取った16ビットデータを符号なし16bit変数に代入して3ビット論理シフトして符号ビットを見ながら符号を調整しているようですが,最初から符号付き16bit変数に代入して3ビット算術シフトするのが普通と思います。)

  温度センサ動作テスト用プログラム本体

//TemperatureSensor_ADT7410Test.ino//

#include <M5Stack.h>
#include <Wire.h>

const int ADT7410I2CAddress = 0x48;
const int SDApin = 21; //SDAピン番号
const int SCLpin = 22; //SCLピン番号

void setup(void) {
  M5.begin();
  M5.Power.begin();

  Wire.begin(SDApin,SCLpin); //I2C通信の初期化,SDA,SCLのピンを設定
  M5.Lcd.setTextSize(2);
  M5.Lcd.print("Temp Sensor Test");
}

double getTemperature(){
  int16_t temperature16;
  double temperature;
  Wire.requestFrom(ADT7410I2CAddress, 2);      //2バイト要求
  temperature16 = (int16_t)Wire.read() << 8;   // 上位バイト読み出し
  temperature16 |= (int16_t)Wire.read();       // 下位バイト読み出し
  temperature16 >>= 3;                         // 算術シフトで13bit化
  temperature = (double)temperature16 / 16.0;  // 温度換算(摂氏)
  return temperature;
}

void loop(void) {
  M5.update();
  double temperature;

  temperature = getTemperature();
  M5.Lcd.setCursor(0, 20);
  M5.Lcd.printf("Temperature = %.2f\n",temperature);

  delay(1000); //[msec]
}

5 まとめ

M5Stack Basic V2.7にて温度測定が測定ができました。
I2Cで2バイトのデータ転送だけなので,通信部分は簡単でした。