RaspberryPiでサボテンを監視


我が家のサボテンが健やかに育つよう、環境をモニタリングしようと思った。

やりたい事

* 各種センサーから気温、湿度、日照量、土壌湿度等をモニタリング
* センサーから得られた値を、ネットワーク越しに何らかの方法で取り出したい
* サボテンは窓際に置いてあるので有線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`

↓の様なファイルが出来上がってるはず。

```text:/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=~はセキュリティ上、宜しくないので削除）

```text:/etc/wpa_supplicant/wpa_supplicant.conf
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に接続する設定
デフォルトで下記の様になってるファイルを

```text:/etc/network/interfaces
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
```

↓の様に修正

```text:/etc/network/interfaces
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で温度センサー。部屋の気温を取得しよう](http://lchikaamazon.hatenablog.com/entry/2013/12/23/184223)
[部屋の明るさを取得するフォトトランジスター編](http://lchikaamazon.hatenablog.com/entry/2014/12/02/111022)

まずは`sudo raspi-config` -> advancedでl2cを有効化する。
その後`sudo gem install pi_piper`で、ライブラリをインストール
(今回は最新の1.3.2をインストールしている)

参考ページではセンサをMCP3002のCH0に繋いでいるが、今回はCH0に温度計、CH1に照度計を繋いでみる。
CH0は良いとして、CH1からの値の取得方法は。。。[データシート](http://docs-asia.electrocomponents.com/webdocs/1380/0900766b81380ac0.pdf)によると
![スクリーンショット 2015-05-11 17.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/64421/276db368-af54-9758-5c11-27fe23f7901b.png "スクリーンショット 2015-05-11 17.48.18.png")
という事なので
`spi.write [0b01111000,0]`
で取れるはず

参考ページをまんまコピペだけど、ソースはこんな感じ。

```ruby:mcp3002.rb
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化