AM2320(温湿度測定器)(for Arduino)

温度と湿度を測定出来る素子、AM2320の説明です。

今回は秋月電子より購入しました。秋月さんのHPにはデータシートも掲載されていてとても便利です。

データシートから

  1. 温度、湿度の測定が可能。
  2. 分解能は16ビットで最上位ビットは負号を表す。
  3. 値の換算は、
    • 最上位ビットを除いた15ビットの値を10で割る。
    • 最上位ビットが、”1”なら値に−1を掛ける。
  4. インターフェイスはI2C。
  5. ユーザーが設定するパラメータは無し
  6. データの読み出しは
    • S TART + (I2C address + W) + function code (0x03) + start address + number of registers + STOP
  7. この時センサーの応答は
    • Function code (0x03) + number + data +CRC
  8. レジスタアドレス一覧
    • 湿度:アドレス 0x00,0x01
    • 温度:アドレス 0x02,0x03
  1. 素子は、 passive modeを使用しており、通信前にこれを解除する必要が有る。

AM2320の通信例として湿度と温度データの読み出しが有りました。

  1. ホストからAM2320に下記を送る、
    • S TART + (I2C address + W) + function code (0x03) + start address(0) + number of registers(4) + STOP
  2. AM2320からの返答
    • Function code (0x03) + number + data +CRC

ホスト側から4バイトのデータを要求していますが、AM2320からは4バイトのデータの前に、Function code (0x03) と number、各1バイト。計2バイト。データの後にCRC(2バイト)が追加される様です。ちなみにAM2320からの返答データの詳細は

  • Function code:ホストが送ったFunction code。
  • number:   ホストが要求したバイト数
  • data:      ホストが要求したデータ
  • CRC:    チェックサム。データが正しく転送されたか検証に使う。

つまり、ホスト要求、”4バイト”に対し

  • 最初の2バイトは、ホスト要求のオーム返し。
  • 次にホスト要求のデータ、”4バイト”
  • 最後はチェックサムの2バイト
  • 合計で”8バイト”送信して来る。

この素子は通信を開始する前に”passive mode”を解除する必要が有ります。過解除方法ですが、一度素子にアクセス(アドレスを投げる)すれば良い様です。

アドレスも曲者でした。動作の検証にArduinoを使っているのですが、資料に0xB8に固定と有るのでそのアドレスを使用した所、全く動きませんでした。I2Cのアドレスは7ビット。これを上位の7ビットで表すか、下位7ビットで表す場合がある為、上位7ビットと判断し、右に1ビットシフトして下位7ビットの0x5Cとしたら動きました。Arduinoではアドレスは0x5Cとなります。

最後に温度と湿度を読み出すスケッチを示します。(Arduino版)


#include <Wire.h>
#define ADR 0x5c

void setup() {
  Wire.begin();            
  Serial.begin(115200);
}

void loop() {
 float hu,tp;
 uint8_t data[8];
 int flg;

  Wire.beginTransmission(ADR);
  Wire.write(0x03);         
  Wire.write(0x00);         
  Wire.write(0x04);            
  Wire.endTransmission();
  delay(10);

  Wire.requestFrom(ADR,8); 
  if (Wire.available() >= 8) {
    for (uint8_t i=0; i<8; i++) {
      data[i] = Wire.read();
    }

    hu = ((float)(data[2]*256+data[3]))/10;
     
    flg = 1;
    if(data[4] & 0x80) flg = -1;
    data[4] &= 0x7f;
    tp = ((float)(data[4]*256+data[5]))/10 * flg; 
    
    Serial.print("T=" + String(tp) + "c ");
    Serial.println("H=" + String(hu) + "%");
  }
  delay(1000);
}
  • 13から14行:ここでAM2320の”passive mode”解除
  • 16から20行:AM2320にアドレス0からの4バイトを要求
  • 22から26行:要求が4バイトですが、前後の2バイトを合わせて合計8バイト読み込む
  • 28行:湿度の計算
  • 30行:温度の計算

使用したESP32は36ピンのモジュールでAM2320とは下記の様に接続しています。

コンパイルして実行するとシリアルモニタに下記が表示されます。


T=23.30c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.90%
T=23.40c H=33.90%
T=23.40c H=33.90%
T=23.40c H=33.80%
T=23.40c H=33.80%
T=23.40c H=33.80%

これで温度と湿度が測定出来ます。