この記事は2101文字6で読めます

Raspberry PIを使って家のガジュマルを枯らさないようにします。

#Table of Contents

#ガジュマル

我が家にはガジュマルが観葉植物としています。

窓際に置いた観葉植物ガジュマルの写真

ガジュマルには日光がある程度必要なので窓際に置いているのですが、水やりを忘れがちです。

何度も枯らしかけたので、Raspberry PIを使って水やり管理をできるようにします。

ついでに余っていた温度計やフォトレジスタも組み込んで観葉植物の管理システムを作ってみようかと思います。

#Raspberry PI Zero WH

今回は余っていたRaspberry PI Zero WHを使います。

性能はそこまでよくないですが、低電力でコンパクトなのでこういった用途には向いていると思います。

Raspberry Pi Zero WHのパッケージ内容(本体・ヒートシンク等)

中身はこんな感じです。

インターフェースはHDMI(ちっさいの)とUSB Microと電源供給用のUSB Micro、ディスク代わりのMicroSD、カメラモジュールです。

不要だと思いつつも余っていたのでヒートシンクをつけてます。

ヒートシンクを取り付けたRaspberry Pi Zero WHの基板アップ

#土壌センサー

土壌センサーはAmazonで購入しました。

HiLetgo 5個セット LM393 3.3V-5V土壌水分検出センサー土壌水分センサーArduino自動散水システムロボット用の湿度計検出ロボットスマートカー [並行輸入品]

5個入りで¥550 でした。安い。

土壌水分検出センサーモジュールの外観写真

#DHT11

温度と湿度はDHT11を使います。電子工作の有名どころですね。

デジタル接続ができるのでA/Dに通さなくていい優れものです。

精度はわかりません。趣味で作るものなのであまり気にしなくていいと思います。

DHT11温湿度センサーモジュールの外観写真

#フォトレジスタ

フォトレジスタとは光が当たると抵抗が下がるやつです。

フォトレジスタ(光依存抵抗器)の外観写真

#ADC0832

A/DのコンバータはADC0832を使いました。

なかなかデータシートが出てこず大変でしたがこちらです。

データシート

ADC0832を搭載したブレッドボード上の回路写真

8digitの隣にあるチップがADC0832です。

#構成

今回は土壌センサーとフォトレジスタと2つアナログがありますのでADC0832のチャンネルをフルに2チャンネル使う構成にしてます。

また、土壌センサーはずっと電力を印加していると電気分解が起きてセンサーがボロボロに腐食してしまうため、VCCはGPIOで制御して取るようにしてます。

センサー回路の配線図(土壌センサー・フォトレジスタ・DHT11とADC0832の接続構成)

実際に配線したブレッドボードとRaspberry Pi Zeroの全体写真

#コード

今回はセンサーをAPI化して別システムからリクエストを投げることで計測を行なうシステムにしようと思うのでAPIサーバー化します。

APIサーバー化には今回はFalconを使ってみました。

import json
import falcon
import RPi.GPIO as GPIO
from time import sleep
import json
import ADC0832
import Adafruit_DHT

# Excitation Voltage for sensors
pin = 15

# initialize GPIO
GPIO.setwarnings(False)


# Excitation Voltage
def output_fromGPIO(pin, output):
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, output)
    sleep(0.1)


def get_temperature():
    try:
        output_fromGPIO(pin, True)
        _, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)
        return temperature
    finally:
        output_fromGPIO(pin, False)


def get_humidity():
    try:
        output_fromGPIO(pin, True)
        humidity, _ = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)
        return humidity
    finally:
        output_fromGPIO(pin, False)


def get_moisture():
    try:
        ADC0832.setup()
        output_fromGPIO(pin, True)
        while True:
            moisture = ADC0832.getResult(0)
            if moisture != -1:
                return moisture
            sleep(1)
    except:
        ADC0832.destroy()
    finally:
        output_fromGPIO(pin,False)


def get_light():
    try:
        ADC0832.setup()
        output_fromGPIO(pin,True)
        light = ADC0832.getResult(1) - 80
        print(light)
        if light < 0:
            light = 0
        return light
    except:
        ADC0832.destroy()
    finally:
        output_fromGPIO(pin,False)


class CheckHumidity(object):

    def on_get(self, _, resp):
        msg = {
            "key": "humidity",
            "value": get_humidity()
        }
        resp.body = json.dumps(msg)


class CheckTemperature(object):
    def on_get(self, _, resp):
        msg = {
            "key": "temperature",
            "value": get_temperature()
        }
        resp.body = json.dumps(msg)


class CheckMoisture(object):
    def on_get(self, _, resp):
        msg = {
            "key": "moisture",
            "value": get_moisture()
        }
        resp.body = json.dumps(msg)


class CheckLight(object):
    def on_get(self, _, resp):
        msg = {
            "key": "light",
            "value": get_light()
        }
        resp.body = json.dumps(msg)


app = falcon.API()
app.add_route("/humidity", CheckHumidity())
app.add_route("/temperature", CheckTemperature())
app.add_route("/moisture", CheckMoisture())
app.add_route("/light", CheckLight())


if __name__ == "__main__":
    from wsgiref import simple_server
    httpd = simple_server.make_server("0.0.0.0", 8000, app)
    httpd.serve_forever()

8000ポートでAPIサーバーが立ち上がり、GET APIでほしいセンサー情報にアクセスできます。

#動かしてみる

ガジュマルの植木鉢に設置してみます。

ガジュマルの植木鉢に土壌センサーとRaspberry Pi Zeroを設置した様子

Zabbixのexternal scriptsを使ってAPIから情報を取得し、グラフにしてみました。netatmoのセンシングと組み合わせると室内環境の監視がより充実します。

Zabbixで土壌水分・温度・湿度・照度のセンサーデータをグラフ表示した画面

うまく取得できました。

#結論

ここまでのコードはZabbixのテンプレート含めGitHubに公開してます。

https://github.com/tubone24/raspi_plant_checker

これで枯らすことなく育てることができますね!ラズパイを使った他のプロジェクトとしてMQTTと電子ペーパーで年賀状を作る電子ペーパーカレンダーなども作っています。

tubone24にラーメンを食べさせよう!

ぽちっとな↓

Buy me a ramen