2024/02/20 21:22
今日はプログラムの話です🤔
私は1人で70前後の巣箱を管理しています。
ハイシーズン(5月前後)には1箱に10枚の巣枠が入った巣箱が2段〜3段になります。
単純計算ですべて2段とすると、70箱 × 10枚の巣枠 × 2段 = 1400枚の巣枠を管理することになります。
1つの巣枠に対して巣箱から取り出して、産卵状況や、採蜜状況を検査するまで多めに見て、「1分」だとすると、1400分かかります。
約23時間です。
もう少し短く見れると思いますが、新しい巣箱が増えたり、突然のトラブルを想定するとあり得る数字かもしれません。
また、1つの巣枠が2キロ前後だとすると、2キロダンベルを1400回持ち上げる筋トレです 笑
シーズン中には4日〜5日に1回、内部を検査します。
時間もかかり、肉体的にも1人では非常に過酷な労働です。
こういったハードな状況をサポートするために、昨年からRasberryPiを使って実験的に巣箱内部の状況を数値化するシステムを作っています。
具体的には、RasberryPi(小型コンピュータ)にDHT11センサーを搭載し、巣箱内部の温度と湿度を自動計測するシステムをpython でプログラムしました。
このデータをクラウド上のデータベースに毎日定期的に保存、グラフ化させ巣箱内部の状況の変化を確認できるようにしています。
このシステムでは、一定の数値を超える温度や湿度になった場合は「アラート」がメールで届くようになっています。
--- RasberryPi内部の具体的なコードは以下となります。-------------
エンドポイントにログインするIDやパスワード関連のコードは以下には記載していません。
import RPi.GPIO as GPIO
import dht11
import requests
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
from datetime import datetime, timezone, timedelta
import json
def job_function():
tempGpio = <pin number>
GPIO.setmode(GPIO.BCM)
dhtStat = dht11.DHT11(pin=tempGpio)
# 初回の測定
stat = dhtStat.read()
temperature = stat.temperature
humidity = stat.humidity
# 測定結果がどちらも0の場合、最大で5回まで再試行
retry_count = 0
while (temperature == 0 and humidity == 0) and retry_count < 5:
print("Retrying measurement")
stat = dhtStat.read()
temperature = stat.temperature
humidity = stat.humidity
print(f"Retry {retry_count + 1} - Temperature:", temperature)
print(f"Retry {retry_count + 1} - Humidity:", humidity)
retry_count += 1
# 測定結果がどちらも0の場合、エラーメッセージを表示して処理を終了
if temperature == 0 and humidity == 0:
print("Measurement failed. Please check the sensor.")
GPIO.cleanup()
return
# 測定結果が0以外の場合、データを送信
print("Temperature:", temperature)
print("Humidity:", humidity)
# RailsアプリケーションのAPIエンドポイント
api_endpoint = 'end point'
# データ送信(jsonパラメータを使用)
payload = {'rasberry': {'temperature': temperature, 'humidity': humidity, 'hive': '1'}}
headers = {'Content-Type': 'application/json'} # ヘッダーの指定
response = requests.post(api_endpoint, json=payload, headers=headers) # jsonパラメータを使用
# response
print(response.text)
print(payload)
GPIO.cleanup()
# タイムゾーンを日本時間に設定
jst = timezone(timedelta(hours=9))
# スケジューラーの作成
scheduler = BlockingScheduler(timezone=jst)
# cron形式で毎日12時に実行するトリガーを設定
trigger = CronTrigger(hour=12, minute=0, second=0, timezone=jst)
scheduler.add_job(job_function, trigger=trigger)
# スケジューラーの開始
scheduler.start()
データベースはHeroku上に、ログイン機能を持ったアプリケーションを用意しました。
hive_number,temperature,humidity カラムを持ったテーブルを用意し、javascriptでtemperatureとhumidityを自動でグラフ化させています。
あと、養蜂場は山の中にあるので、格安携帯を使ってネットワーク接続させています。
大抵の巣箱の温度や湿度は季節によるものの、時期ごとに一定になることが多いです。
ですが、蜜蜂が不調になると巣箱の温度を保てなくなることがあります。
こういった状況を数字でみることで集中的に狙い撃ちで検査をすることができました。
ただ、蜜蜂は生き物である以上、すべてを数字で理解することは温度や湿度だけでは非常に難しく、
大半は自分の目で見て判断することが重要で、こういったシステムはあくまで補助的な役割として使用していました。
一方で問題もありました。
私は、小型PCであるRasberryPi3 ModelB+を使用していました。
この小型PCの問題は、夏場の巣箱の熱によって個体により、動作しなくなったり、電圧が安定しなかったりという問題があり、計測が不十分なケースもありました。
そこで、今年から、RasberryPi pico wh(マイコン)を使用することにしました。
写真左が3+ 右がPICO Wh
pico は消費電力も小さく、発熱に対する対策もケースや置き場所を工夫することで対策できそうです。
かつ、RasberryPi3 ModelB+は1台5000円以上に対して picoは1台1000円程度で格安です。
養蜂場すべての巣箱に搭載することもできそうです。
とりあえず配線が完了したので、pico用にプログラムを載せて明日から実験してみます。
------ 目的 ------------------------------------------
巣箱内部の温度と湿度をアプリで確認できるようにします。
そうすることで、蜜蜂の健康状態を目視プラス数値でも把握できるようになります。
また、今後、巣箱に重量センサーも搭載する予定です。
重量をアプリで確認することで、貯蜜状況を数値化することが可能になります。
私は1人で養蜂をしているので、どうしても手作業だけでは時間がかかります。
なので、なんとかして効率化することが出来ないか試行錯誤しています😄