バージョン情報
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 + 温度湿度センサHDC1000」への1件のフィードバック