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を動かしました。