SpresenseでLチカから始める (23) Wireライブラリ 温湿度HDC2080
前回、HDC1080を5Vで動作するSpresenseにつなぎました。HDC1080の動作電圧は3.3/5Vなので、3.3V系のArduinoでもつなげられます。HDC2080の動作電圧は1.8/3.3Vなので、1.8Vで動作させます。Arduino互換の拡張基板は3.3/5Vの信号レベルですが、メイン・ボードの端子は1.8Vの信号レベルです。
●HDC2080のおもなスペック
消費電流は、測定条件が同じではないです。HDC20xxシリーズは、変換速度がHDC10xxにくらべ3桁高速になっているので、新たに設計されたものと思われます。
HDC1000 | HDC1010 | HDC1080 | HDC2080 | |
---|---|---|---|---|
動作電圧[V] | 2.7~5.5 | 2.7~5.5 | 2.7~5.5 | 1.6~3.6 |
消費電流[uA] | 1.2 | 1.3 | 1.2 | 0.55 |
温度[℃]、確度 |
-40~125、±0.2(5~60℃) | -40~125、±0.2(5~60℃) | -40~125、±0.2(5~60℃) | -40~125、±0.2(5~60℃) |
湿度[%]、確度 | 0~100、±1(20~60%) | 0~100、±1(10~70%) | 0~100、±1(10~70%) | 0~100、±2 |
インターフェース I2C(最大転送速度[kHz]) | 400 | 400 | 400 | 400 |
分解能[ビット] | 8(湿度のみ)、11、14 | 8(湿度のみ)、11、14 | 8(湿度のみ)11、14 | 9、11、14 |
ヒータの有無 | あり | あり | あり | あり |
レジスタ | ポインタ | ポインタ | ポインタ | レジスタ |
●接続
HDC2080の搭載したボードは、TIストアで購入した評価用ボードの先端を切り離した部分です。
I2Cと電源以外に、設定温度以上になると知らせたり変換終了を知らせるINT/DRDY端子がありますが、変換時間がHDC10xxのように約7msではなく700usほどと高速なので、利用しません。
I2C信号をSDAとSCL端子につなぎます。このボードのスレーブ・アドレスはI2CScannerで調べると0x40に見つけました。
メイン・ボードの端子配列は、こちらの資料に従いました。
HDC20xxは、HDC10xxとはレジスタの構成が異なります。温度データは0x00のレジスタから、湿度は0x02から読み出します。読み出したデータは、下位バイト、上位バイトの順です。連続しているので4バイトをまとめて読み出すことにします。
Measurement configuration レジスタ(0x0f)はパワーオン・リセット時に0x00です。このレジスタのLSBがMeasurement triggerビットです。0: no action、1: Start measurementなので、1にすることで、測定ができる状態になります。そして、Self-clearing bit when measurement completed とコメントされているので、測定するたびに1に設定します。
温度は下記の式から求めます。HDC10xxと同じです。14ビットのデータが左詰めで入っており、最後の2ビットは0です。
Temperature(℃)= (読み出した16ビットのデータ/2^16) * 165 - 40 = 読み出した16ビットのデータ * 0.00251770019 - 40 |
湿度は下記の式から求めます。
Humidity(%RH)= (読み出した16ビットのデータ/2^16) * 100 = 読み出した16ビットのデータ * 0.0015258789 |
#include <Wire.h>
#define HDC2080Address 0x40
int Stemp;unsigned int SRH;
float temp;float RH;
byte readbuffer[4];
#define TempReg 0x00
#define MeasReg 0x0f
#define StartMeas 0x01
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
Wire.beginTransmission(HDC2080Address);
Wire.write((byte)MeasReg);
Wire.write((byte)StartMeas); //start
Wire.endTransmission();
Wire.beginTransmission(HDC2080Address);
Wire.write((byte)TempReg);
Wire.endTransmission();
Wire.requestFrom(HDC2080Address, 4);
readbuffer[0] = Wire.read();
readbuffer[1] = Wire.read();
readbuffer[2] = Wire.read();
readbuffer[3] = Wire.read();
Stemp = readbuffer[1] << 8 | readbuffer[0];
temp = Stemp * 0.00251770019 - 40;
SRH = readbuffer[3] << 8 | readbuffer[2];
RH = SRH * 0.00152587890;
Serial.println(" temp= "+String(temp,1)+"C");
Serial.println(" RH%= "+String(RH,0));
delay(1000);
}
実行している様子です。センサを手で囲ったときの状態です。SHT31などと同様に湿度は敏感に反応します。