自作全自動ニンニク乾燥機・運用開始!

2022年9月7日

RaspberryPiを使った、自作のニンニク乾燥機。

今年は、もっと本格的な運用をしてみようと、Python(プログラミング)の改良をやってみます。

これまでの乾燥機の問題点

現在の乾燥機は、ハード面ではほぼ完成していると思います。

上の画像は、去年運用していた状態の解説図ですが、今もほぼ一緒です。

ただ、除湿機を24時間運転していると、乾燥室内の温度が日中高くなりすぎる事があり、仕方なくRaspberryPiを通じて除湿機のオン・オフを遠隔操作してた・・のが去年まで。

問題点を洗い出すと、こんな感じ。

  • ニンニクの乾燥は35度以下としたい。
  • 除湿機を運転し続けると、35度を超える事がある。
  • 乾燥室内の温度と湿度は遠隔監視出来ているが、四六時中見られるわけではない
  • エラーで測定出来ない事もある

今年は、ここからもう一歩自動化を進めたいと思います。

Pythonのコードを全面的に見直して自動化する

Pythonをいじるのは、ほぼ一年ぶりだったので、記憶をほじくり出すところからスタートでした(^_^;)

まず、温度と湿度を測定してクラウド上に上げるのは、この記事で紹介。

それと、除湿機を遠隔でオン・オフするやり方を紹介した記事はこちら。

この2つを組み合わせつつ、エラー対策を進めるようにします。

では完成したコードを貼ります。

知識のある人からしたらおかしなコードを書いているかもしれませんが、そこはご容赦を。

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import gspread
  4. import RPi.GPIO as GPIO
  5. import dht11
  6. import time
  7. import datetime
  8. import pigpio
  9. from oauth2client.service_account import ServiceAccountCredentials
  10. # initialize GPIO
  11. GPIO.setwarnings(True)
  12. GPIO.setmode(GPIO.BCM)
  13. # read data using pin 14
  14. instance = dht11.DHT11(pin=14)
  15. SERVO_PIN = 23
  16. while(1):
  17.   jositsu = input('除湿機運転中は10・停止中は0を入力→')
  18.   if jositsu.isdecimal():
  19.    jositsu = int(jositsu)
  20.    break
  21. key_name = './cert/raspberrypi-1-************.json' # GoogleSheet認証キー
  22. sheet_name = 'RaspberryPi-1sheet' # シート名
  23. try:
  24.     if __name__ == '__main__':
  25.         scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
  26.         credentials = ServiceAccountCredentials.from_json_keyfile_name(key_name, scope)
  27.         gc = gspread.authorize(credentials) # JSONキーファイルで認証
  28.         wks = gc.open(sheet_name).sheet1 # sheetをオープン
  29.     while True:
  30.         result = instance.read()
  31.         dtn = datetime.datetime.now()
  32.         while result.is_valid():
  33.             B = result.temperature
  34.             C = result.humidity
  35.             D = 0.62198 * (6.1078 * 10 ** (7.5 * B / (B + 237.3)) * C / 100) / (1013.25 - (6.1078 * 10 ** (7.5 * B / (B + 237.3)) * C / 100)) * 1000
  36.             D = round(D, 1)
  37.             print("測定時刻: " + dtn.strftime("%Y/%m/%d %H:%M:%S"))
  38.             print(" 気 温: " + str(B) + "C") # 元々小数点1桁で数字拾っていたので、簡単な表現に変更
  39.             print("相対湿度: " + str(C) + "%") # 上と同じ
  40.             print("絶対湿度: " + str(D) + "%")
  41.             print(" 除湿機: " + str(jositsu))
  42.             datas = [dtn.strftime("%Y/%m/%d %H:%M:%S"),B,C,D,jositsu]
  43.             wks.append_row(datas)
  44.             if result.temperature > 34 and jositsu == 10:
  45.                 pi = pigpio.pi()
  46.                 pi.set_servo_pulsewidth(SERVO_PIN, 1650)
  47.                 time.sleep(1.0)
  48.                 pi.set_servo_pulsewidth(SERVO_PIN, 2000)
  49.                 time.sleep(1.0)
  50.                 jositsu = 0
  51.                 print("34度以上・除湿機停止")
  52.             if result.temperature <= 33 and jositsu == 0:
  53.                 pi = pigpio.pi()
  54.                 pi.set_servo_pulsewidth(SERVO_PIN, 1650)
  55.                 time.sleep(1.0)
  56.                 pi.set_servo_pulsewidth(SERVO_PIN, 2000)
  57.                 time.sleep(1.0)
  58.                 jositsu = 10
  59.                 print("33度以下・除湿機運転")
  60.             print("---")
  61.             time.sleep(1200)
  62.             break
  63.         else:
  64.             print("!測定不良!" + dtn.strftime("%Y/%m/%d %H:%M:%S"))
  65.             print("---")
  66.             time.sleep(3)
  67.         
  68. except KeyboardInterrupt:
  69.     GPIO.cleanup()
  70.     pass

