SpresenseでLチカから始める (22) Wireライブラリ 温湿度HDC1080

 テキサス・インスツルメンツのHDC1080は、正しくないかもしれませんが、HDC1000に始まり、HDC1008、HDC1010、HDC1080、HDC2010、HDC2080と変遷しているようです。10xxが3.3/5V用で、20xxが1.8/3.3V用の違いがあり、ほかのスペックは同じようです。
 少し前まで、秋月電子通商ではHDC1000のDIP化ボードが販売されていましたが、検索するとなぜかSHT31が検索結果に出てきます。HDC1000/1008の販売は終了しているようです。

 ここでは、HDC1080を取り上げます。アマゾンで購入しました。次回はHDC2080を取り上げる予定です。これは、TIストアで購入した評価用ボードの先端を切り離して利用します。

HDC1080のおもなスペック

 消費電流は、測定条件が同じではないです。

  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
ヒータの有無  あり  あり あり  あり
レジスタ ポインタ  ポインタ ポインタ レジスタ

接続

 Spresenseを5Vで使います。3.3Vでも動作します。I2C信号をSDAとSCL端子につなぎます。このボードはスレーブ・アドレスはI2CScannerで調べました。0x40に見つけました。

スケッチ

 温度データは0x00のポインタ・レジスタから、湿度は0x01から読み出します。読み出したデータは、上位バイト、下位バイトの順です。
 Configurationレジスタは0x02でパワーオン・リセット時に0x1000になっています。この内容は、ノーマル・オペレーション、ヒータOFF、温度、湿度とも分解能は14ビットです。
 したがって、Configurationレジスタを設定せずに、読み出しだけを行います。

 温度は下記の式から求めます。

   Temperature(℃)= (読み出した16ビットのデータ/2^16) * 165 - 40
            = 読み出した16ビットのデータ * 0.00251770019 - 40

 湿度は下記の式から求めます。

   Humidity(%RH)= (読み出した16ビットのデータ/2^16) * 100
               = 読み出した16ビットのデータ * 0.0015258789
#include <Wire.h>
#define HDC1080Address 0x40
int Stemp;unsigned int SRH;
float temp;float RH;
byte readbuffer[4];
#define Tpointer 0x00
#define RHpointer 0x01

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

void loop() {
Wire.beginTransmission(HDC1080Address);
Wire.write((byte)Tpointer);
Wire.endTransmission();
delay(7);
Wire.requestFrom(HDC1080Address, 2);
readbuffer[0] = Wire.read();
readbuffer[1] = Wire.read();
Stemp = readbuffer[0] << 8 | readbuffer[1];
temp = Stemp * 0.00251770019 - 40;

Wire.beginTransmission(HDC1080Address);
Wire.write((byte)RHpointer);
Wire.endTransmission();
delay(7);
Wire.requestFrom(HDC1080Address, 2);
readbuffer[0] = Wire.read();
readbuffer[1] = Wire.read();
SRH = readbuffer[0] << 8 | readbuffer[1];
RH = SRH * 0.00152587890;
Serial.println(" temp= "+String(temp,1)+"C");
Serial.println(" RH%= "+String(RH,0));
delay(1000);
}

 ポインタ・レジスタを指定した後、14ビットの変換待ち時間約6ms(ここでは7ms)を置いてから読み出します。

 実行結果です。

 データシートのFigure14には、温度と湿度の連続読み出しのI2Cタイムチャートが掲載されています。このタイミングを利用したスケッチです。同じように結果が得られました。

#include <Wire.h>
#define HDC1080Address 0x40
int Stemp;unsigned int SRH;
float temp;float RH;
byte readbuffer[4];
#define Tpointer 0x00

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

void loop() {
Wire.beginTransmission(HDC1080Address);
Wire.write((byte)Tpointer);
Wire.endTransmission();
delay(20);
Wire.requestFrom(HDC1080Address, 4);
readbuffer[0] = Wire.read();
readbuffer[1] = Wire.read();
readbuffer[2] = Wire.read();
readbuffer[3] = Wire.read();
Stemp = readbuffer[0] << 8 | readbuffer[1];
temp = Stemp * 0.00251770019 - 40;
SRH = readbuffer[2] << 8 | readbuffer[3];
RH = SRH * 0.00152587890;
Serial.println(" temp= "+String(temp,1)+"C");
Serial.println(" RH%= "+String(RH,0));
delay(1000);
}

ライブラリを使う

 HDC1080用のライブラリが見つかったのでインストールします。

 サンプルのhdc1080measurementを動かしました。

前へ

7セグLED表示 その9 4文字-HT16K33③

次へ

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