Raspberry Piに温度センサーを繋いでRubyで取得してみた

なぜかRaspberry Piが3台ある。1台は電子工作用、1台は自鯖置き換え用、もう1台はちょっとしたWebサービス動かす用。どれも並行して進めていてなんかブログ書くタイミング逃している。

そんな中、温度センサーを使ってみる編が進んだの書くことにした。

購入したのは HIH-6130 デジタル温度センサスイッチサイエンスさんで購入した。USBで取る方が簡単かもしれないけど、電子工作してみたかったのでこれにした。

基本的に HIH-6130 湿度センサー を使う の記事を大変参考にさせていただいた。

プロトタイプは同じくスイッチサイエンスさんで購入したAdafruit Raspberryにブレッドボードを乗せてやっていた。

Raspberry Pi

i2c関連のセットアップ

OSはRaspbian。

sudo apt-get install i2c-tools
sudo adduser pi i2c
sudo shutdown -r now
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev
sudo vi /etc/modules

で以下を追加する

i2c-bcm2708
i2c-dev
sudo vi /etc/modprobe.d/raspi-blacklist.conf 

で i2c-bcm2708 の行をコメントアウト

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
# blacklist i2c-bcm2708
sudo i2cdetect -y 1
sudo i2cdump -y 1 0x27

でデータが取れればok。

Rubyでi2c

参考: Raspberry Pi View topic – Use I2C with Ruby

この i2c ライブラリを使うことにした。

$ sudo apt-get install ruby1.9.1 ruby1.9.1-dev
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]

ややこしいがruby1.9は1.9系のインストールだけど、たしかこのパッケージに問題があってruby1.9.1が作られたのでAPTのruby1.9.1でインストールされるのは1.9系の現行バージョン1.9.3になる(1.9.1が入るわけではない)。この時点では2.0系のパッケージはなかった。

ちなみにrbenvなどでやるとビルドにすごい時間がかかるそうなのでAPTのパッケージで我慢する。

sudo gem install i2c
#!/usr/bin/env ruby

require 'rubygems'
require 'i2c'

class HIH6130

  def initialize(path, address = 0x27)
    @device = I2C.create(path)
    @address = address
  end

  def fetch_humidity_temperature
    s = @device.read(@address, 0x04)
    hum_h, hum_l, temp_h, temp_l = s.bytes.to_a

    status = (hum_h >> 6) & 0x03
    hum_h = hum_h & 0x3f
    hum = (hum_h << 8) | hum_l
    temp = ((temp_h << 8) | temp_l) / 4

    return status, hum * 6.10e-3, temp * 1.007e-2 - 40.0
  end

end

sensor = HIH6130.new('/dev/i2c-1')

10.times do
  p sensor.fetch_humidity_temperature
  sleep(1)
end

このプログラムはスイッチサイエンスさんのリンクにあったサンプルスケッチをそのまま移植した。

最初、Adafruitの上に置いたブレッドボードで動かしたら33度と出力されて計算間違っているのかな?と思ったら普通にRaspberry Piの熱が伝わっている感じだったので離してみたら5度下がった。部屋の温度計と大体同じになったのでちゃんと動いているっぽい。部屋の温度が高いのはいろんなデバイスが熱風を発しているため。

センサーを離さないといけないと分かったので最終的にどのような形態にするのかも考えなきゃいけないなぁ。

とりあえず次はこれをmuninのプラグインに書きなおして、グラフ化する予定。最終目標は赤外線信号を発信して、自動でエアコンつけたり消したりすること。