改良点を解説しましょう。

19~23行目:
現在除湿機が動いているか・いないかの判定。
こればかりは自動化出来なかったし、色々な条件(停電とか)を全て網羅は無駄だと感じたので、手動で指示することとした。
現在運転中なら10を入力・停止中なら0。
最初は1と0だったが、後でグラフにした時にわかりやすくするため、10と0。
また、正確に半角数字の10が数値として入力されるようにしてある。

36・67行目:
測定値が正しく取得できたかどうかを判定。
valid()がそれに当たる。
取得出来ていれば、37行目以降へ進む。
出来ていない場合は、67行目へ。
”!測定不良!”の警告文とその時刻を表示し、再度測定に戻る。
その後は、測定が成功するまで繰り返す。
(これで測定エラーは壊滅出来たと思う)

37~39行目:
取得した温度・湿度(相対湿度)から、絶対湿度を計算で出す。
絶対湿度の算出方法は色々あるようなので、まぁ目安として。
(今まではスプレッドシート上で人力にて算出してた)
相対湿度と絶対湿度については、別の記事に詳しく書いてる。
別記事へのリンク:相対湿度と絶対湿度
また、式が長くなるので、温度と相対湿度の取得値は一文字に変換し、小数点以下1桁に丸めた。

41~46行目:
以前は英語表記などでわかりにくかった点を修正。
シンプルに、わかりやすくした方が良い。
測定時刻も、秒までとした(ミリ秒は不要でしょ)
45行目は、温湿度測定時に除湿機が動いているかどうかの判定用。

48~55行目:
今回のキモ。
まず48行目で、”34度を超える” かつ ”現在除湿機が動いている” 状況を検知。
その状況であれば、サーボモーターをスイッチボットのように動かして除湿機をオフにする。
除湿機はオフとなるので、”jositsu”の値を停止を示す”0”に変更して、「34度以上・除湿機停止」を時刻と共に表示する。

56~63行目:
上記の逆。
除湿機を停止すれば、基本的には温度は下がり湿度は上がっていく。
”33度以下” かつ ”現在除湿機が止まっている” 状況を検知。
その状況であれば、サーボモーターをスイッチボットのように動かして除湿機をオンにする。
除湿機はオンとなるので、”jositsu”の値を運転を示す”10”に変更して、「33度以下・除湿機運転」を時刻と共に表示する。

65行目:
ここまで終わったら、1200秒(20分)インターバルを置き、繰り返す。
つまりは、20分ごとに温度と湿度を測定し、温度が35度を超えないように除湿機を自動でオン・オフするサイクルを繰り返している。

運用状況

これまでは、半自動というか人の手動を織り交ぜる事で運用してきたシステムですが、今回の改良でほぼ全自動となるはずです(初動に除湿機がオンかオフかの判断だけ手動)

で、一番の目標は乾燥中に35度を大きく上回らないで運用できる事。

温度上がりすぎると、商品価値無くなってしまいますから。

外気温の影響もありますが、まずは3日間ほど運用した結果をご覧下さい。

青い線が温度で、赤い点線が目標としている温度の範囲です。

だいたい30度から35度の間。

ピンクと黄色が相対湿度と絶対湿度。

緑が除湿機の運転状況で、10=運転中・0=停止中です。

さっき書きましたが、運転中を1にしちゃうと、グラフ上で見分けがつかなかったので、10にしています。

まず、温度については、目標の範囲内にかなり収まっていると言って良いでしょう。

監視していなくても、勝手に除湿機のオン・オフをやってくれるのは、かなり助かります。

そして、やはり除湿機がオフの間は、ある程度湿度が上がります。(相対値も絶対値も)

2日目は終日雨で、その分温度も上がらず除湿機がオフになっていません。

それぐらいが一番コントロールしやすいかもですね。

仮に35度近いような外気温になったら、除湿機オフしてもかなり温度上がりそうな気がします。

そのあたりは、まだ改良の余地はありそう・・・
(断熱するとか、低い温度の空気を取り入れるとか)

それでもこの運用状況なら、かなり満足な結果です!

実際の乾燥具合と来年に向けて

6/18に、一部ニンニクを乾燥機から出して状況確認しました。

写真は撮り忘れましたが、かなりいい感じです。

急速に乾燥しすぎた去年と比べ、収縮しすぎたような玉も見当たらないし、盤茎(底の硬い部分)もしっかり乾燥してカチカチになっていました。

ということで、いつでも出荷可能となりました!

お待ち頂いている皆様、今年も良い物が出来たと思っていますので、楽しみにしていて下さい!

それと今年はちょっとパッケージも工夫しようと思っているので、そのあたりはまた別途記事にするとします。

後は、温度が上がりすぎる可能性がある問題と、収穫量が増えちゃった問題については、来年の課題ですかね。

また構想を練っておいて、来年楽しく改良しようと思います♪