温度と湿度を測定出来る素子、AM2320の説明です。
今回は秋月電子より購入しました。秋月さんのHPにはデータシートも掲載されていてとても便利です。
データシートから
- 温度、湿度の測定が可能。
- 分解能は16ビットで最上位ビットは負号を表す。
- 値の換算は、
- 最上位ビットを除いた15ビットの値を10で割る。
- 最上位ビットが、”1”なら値に−1を掛ける。
- インターフェイスはI2C。
- ユーザーが設定するパラメータは無し
- データの読み出しは
- S TART + (I2C address + W) + function code (0x03) + start address + number of registers + STOP
- この時センサーの応答は
- Function code (0x03) + number + data +CRC
- レジスタアドレス一覧
- 湿度:アドレス 0x00,0x01
- 温度:アドレス 0x02,0x03
- 素子は、 passive modeを使用しており、通信前にこれを解除する必要が有る。
AM2320の通信例として湿度と温度データの読み出しが有りました。
- ホストからAM2320に下記を送る、
- S TART + (I2C address + W) + function code (0x03) + start address(0) + number of registers(4) + STOP
- 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%
これで温度と湿度が測定出来ます。