この記事は1310文字約4分で読めます

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

Table of Contents

ガジュマル

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

img

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

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

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

Raspberry PI Zero WH

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

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

img

中身はこんな感じです。

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

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

img

土壌センサー

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

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

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

img

DHT11

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

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

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

img

フォトレジスタ

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

img

ADC0832

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

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

データシート

img

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

構成

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

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

img

img

コード

今回はセンサーを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でほしいセンサー情報にアクセスできます。

動かしてみる

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

img

Zabbixのexternal scriptsを使ってAPIから情報を取得し、グラフにしてみました。

img

うまく取得できました。

結論

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

https://github.com/tubone24/raspi_plant_checker

これで枯らすことなく育てることができますね!

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

ぽちっとな↓

Buy me a ramen

 Related Posts

hatena bookmark