Intel Edison と Pythonで植物育成のためのセンサデータ取得と可視化

Intel EdisonとPythonを使って植物を育てるためのセンサデータを取得して可視化してみました．
回路がわからない僕みたいな初心者でもBase Shieldとセンサーがあればコードを書くだけで簡単に値が取得できて楽しいです．
EdisonでPythonを用いて書かれているものが少ないので書いてみることにしました．
サーバーと連携はしていないのでIoTっぽくはないです．

#今回行ったこと
edisonのセットアップ
pythonによるセンサー値取得・csvファイル保存
nvd3.jsによる可視化

#Intel Edisonの設定
これは以下を参考にして設定しました．Arduinoボードです
http://nonnoise.github.io/Edison/

#センサー
以下のセンサーを使いました．

Grove - Temperature Sensor
Grove - Light Sensor
Grove - Moisture Sensor
http://www.seeedstudio.com/wiki/Grove_-_Temperature_Sensor
http://www.seeedstudio.com/wiki/Grove_-_Light_Sensor
http://www.seeedstudio.com/wiki/Grove_-_Moisture_Sensor

回路は初心者で分からなすぎるので，kitを買いました．
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4KNG

あと，しゃべったら面白いなと思ってLCDモニターもつけてみました．
http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight

完成系がこんな感じです．ペパーミントを育てます．

![sensor.jpg](https://qiita-image-store.s3.amazonaws.com/0/45154/b61dc7c5-f70b-8278-eefd-e4996fab7e21.jpeg)

pinに挿すだけで簡単にデータが取れるようになるのは面白いです.

#プログラム
今回は日付，気温，光量，土中の水分をcsv形式にして，10分ごとに保存します．
mraaモジュールをインポートして，ピンにさしたセンサーの値を読み込みます．
lcdはmraaでも制御できるっぽいのですが，pyupm_i2lcd方が簡単だったのでこちらを利用しました．

```sensor.py
#!/usr/bin/python

import datetime
import mraa
import csv
import time
import math
import pyupm_i2clcd as lcd

# definition of Pin
light = mraa.Aio(0)
temperature = mraa.Aio(1)
moisture = mraa.Aio(2)
lcdDis = lcd.Jhd1313m1(0, 0x3E, 0x62)

B = 3975
t = 0
OUT_FILE = "20150426_30.csv"
HOUR = 3600 * 30

with open(OUT_FILE,"wb")as f:
    writer = csv.writer(f)
    writer.writerow(["datetime","temperature","light","moisture"])

while t < HOUR:
    if t % 600 == 0:
        #read the value
        light_val = light.read()
        tem_val = temperature.read()
        moi = moisture.read()

        #calc temperature
        resistance = (1023.0 - tem_val) * 10000 /tem_val
        tem_last = round(1/(math.log(resistance /10000) / B+1 / 298.15) - 273.15,2)

        #calc light
        rsensor = round((1023.0 - light_val)*10 / light_val,2)

        #calc today
        d = datetime.datetime.today()

        #calc moisture
        moi_per = round(moi / 10.0,2)

        strtime = d.strftime("%Y-%m-%d %H:%M:%S")

        with open(OUT_FILE,"ab")as f:
            writer = csv.writer(f)
            writer.writerow([strtime,tem_last,rsensor,moi_per])
        print "Now:",strtime,"," , "Temperature:",tem_last,"," , "Light:",rsensor,",","Moisture:",moi_per 

        #Check Moisture and Change LCD Display
        if moi_per < 10.0:
            lcdDis.write("                ")
            lcdDis.setColor(128,0,128)
            lcdDis.setCursor(0,0)
            lcdDis.write("I am thirsty :(")
        else:
            lcdDis.write("                ")
            lcdDis.setColor(255,255,0)
            lcdDis.setCursor(0,0)
            lcdDis.write("Iam fine :)")

    time.sleep(1)
    t += 1

```

これで取得した値がcsv形式で保存されます．


#センサデータの可視化
取得したセンサデータをnvd3.jsを利用して可視化しました．
http://nvd3.org/

こんな感じになってます．
室内に置いていたため，気温は大きく変動していないです
土中の水分があがっているのは誤差の範囲内でしょうか？
それとも受け皿に入った水を吸い上げたからでしょうか？
光は明るいと値が低くて，暗いと値が高くなります夜型人間なのが分かりますね笑


![スクリーンショット 2015-04-26 12.49.04.png](https://qiita-image-store.s3.amazonaws.com/0/45154/a9f11a61-4a4c-58c9-48f4-3b99bd13989f.png)

#反省
・育成環境が悪い（笑）
今回部屋の中で試してみたのですが，ベランダで育てた方が成長率も格段にいいです（笑）
ベランダに鉢を移し替えたところガンガン伸びています．
屋外に置いた方が面白いデータが取れると思います

・IoTしていない
今回はサーバーに値を送信するところまで行かなかったので，
次回はサーバーに送信して，送信されたデータをもとに予測したいと思います

#今後の予定
・サーバーに値を直接送信
・そこから何時水やりが必要かを予測
・自動水やり装置を作りたい
・野菜育てたい