ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

部屋の中心で飽差を叫ぶ!

(2019-04-22 初稿 - 2021-05-13 転記・修正 - 2025-02-23 修正・追記)

はじめに

以下の記事後、飽差についての報告も要望があった。

Raspberry Pi3で温度を測る

飽差は、植物の生育を管理するうえで、重要な指標とのこと。

飽差とは

誤解を恐れずに言えば、「空気中にどれくらい水蒸気を放出できるか」を示す指標。
単位は、g/m3 で、1立方メートル当たりの水分の重さで表す。

植物は、飽差が大き過ぎると気孔が閉じて、小さすぎると蒸散が起こりにくくなる。
このため、植物の生育のためには、換気や冷房よる除湿やミスト噴霧による加湿などの方法で、適度な飽差に管理することが必要。
一般的に、飽差は、3〜6g/m3くらいで管理することが良いと言われている。

飽差の詳細は、以下のサイトを参照のこと。

飽差の計算

飽差の計算は、上記2番めのサイト、または、以下のサイトを参照のこと。

以下のとおり、水蒸気圧、飽和水蒸気量を求め、飽差を計算することができる。

水蒸気圧(WVP) = 6.1078*10^((7.5*気温/(気温+237.3)))
飽和水蒸気量 (SWVA) = 217*WVP/(気温+273.15)
飽差(HD)    = (100-相対湿度)*SWVA/100 

上記のとおり、温度と湿度がわかれば、飽差は計算によって求めることができる。

温度と湿度のセンサー

今回の目的のために、新たに温度と湿度のセンサーを購入した。
1個500〜600円なので、財布には優しい。

このセンサーはDHT22が温度・湿度センサーで、既にハンダ付けされて付属のケーブルでつなぐだけのAM2302を購入した。
以下、このセンサーをAM2302と呼ぶ。

AM2302のつなぎ方

最初に買ったAM2302は、つなぎ方を間違えて壊してしまった。(-_-;)
写真を載せるので、付属ケーブルの接続方法を確認すること。

+    ⇒ pin1
out ⇒ pin7
-     ⇒ pin9

f:id:hymd3a:20210513100734j:plain

AM2302の端子

温度と湿度を測る

接続完了後、以下のとおりプログラムをダウンロードしてインストールする。

まず、python3の pip を事前にインストール。既にインストールされていれば、不要。

$ sudo apt-get update
$ sudo apt-get install python3-pip

プログラムをダウンロードし、ライブラリをインストールする。

(2021-12-02 追記)

以下のライブラリは開発元で非推奨とのこと、正常動作しなくなってしまった。(^_^;)

お手数ですが、今後は以下のページを参考に。

(追記終了)

(2025-01-27追記)

以下のスクリプトがまったく動作しなかったので、全面的に修正してみた。

以下のサイトに記述があるように、ライブラリをインストールする。

最近のpyhtonでは、pip3でダイレクトにインストールするとエラーになるので、以下のように「--break-system-packages」をつけるか、venv等の仮想環境を用いる。

Raspberry Piのようなシングルタスクのワンボードマイコンで温度を測る場合は、「--break-system-packages」の付加で十分だと思われる。

(追記終了)

pip3 install adafruit-circuitpython-dht --break-system-packages
sudo apt-get install libgpiod2

さっそくプログラムに付属していた simpletest.py を修正し、飽差を計算する関数(calc_hd)を書き加えた hd.py スクリプトを作成する。

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# mod H.Y 2022-09-03

# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import time
import board
import adafruit_dht

# add H.Y 2019-04-22
def calc_hd(temp,humidity):
    WVP=6.1078*10**(7.5*temp/(temp+237.3))  # Water Vapor Pressure
    SWVA=217*WVP/(temp+273.15)              # Saturated Water Vapor amount
    return (100-humidity)*SWVA/100

MAXTRY = 4

# add 2021-08-20
humidity = temperature = None

# Adafruit_DHT.DHT22, or Adafruit_DHT.AM2302.
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)

# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).

cnt = 0
while cnt < MAXTRY:
    try:
        temperature = dhtDevice.temperature
        #time.sleep(1)
        humidity = dhtDevice.humidity
        if humidity is not None and temperature is not None:
            #print(temperature, humidity)
            break

    except RuntimeError as error:
        #print(error.args[0])
        time.sleep(1)
        cnt += 1
        continue

    except Exception as error:
        dhtDevice.exit()
        print("Exception error")
        raise error

# calc humidity Defict
# add H.Y 2019-04-22
hd = calc_hd(temperature, humidity)

# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).
# If this happens try again!
if humidity is not None and temperature is not None:
    print('温度= {0:0.1f} ℃, 湿度= {1:0.1f} %, 飽差(HD)= {2:0.2f} g/m3'.format(temperature, humidity, hd))
else:
    print('Failed to get reading. Try again!')
$ hd.py
温度= 26.9 ℃, 湿度= 57.7 %, 飽差(HD)= 10.84 g/m3

上記のように、表示されればスクリプトは正常動作している。

つぶやいてみる

twitterでつぶやくために、詳細は以下のページを参照のこと。

(2025-01-27 修正)

(修正終了)

上記のページのbashスクリプトを修正して、以下のスクリプトを作成する。

#!/bin/bash
echo "現在時刻は $(date +"%Y-%m-%d %H:%M:%S") です。「ひゃまだ家」の部屋の $(/home/pi/bin/hd.py) で、Raspberry Pi3のCPU温度は $(vcgencmd measure_temp) です。(^^♪" | /usr/local/bin/tw --pipe

上記ページのとおり、作成したスクリプトをcrontabに登録して、実際につぶやくと以下のとおりになる。

現在時刻は 2019-04-22 20:43:42 です。「ひゃまだ家」の部屋の 温度= 27.0 ℃, 湿度= 57.7 %, 飽差(HD)= 10.90 g/m3 で、Raspberry Pi3のCPU温度は temp=53.7'C です。(^^♪</
pre>

実際にtwitterでつぶやいている様子は、以下のようになる(かなり無駄なつぶやきが多い^^;)。

おわりに

不明な部分があったら、hymd3a アット gmail.comか、上記のtwitterアカウントにダイレクトメールして質問を。

それでは、また。

関連ページ