このブログを検索

2015-01-24

秋月のHDC1000(温度湿度デジタルセンサー)を動かしてみた

これを秋葉原で見つけたので買ってみた。
もともとVSTONEで間違えて買ったDHT11という温度湿度センサーでちょっと遊んでいたが、単線シリアルのよくわからないインターフェースだし、精度も良くないらしい

その点、HDC1000とやらはTI製なのでなんとなく安心感がある。

最初は自力でコードを書いてみたがまともに動かず、Google先生に聞いてみたところ中国だがサンプルコードを見つけた

このセンサーはI2C接続で、I2Cアドレスが秋月と違う以外はそのまま動いた。値を見る限り、湿度は問題なさそうだが温度は高めに出てる気がする。


//Copy from  http://will-123456.blogspot.jp/2014/12/hdc1000-arduino.html

#include <Wire.h>

#define addr 0x40
uint16_t readingT,readingH;
void setup()
{
  Wire.begin();

  Serial.begin(9600);
  Serial.println("HDC1000 Test");
  sethdc();
}

void loop()
{
  readhdc();
  delay(1000);
}

void sethdc(){

  Wire.beginTransmission(addr);
  Wire.write(0x02);
  Wire.write(0x10);   //14 bit 14bit
  Wire.write(0x00);   //14 bit 14bit
  Wire.endTransmission();
  Wire.beginTransmission(addr);
  Wire.write(0x02);
  Wire.endTransmission();
  Wire.requestFrom(addr, 2);
  if(2 <= Wire.available())   
  {       
    readingT=0;
    readingT = Wire.read(); 
    readingT = readingT << 8;   
    Serial.print(" Config:");
    Serial.println(readingT,BIN);   
  }
  Wire.beginTransmission(addr);
  Wire.write(0xFB);
  Wire.endTransmission();
  Wire.requestFrom(addr, 3);
  if(3 <= Wire.available())   
  {       
    readingT=0;
    readingT = Wire.read(); 
    readingT = readingT << 8;   
    Serial.print(" ID:");
    Serial.print(readingT,BIN);
    Serial.println( Wire.read(),BIN);
  }

}


void readhdc(){
  Wire.beginTransmission(addr);
  Wire.write(0x00);
  Wire.write(0x00); 
  Wire.endTransmission();
  delay(20);

  Wire.requestFrom(addr, 4);
  if(4 <= Wire.available())   
  {       
    readingT=0;
    readingH = 0;
    readingT = (Wire.read()<<8);
    readingT+=Wire.read(); 
    readingH = (Wire.read()<<8);
    readingH+=Wire.read();
    Serial.print(" Temp:");
    Serial.print(readingT);
    Serial.print(" =>");
    Serial.print(readingT/65536.0*165.0-40.0);   
    Serial.print("  RH:");
    Serial.print(readingH);
    Serial.print(" =>");
    Serial.println(readingH/65536.0*100.0); 
  }



}



0 件のコメント: