温湿度+土壌湿度を観測してみた
どうも、じぇいかわさきです。
この前見つけた、YL-96という土壌湿度センサーをデジタルモードで使用してみました。
使い方は非常に簡単で、ケーブルを接続して土に入れるだけ。後は一定の湿度であれば1を返しているので、土壌に湿気が有ると判断できるんですね。
従って、湿度がないと0を返してきていると思います。
YL-96を動かすコード
それでは、実際に鉢にYL96を挿して使ってみましょう。
まず、センサーのコンパレータ部分をラズパイに接続すると、写真上で上のLEDが赤く点灯します。
次に、センサー部分のフォークを鉢に差し込むと導通があり下側のLEDが点灯します。多分、不通になるとLEDがが消えるのでしょうね。
このセンサーをデジタルで動かすには、特に気を使うこともなく少しのコードでデジタル判定が下せるようになります。
from gpiozero import DigitalInputDevice
import time
d0_input = DigitalInputDevice(5)
while True:
if (not d0_input.value):
print('Moisture threshold reached!!!')
else:
print('You need to water your plant')
time.sleep(10)たこれだけのコードです。
単純にGPIO(5)の信号を見ていて、信号が有れば「Moisture threshold reached!!!」の表示がでます。
たったこれだけでGo/Notの判断ができるから便利ですね。
もし、アナログ信号で受ける場合はADCを使用して、自分で閾値を決めなければいけませんが、その閾値自体の根拠もきめなければいけないので、ちょっと難しそうですね。
温湿度センサーと同時に動かす
さて次は温湿度センサーのDHT11も同時に動かしてみましょう。今までDHT11のコードの方が長いので、その中に今回のYL96のコードを組み込むようにします。
組み込むなんてかっこいいこと書いてありますが、実は簡単で基本的意DHT11もYL96も有る一定時間でループを繰り返しているだけです。
従って、2つのセンサーを同じループ内にまとめれば良いことだけだと思います。
実際のコードはこんな感じにしてみました。
from gpiozero import DigitalInputDevice
import RPi.GPIO as GPIO
import dht11
import time
import datetime
# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
# read data using pin 4,5
instance = dht11.DHT11(pin=4)
d0_input = DigitalInputDevice(5)
try:
while True:
result = instance.read()
if result.is_valid():
print("Last valid input: " + str(datetime.datetime.now()))
print("Temperature: %-3.1f C" % result.temperature)
print("Humidity: %-3.1f %%" % result.humidity)
if (not d0_input.value):
print('Ground humidity: enough')
else:
print('Ground humidity: need')
time.sleep(30)
except KeyboardInterrupt:
print("Cleanup")
GPIO.cleanup()
while Trueのループ内にDHT11のセンサー値とYL96の信号をピックアップして表示するようにするだけです。
この方法で確かに動くことは確認できました。サンプリングした時間と、温度、湿度、そして土壌湿度の判定値の4つが表示されます。
とりあえず、こんな簡単な状態でも3つのセンシングができていることになります。
新たな問題が発生
しかし、よく結果をみていると土壌湿度表示が数回繰り返している時が有るんです。
どうしてかわかりませんが、長いと3〜4回繰り返した後に温湿度を非常時します。
この場合は4回繰り返してますね。
そうなるとずっと続くかと思いきや、すぐに正常になることもしばしばあります。
4回表示後に正常表示に戻っています。
はて、何が問題でこのような事が起きているのでしょうか?
ループの組み方が悪いのでしょうかね。本来なら30秒毎にサンプリングをしているので、sleepで30秒待った後に、新しいループが始まると思います。
その時にはタイムスタンプを表示しますので、表示しないままYL96の判定を表示していますので、ループのネストがかかっているようにも思えますね。
素人ながらに、もう少し調べてみたいと思います。
問題もたくさん出ますが、それを一つづつ解決していくのが楽しいですね。
じぇいかわさきです。生産技術者として35年、今まで培った経験とスキルを元に、ものづくりに関わる世の出来事に対して思ったことをホンネで書いてます。ノウハウやアイデアもありますよ。 また写真も全力で撮っています、気に入った写真があればサポートや感想をぜひお寄せください。