我が家のサボテンが健やかに育つよう、環境をモニタリングしようと思った。
やりたい事
- 各種センサーから気温、湿度、日照量、土壌湿度等をモニタリング
- センサーから得られた値を、ネットワーク越しに何らかの方法で取り出したい
- サボテンは窓際に置いてあるので有線LANは届かない。無線LANでraspiにつながる様にしたい
やれたこと
- とりあえず今回は気温と日照量を取ってみた
- BUFFALOのWLI-UC-GNMで無線接続
ネットワーク越しの取得は、raspiにwebサーバ立てて
ブラウザから見られる様にするのが良さそう。今回はまだやってない
無線接続
無線子機はBUFFALOのWLI-UC-GNMが事例が多い様なので、これを採用。
親機との接続設定
設定方法は、/etc/wpa_supplicant/wpa_supplicant.conf
にESSIDとパスワードを登録する。
wpa_passphrase
コマンドを使うと、設定に記述するフォーマットで出力してくれる。
コマンドの出力はそのまま/etc/wpa_supplicant/wpa_supplicant.conf
に追記すればOK。
以下のコマンドを打ってみる。(ESSIDには無線LANのSSID、passにはパスフレーズを各自の環境に合わせて指定する)
sudo wpa_passphrase ESSID pass | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf
↓の様なファイルが出来上がってるはず。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="ESSID"
#psk="password"
psk=XXXXXXXXXXXXXXXXXXX
}
今回は↓のように修正(#psk=~はセキュリティ上、宜しくないので削除)
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="ESSID"
proto=RSN
pairwise=CCMP
group=CCMP
psk=XXXXXXXXXXXXXXXXXXX
}
ちなみに認証方式毎の設定値は以下の通り。
認証方式
WPA-PSK
proto=WPA
WPA2-PSK
proto=RSN
暗号方式
TKIP
pairwise=TKIP
group=TKIP
AES
pairwise=CCMP
group=CCMP
起動時に無線LANに接続する設定
デフォルトで下記の様になってるファイルを
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
↓の様に修正
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
DNSの設定
avahiを入れる
sudo apt-get install avahi-daemon
設定の反映
reboot で再起動して設定を反映。
有線LANを引っこ抜いてssh -l pi raspberrypi.local
で繋がればOK
各種センサーの接続とか
raspiの設定とライブラリのインストール
参考
Raspberry Piで温度センサー。部屋の気温を取得しよう
部屋の明るさを取得するフォトトランジスター編
まずはsudo raspi-config
-> advancedでl2cを有効化する。
その後sudo gem install pi_piper
で、ライブラリをインストール
(今回は最新の1.3.2をインストールしている)
参考ページではセンサをMCP3002のCH0に繋いでいるが、今回はCH0に温度計、CH1に照度計を繋いでみる。
CH0は良いとして、CH1からの値の取得方法は。。。データシートによると
という事なので
spi.write [0b01111000,0]
で取れるはず
参考ページをまんまコピペだけど、ソースはこんな感じ。
require 'pi_piper'
require "date"
MCP3002_SINGLE_END_CH0 = 0b01101000
MCP3002_SINGLE_END_CH1 = 0b01111000
loop do
brightness = 0
value = 0
PiPiper::Spi.begin do |spi|
raw = spi.write [MCP3002_SINGLE_END_CH1,0]
brightness = ((raw[0]<<8) + raw[1]) & 0x03FF
raw = spi.write [MCP3002_SINGLE_END_CH0,0]
value = ((raw[0]<<8) + raw[1]) & 0x03FF
end
volt = (value * 3300)/1024
degree = (volt - 500)/10
puts "#{DateTime.now.strftime("%Y-%m-%d %H:%M:%S")} brightness #{brightness} Temperature #{degree} C"
sleep(10)
end
動かしてみる。
$ sudo ruby mcp3002.rb
2015-05-11 17:54:49 brightness 79 Temperature 24 C
2015-05-11 17:54:59 brightness 76 Temperature 24 C
2015-05-11 17:55:09 brightness 75 Temperature 24 C
2015-05-11 17:55:19 brightness 946 Temperature 24 C ←スマホのライトを当ててみた
2015-05-11 17:55:29 brightness 73 Temperature 24 C
気温も自宅の温度計と同じ値が取れており、それっぽく動いてるのでOKでしょう。
今後やりたい事
- センサの追加
- MCP3002は2CHしかないので、MCP3208等のCH数が多いADコンバータへの交換
- Web化