バージョン情報
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件のフィードバック