(2020.2.23 作成)
このページでは安価なTI製湿度センサHDC1080について紹介しようと思います。
本記事執筆時点ではAliexpressでおよそ200円で購入することができます。日本のAmazonさんだと400円ぐらいですね。
この基板はGY-213VというらしくHDC1080以外にも別のセンサを搭載したバージョンがあります。
このセンサの裏側を見ると対応しているセンサが一覧になっています。
ただ温度や湿度の計測精度を調べると以下の表ようになっていますのでHDC1080を選択するのが最も良いと思います。
さて、このセンサHDC1080の使い方すが、最初はI2Cだから簡単に使えるかなと思っていたのですが、以外に苦労したのでその点について書きたいと思います。
一般的なI2CでのデータのRead方法ですが、
(start)->(addr+write)->(pointer)->(start)->(addr+read)->(data)->(stop)
になると思います。ここでaddrはHDC1080のデバイスアドレス(0x40)で、pointerはレジスタのアドレス(0x00)です。
しかしHDC1080ではpointer送信が計測開始のトリガになっており、その後計測が終了するまでアドレスを送っても返事をしてくれません。このため上記のpointer送信から start送信まで待つ必要があります。
また待ち時間ですが、仕様書には6.5msと書いてあるのですが、実際には温度、湿度に対してそれぞれ6.5ms待つ必要があるので合計13ms待つ必要があります。
ということでデータの読み方ですが、
(start)->(addr+write)->(stop)->(13ms wait)->(start)->(add+read)->(data)->(stop)
というシーケンスになります。
この計測データ読み込みがちょっとイレギュラーなので苦労しましたが、他のレジスタアクセスについては通常のIC通りなので簡単に動かせます。
このようにして無事HDC1080からデータを読むことができるようになりました。下写真の左がSTM32F103C8T6基板を使用して動かした際の実際の写真です。I2Cのプルアップを行うために抵抗を2つ使用したのですが、あとで考えると基板上に抵抗が実装されているので不要でした。
右の写真がセンサ上に指を置いてみたときの挙動です。指を置くことで温度と湿度が上がってゆくことが分かります。このソースコードはこのページの一番下に記載しています。グラフ化はSTM studioを使用しました。
このセンサにはヒーターが設置されています。湿度が高い環境に置いておくと吸湿して正しい値が表示されなくなるので適宜ヒーターで温めて除湿にする必要があります。あまり使用していないので実施する頻度はよくわかりません。。。
右のグラフがヒーターをOnした結果です。温度が上がって湿度が下がっています。ヒーターは数十秒Onにしてないといけない感じですね。
このページで使用しているHDC1080クラスは以下からダウンロードしていただけます。
<Download>
またこのクラスを使用した以下のサンプルコードを実行するために必要なファイル類は共通ライブラリからダウンロードしていただけます。
#include "DKS_Common_F103xB.h" #include "DKS_F103C8T6.h" #include "DKS_I2C_F103xB.h" #include "DKS_HDC1080.h" DKS::STM32F103C8T6 board(DKS::BlackPill); DKS::I2C::I2C i2c; DKS::Hygrometer::HDC1080 hdc; float humi, temp; int main(void) { DKS::InitSystem(); board.Init(); i2c.Init(I2C1, 0, 0); // SCL:PB6, SDA:PB7 hdc.Init(&i2c); DKS::Delay(10); uint16_t humiU, tempU; for (;;) { hdc.Get(humiU, tempU); hdc.Convert2float(humiU, tempU, humi, temp); }; }
いかがでしょうか?計測データの取得は結構面倒だったのですが、無事動くようになりました。指を近づけるだけでも湿度が上がって面白いですね。ちょっとした近接センサになるかも。