なぜかRaspberry Piが3台ある。1台は電子工作用、1台は自鯖置き換え用、もう1台はちょっとしたWebサービス動かす用。どれも並行して進めていてなんかブログ書くタイミング逃している。
そんな中、温度センサーを使ってみる編が進んだの書くことにした。
購入したのは HIH-6130 デジタル温度センサ でスイッチサイエンスさんで購入した。USBで取る方が簡単かもしれないけど、電子工作してみたかったのでこれにした。
基本的に HIH-6130 湿度センサー を使う の記事を大変参考にさせていただいた。
プロトタイプは同じくスイッチサイエンスさんで購入したAdafruit Raspberryにブレッドボードを乗せてやっていた。
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のプラグインに書きなおして、グラフ化する予定。最終目標は赤外線信号を発信して、自動でエアコンつけたり消したりすること。