It's my life
Recent posts 6 / 86
Netlifyのビルド時間をGitHub Actionsで0時間にして月末のヒヤヒヤから解放されよう!Next.jsとVercelとRecoilとMaterial Tableを使ってAWSのステータスダッシュボードを作ってみた話MQTTと電子ペーパーを使って年賀状を作るLambda – Container Image Supportを使ってAlpineからSeleniumが動くコンテナを作ってTerraformで当てる面倒なSSH Configと鍵管理はssh-config-jsonに任せようNim用のTwitterSDK作るついでに仕事中TwitterができるCLIを作ったSearchBox
Search my blog.Raspberry PIを使って家のガジュマルを枯らさないようにします。
我が家にはガジュマルが観葉植物としています。
ガジュマルには日光がある程度必要なので窓際に置いているのですが、水やりを忘れがちです。
何度も枯らしかけたので、Raspberry PIを使って水やり管理をできるようにします。
ついでに余っていた温度計やフォトレジスタも組み込んで観葉植物の管理システムを作ってみようかと思います。
今回は余っていたRaspberry PI Zero WHを使います。
性能はそこまでよくないですが、低電力でコンパクトなのでこういった用途には向いていると思います。
中身はこんな感じです。
インターフェースはHDMI(ちっさいの)とUSB Microと電源供給用のUSB Micro、ディスク代わりのMicroSD、カメラモジュールです。
不要だと思いつつも余っていたのでヒートシンクをつけてます。
土壌センサーはAmazonで購入しました。
https://www.amazon.co.jp/gp/product/B0116IYDES/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1
5個入りで¥550 でした。安い。
温度と湿度はDHT11を使います。電子工作の有名どころですね。
デジタル接続ができるのでA/Dに通さなくていい優れものです。
精度はわかりません。趣味で作るものなのであまり気にしなくていいと思います。
フォトレジスタとは光が当たると抵抗が下がるやつです。
A/DのコンバータはADC0832を使いました。
なかなかデータシートが出てこず大変でしたがこちらです。
8digitの隣にあるチップがADC0832です。
今回は土壌センサーとフォトレジスタと2つアナログがありますのでADC0832のチャンネルをフルに2チャンネル使う構成にしてます。
また、土壌センサーはずっと電力を印加していると電気分解が起きてセンサーがボロボロに腐食してしまうため、VCCはGPIOで制御して取るようにしてます。
今回はセンサーを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でほしいセンサー情報にアクセスすることができます。
ガジュマルの植木鉢に設置してみます。
Zabbixのexternal scriptsを使ってAPIから情報を取得し、グラフにしてみました。
うまく取得できました。
ここまでのコードはZabbixのテンプレート含めGitHubに公開してます。
https://github.com/tubone24/raspi_plant_checker
これで枯らすことなく育てることができますね!