Arduino + 温度湿度センサHDC1000

バージョン情報
Arduino IDE 1.0.6 ,windows 8.1

I2C接続の低消費電力・高精度14ビット温度湿度センサHDC1000をつかってみた。

材料

HDC1000使用 温湿度センサーモジュール (秋月電子 @\680)
Arduino

回路

回路

ソースコード

シリアル通信で”get”を受信したら、温度と湿度を”23.00,40.00″というフォーマットで返信するプログラムにしてみた。

//温度・湿度測定 HDC1000

#include <Wire.h>

#define addr 0x40 

String str_cmd = "";
 
void setup() {
  Serial.begin(38400);
  Wire.begin();
  HDC1000_ini();
}

void loop() {

  //マスターから受信したら
  if(myReadLine() > 0){
    HDC1000_read();  
  }

}

int myReadLine(void){
  int cnt_buf = 0;
  str_cmd = "";
  char ch;
  
  //受信したら
  if(Serial.available() > 0){
    delay(100);
    cnt_buf = Serial.available();
    for (int iii = 0; iii < cnt_buf; iii++){
      ch = Serial.read();
      str_cmd.concat(ch);
    }
  }
  return cnt_buf;
}


void HDC1000_ini(void){
  delay(100);
  Wire.beginTransmission(addr);
  Wire.write(0x02);   //Configuration address
  Wire.write(0x10);   //MODE=1, 14bit
  Wire.write(0x00);
  Wire.endTransmission();  
}

void HDC1000_read(void){
  unsigned int temp = 0;
  unsigned int humid = 0;
  
  if(str_cmd == "get"){
    delay(100);
    Wire.beginTransmission(addr);
    Wire.write(0x00);   //レジスタ0x00
    Wire.endTransmission();
    delay(50);
  
    Wire.requestFrom(addr, 4);
    if(4 <= Wire.available())   
    {       
      temp = (Wire.read()<<8);
      temp += Wire.read(); 
      humid = (Wire.read()<<8);
      humid += Wire.read();
      Serial.print(temp/65536.0*165.0-40.0);   
      Serial.print(",");
      Serial.println(humid/65536.0*100.0); 
    }
  }
}

HDC1000の取説によるとI2Cで以下の順で応答があるらしい。
1:温度の上位8bit
2:温度の下位8bit
3:湿度の上位8bit
4:湿度の下位8bit

wire.read()では1バイトずつ処理するので符号なし2byte変数を用意しておいて、以下のように上位8bit分を8bitビットシフトしてから下位8bit分を足すという処理を行っている。

temp = (Wire.read()<<8);
temp += Wire.read(); 

温度への変換は以下の式でおこなっている。

temp/65536.0*165.0-40.0

これは以下の関数と等価かな?

map(temp,0.0,65536.0,-40.0,125.0)

動作確認

Arduino IDE のシリアルモニタで確認。
動作確認

Arduino + 温度湿度センサHDC1000」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です