HIH-6130 湿度センサー を使う

HIH-6130

スイッチサイエンスさんからRaspberry Piに使うi2c湿度センサーHIH-6130を購入してみました。このセンサーの主目的は湿度を測ることですが、オプション機能として温度も測れます。

このセンサーの回路図を見るとSDAとSCLが抵抗でプルアップされていますが、Raspberry Piでは既にプルアップされている為、この抵抗は必要無いはずだけど付いていて大丈夫なのだろうか?まぁ、無事に動いているようなので良しとしますが。

それでは、Raspberry Piとセンサーを接続してみましょう。今回はブレッドボード上で次のように配線しました。センサー側のAL_HとAL_Lは上限と下限の検出アラーム機能用なので今回は使いませんでした。アラーム機能を使うためには、コマンド・モードで上限と下限を設定してやる必要があります。

HIH-6130 connect
センサーを繋いだら、早速確認してみましょう。このセンサーのアドレスは0x27です。

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Arduinoのサンプルスケッチ以外は資料が乏しく、初めてのi2cとPythonのプログラミングで苦労しました。センサーから4 byteのデータを受信する方法がわからなかったのですが、read_i2c_block_data関数で問題が解決出来ました。

4byteのデータを受信するとステータスがわかり、0は最新データで、1が古い使い回しているデータ、3がコマンドモード、4が診断中とわかるので、ステータスが0か1ならリスト形式で[ステータス, 湿度, 温度]を返します。それ以外は[ステータス, 0.0, 0.0]を返します。

# coding: utf-8
import smbus
import time

# My Raspberry Pi is Revision 2
i2c = smbus.SMBus(1)

# ==============================================
# =   HIH-6130 Humidity/Temperrature Sensors   =
# =   for Measurement Data Fetch Mode          =
# ==============================================
def hih6130():
    # get 4 bytes
    buf = i2c.read_i2c_block_data(0x27, 0, 4)

    # get status
    sta = buf[0] >> 6 & 0x03

    # command mode or diagnostic mode are zero
    if sta >= 2:
            return [sta, 0.0, 0.0]

    # get digital output
    hum = (buf[0] & 0x3F) * 256 + buf[1]
    tem = buf[2] * 64 + (buf[3] >> 2)

    # convert digital output
    hum = round(hum / 16383.0 * 100, 1)
    tem = round(tem / 16383.0 * 165 - 40, 1)
    return [sta, hum, tem]

# print out Humidity and Temperrature
while True:
    print hih6130()
    time.sleep(1)

実行してみると、1秒ごとにステータスと共に湿度と温度を知らせてくれます。吐息をかけてみると湿度が上下に動くのがわかります。適当なところでキーボードからCTRL+Cで止めて下さい。

$ python test.py
[1, 43.2, 21.2]
[1, 42.9, 21.7]
[1, 42.9, 21.7]
[1, 42.9, 21.7]
[1, 42.9, 21.7]
^CTraceback (most recent call last):
  File "test.py", line 35, in <module>
    time.sleep(1)
KeyboardInterrupt

コメントを残す

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

“HIH-6130 湿度センサー を使う” に9件のコメントがあります

  1. はじめまして、私もhih-6130とRaspberry piの接続をしようとしていますが、pythonのプログラムは初めてで、記事を参考にさせて頂こうとしています。
    早速ですが、記事のコードが上手く実行出来なくて、教授頂けないでしょうか?

    実行すると、以下のエラーが出てデータの読み取りができません。
    buf = i2c.read_i2c_block_data(0x27, 0, 4)
    IOError: [Errno 5] Input/output error

    失礼ですが、33行目のwhile文の後ろに:が足りないのではないでしょうか?

    1. naggieさん、こんばんは。はじめまして。
      実は私もPythonは初めてなんです (^-^;)
      ご教授頂いた最後のループの「:」は訂正させて頂きました。
      お恥ずかしい限りです。
      さて、naggieさんのRaspiちゃんですがi2c-toolsとpython-smbusが入っていて
      modprobeとblacklistは対応済みでtypeはBでrevisionが2と考えて宜しいでしょうか?
      それならばまずはi2c-toolsを使って動作確認をしてみましょう。
      i2cdump -y 1 0x27 で値が出て来るでしょうか?
      センサーが活きていれば

      $ i2cdump -y 1 0x27
      No size specified (using byte-data access)
           0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
      00: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      10: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      20: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      30: 58 58 58 18 58 58 58 58 58 58 58 58 58 58 58 58    XXX?XXXXXXXXXXXX
      40: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      50: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      60: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      70: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      80: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      90: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      a0: 58 58 58 58 58 58 58 58 18 58 58 58 58 58 58 58    XXXXXXXX?XXXXXXX
      b0: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      c0: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      d0: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX
      e0: 58 58 58 18 58 58 58 58 58 58 58 58 58 58 58 58    XXX?XXXXXXXXXXXX
      f0: 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58    XXXXXXXXXXXXXXXX

      こんな感じのダンプが得られるはずなんですが…いかがでしょうか?

      1. airwhiteさん、
        返信ありがとうございます。
        前提条件は整っている筈です。BMP085という気圧計での計測実績もあります。
        早速コマンドを試してみました。
        $ i2cdump -y 1 0x27
        No size specified (using byte-data access)
        0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
        00: XX XX XX XX XX XX XX XX XX 40 40 40 40 40 40 40 XXXXXXXXX@@@@@@@
        10: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@
        20: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@
        30: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@
        40: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 @@@@@@@@@@@@@@@@
        50: 40 40 40 40 64 64 64 64 64 64 64 64 64 64 64 64 @@@@dddddddddddd
        60: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        70: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        80: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        90: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        a0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        b0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        c0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        d0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        e0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        f0: 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 dddddddddddddddd
        おかしいですね。死んでいるのでしょうか?

        1. どうも、こんばんは o(*^-^*)o
          たぶん壊れていることは無いと思うのですが…信号が不安定なように思います。
          ちょっと気になることがありまして hih6130 は i2cバスに1個だけでしょうか?
          その他にもi2cバスにぶら下がっているものがありましたら外してみては如何でしょう。
          私のhih6130はスイッチサイエンスさんから購入したのですが、このセンサーのSDAとSCLにはプルアップ抵抗がついていますが、RaspberryPi本体はプルアップ済みになっています。
          単体のセンサー1個ぐらいなら大丈夫だけど複数個のセンサーや装置をi2cバスにぶら下げる場合には、センサー側のプルアップ抵抗を外した方が良いそうです。
          ちなみに私が買ったbmp085もプルアップ済みになっています。
          (スイッチサイエンスのbmp085は半田パッドを削り取るとプルアップが無効になるように回路が組まれているそうです)
          無事に動いてくれることを願っております。

  2. airwhiteさん、
    こんばんは、naggieです。
    信号が不安定というご指摘ありがとうございました。
    思い当たる節があったので、ピンヘッダーの形状を太い物に変更した所、上手く値が取れるようになりました。いやぁ、すばらしい。
    我が家には夏場湿度が高くなる部屋があって、カビが大変なんです。湿度の変化を検知して除湿機を動かそうと思っています。

  3. Raspberry Piから磁気センサーの出力を読み取ろうとしていましたが、うまくいかず、調べているうちにこちらにたどり着きました。
    「RaspberryPi本体はプルアップ済み」という情報が大変助かりました。センサーモジュールの基盤についているプルアップ抵抗を有効にしていたのが原因でした。これを無効にすると素直なdump結果が得られました。数日悩んでいたのがウソのようです。ありがとうございました。