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などと同様に湿度は敏感に反応します。

前へ

ESP32入門 通信機能が標準搭載されたマイコン・ボード (2) Arduino IDEでLチカ(LED点滅)プログラムを作る

次へ

SpresenseでLチカから始める (24) Wireライブラリ 温度気圧BMP280