日常生活の物理|身近で体験できる科学のブログ

日常に関すること、何でもつぶやきます。物理的な視点を加えることが多いかも。

温湿度計作り(8) : Raspberry Piを使った絶対湿度計測(&風邪・コロナ対策)

さて、作りたかったことの大枠は完成しました。
今回はちょっとした作りこみです。

これは個人的なこだわりですが、”湿度”では健康状態(特に喉のうるおい状態)をコントロールするには不十分と考えています。”湿度”は正確には”相対湿度(%)”のことを意味し、空気中に存在可能な水蒸気の最大量(g/㎥)と、実際に空気中に存在する水蒸気量(g/㎥)の比とされています。専門用語では、空気中に存在可能な水蒸気の最大量を”飽和水蒸気量(g/㎥)”、実際の水蒸気量を”絶対湿度(g/㎥)”といい、次式のように表せます。

(式)相対湿度(%) = 絶対湿度(g/㎥) ÷飽和水蒸気量(g/㎥)

“相対湿度”では何が問題なのか、というと、”飽和水蒸気量”は温度によって変化するパラメータである、という点です。以下のグラフのように変化するとされています。

相対湿度の温度特性グラフ

環境省が推奨している冬場と夏場の室温は、夏は28℃、冬は20℃とされています。上のグラフで”飽和水蒸気量”を調べてみると、夏場は約30 g/㎥であるのに対して、冬場は約20 g/㎥ですね。

ここで、仮に部屋に存在する水分量(=”絶対湿度”)が10 g/㎥とすると、夏場は”飽和水蒸気量”が30 g/㎥なので、”相対湿度”は33.3%。一方、冬場は”飽和水蒸気量”が20 g/㎥なので、”相対湿度”は50%になります。このように”飽和水蒸気量”によって、”相対湿度”が変化するのですね。

”飽和水蒸気量”の直感的なイメージは、コップの容器の大きさです。コップの中に入っている水の量が”絶対湿度”で、コップのうちに占める水の比率(全容量のうち、何パーセントを占めるか)が”相対湿度”です。空気を吸ったときに、その中にどれだけの水分が含まれているかを示すのは、”相対湿度”ではなく、”絶対湿度”なのですね。

湿度、相対湿度、絶対湿度、飽和水蒸気量のイメージ

さて、”相対湿度”では健康状態をコントロールするには不十分と最初に述べましたが、じゃあどうやって評価したら良いかというと、”絶対湿度”です。”絶対湿度”は、喉のうるおいに関係するパラメータで、あるページで紹介されていた宮城県医師会のデータによると、”絶対湿度”とインフルエンザの流行には関係があり、以下の指標だそうです。
・〜7g/㎥ :より起こりやすい
・7〜11g/㎥:流行しやすい
・11〜g/㎥ :流行しにくい

最近は新型コロナウイルスの事情もありますし、”絶対湿度”を11 g/㎥以上に保つことは、ウイルス感染のリスクを減らす有効な手段と考えています。

*****************

そこで、これまでのRaspberry Piのシステムに、絶対湿度計測を追加することにしました。
過去記事はこちら↓
dailyphysics.hatenablog.com

”絶対湿度”は次式で計算できます。

(式)絶対湿度 (g/㎥) = 217*(6.1078*10^(7.5*温度(℃)/(温度(℃)+237.3)))/(温度(℃)+273.15)*相対湿度(%)/100

ソースコードは以下のとおりです。
表示部分のみを更新し、MySQL等のソースコードは、前回記事のままとしています。
絶対湿度は、これまで取得してきた温度と相対湿度だけで算出できるので楽ですね。

【Graph02.php

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>センサーデータ</title>
    <script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script type="text/javascript">
    function drawChart(selectspan) {
    var temp_data;
    $.ajax({
    url: "MySQL.php", 
    type: "GET", 
    dataType: 'json', 
    async: false, 
    data: {
           target: 'temp',
           range: selectspan
          },
    success: function(json1) { temp_data = json1;} 
    });
    var hum_data;
    $.ajax({
    url: "MySQL.php", 
    dataType: 'json',
    async: false,
    data: {
           target: 'hum',
           range: selectspan
          },
    success: function(json1) { hum_data = json1;}
    });
    var lux_data;
    $.ajax({
    url: "MySQL.php", 
    dataType: 'json',
    async: false,
    data: {
           target: 'lux',
           range: selectspan
          },
    success: function(json1) { lux_data = json1;}
    });
    // ======================================
    //          絶対湿度計算
    // ======================================
    var abs_hum_data = [];
    var abs_hum_data_temp;
    var t;
    var RH;
    var $content = $('#content');
    $content.append("<li>" + "データ一覧" + "</li>");
    $content.append("<li>" + hum_data.length + "</li>");
    for (var i =0; i<hum_data.length; i++) {
	$content.append("<li>" + hum_data[i]["y"] + ":" + temp_data[i]["y"] + "</li>");
	t = temp_data[i]["y"];
	RH = hum_data[i]["y"];
	abs_hum_data_temp = 217*(6.1078* Math.pow(10.0, 7.50*t/(t+237.3))) / (t+273.15)*RH/100;
	abs_hum_data.push( {"label": hum_data[i]["label"], "y": abs_hum_data_temp} );
    }
    // ======================================
                var chart = new CanvasJS.Chart(chartContainer01, {
                    title: {text: "温度・湿度・照度データ"},
                    axisX: { labelAngle: -90, labelFontSize: 14, labelFontColor: '#222'},
                    axisY:[{
                            title: "Tempreture",
                            lineColor: "#C24642",
                            tickColor: "#C24642",
                            labelFontColor: "#C24642",
                            titleFontColor: "#C24642",
                            //includeZero: false,
                            suffix: "℃"
                        },
                        {
                            title: "Humidity",
                            lineColor: "#369EAD",
                            tickColor: "#369EAD",
                            labelFontColor: "#369EAD",
                            titleFontColor: "#369EAD",
                            includeZero: false,
                            suffix: "%"
                        },
                        {
                            title: "Abs. Humidity",
                            lineColor: "#360EAD",
                            tickColor: "#360EAD",
                            labelFontColor: "#360EAD",
                            titleFontColor: "#360EAD",
                            includeZero: false,
                            suffix: "[g/m3]"
                        }],
                    axisY2: {
                            title: "Illuminance",
                            lineColor: "#FF8C00",
                            tickColor: "#FF8C00",
                            labelFontColor: "#FF8C00",
                            titleFontColor: "#FF8C00",
                            includeZero: false,
                            suffix: "lx"
                        },
               toolTip: {shared: true},
               legend: {cursor: "pointer",itemclick: toggleDataSeries},
               
                    theme: "light1",  //テーマを設定
                    data: [{
                        type: 'line',  //温度グラフ
                        name: "temperature",
                        color: "#C24642",
                        showInLegend: true,
                        axisYIndex: 0,
                        dataPoints: temp_data //表示するデータ
                    },
                    {
                        type: 'line',  //湿度グラフ
                        name: "humidity",
                        color: "#369EAD",
                        axisYIndex: 1,
                        showInLegend: true,
                        dataPoints: hum_data //表示するデータ
                    },
                    {
                        type: 'line',  //絶対湿度グラフ
                        name: "abs_humidity",
                        color: "#360EAD",
                        axisYIndex: 2,
                        showInLegend: true,
                        dataPoints: abs_hum_data //表示するデータ
                    },
                    {
                        type: 'line',  //照度グラフ
                        name: "illuminance",
                        color: "#FF8C00",
                        axisYType: "secondary",
                        showInLegend: true,
                        dataPoints: lux_data //表示するデータ
                    }]
                });
    chart.render();

    function toggleDataSeries(e) {
    if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
        e.dataSeries.visible = false;
    } else {
        e.dataSeries.visible = true;
    }
    e.chart.render();
    }
    }
    </script>
  </head>
  <body onload= drawChart('Day')>
      <form>
      <select name="selectspan" onchange="drawChart(this.value)">
        <option value="Day" selected="">1日</option>
        <option value="Week">1週間</option>
        <option value="Month">1ヵ月</option>
        <option value="Average">1ヵ月平均</option>
      </select>
    </form>
    <div id="chartContainer01" style="height: 450px; width: 100%;"></div><br>
  </body>
</html>

これで、絶対湿度のグラフ(青字)が追加されました。

Raspberry Pi Graph (Temperature, Humidity Absolute Humidity, Illuminance)、ラズパイの温湿度グラフ

*****************

さてせっかくなので、絶対湿度を使って、とある日中に換気したときの様子を分析してみました。

テスト日の行動は、①朝から昼まで暖房をつけ、②昼過ぎに一度暖房を消して20分程窓を開けて換気し、③夕方頃まで窓を閉めた状態にし、④気温が下がってきた夕方過ぎに暖房を再度付けました。①~④の間、加湿器はずっとオンのままにしていました。
※ 補足ですが、この実験は若干環境ストレスがかかるので、妻がいない日に実施しています

実験結果がこちらです↓

ラズパイを使った湿度、絶対湿度、相対湿度の変化実験。換気や暖房や加湿器のRaspberry Piセンサ影響。

こうしてデータを見比べてみると、面白いですね。

まず②で換気したタイミングで、温度(Temperature)・相対湿度(Humidity)・絶対湿度(Abs. Humidity)がガクンッと落ちています。この日は冬場(1月)でしたので、いずれの数値も下がりました。

③で窓が閉まっている間は、暖房をつけていなかったので、夕方にかけて徐々に温度は低下しました。13:15頃に微増したのは、私という約36 ℃の熱源があるために室温が僅かに上昇したのだと考えられます。
相対湿度と絶対湿度については、加湿器を動かしたので大きく上昇しました。しかしながら、相対湿度が60%に達しない段階で、頭打ちになりました。調べてみると、加湿器で上げられる湿度は、最大でも60~70%だそうで、窓での結露等があるために頭打ちになるそうです。

④で暖房をつけた直後(16:30頃)、室温が大きく上昇します。室温が上昇することで飽和水蒸気量が増加しますので、相対湿度は減少します。(絶対湿度は、短時間の変化ではほぼ一定) 私が相対湿度のグラフを嫌がったのはこうした挙動があるからで、相対湿度だけを見ていると、あたかも部屋の空気が乾燥してしまったかのように勘違いしてしまいます。実際には、暖房をつけた直後の絶対湿度は一定です。
また興味深いのは17:30以降の絶対湿度の挙動で、僅かではありますが増加しています。これは、温度が増加して、飽和水蒸気量が増加しているのにも関わらず、加湿器が相対湿度約48%を維持してくれたためです。コップに例えるなら、コップの容積(=飽和水蒸気量)が大きくなっていくのにも関わらず、コップの中に占める水の比率(=相対湿度:48%)が変わらなかった、という状態ですね。これは、コップの容積の増加に合わせて、水の量が増えたことに他なりません。

部屋の絶対湿度を高めるには、加湿器と暖房の双方をつけることが大事、ということを裏付ける結果ですね。こうしたデータをふまえ、我が家では、11 g/㎥を下がらないよう、加湿器と暖房を入れることを心掛けています。

環境や部屋の大きさ、加湿器の種類によって、それぞれのお家に最適なカスタマイズもあると思います。加湿器をつけるだけで十分なお部屋、今の加湿器は小さく11 g/㎥には達しないので交換しなくてはいけない、などなど。もしこの記事を読まれた方で、絶対湿度計測に興味を持って頂ける方がいたら、是非ラズパイを使った計測に挑戦してもらいたいです!

*****************

以下、余談です。
温度・湿度の上昇により不快感を感じるかどうか、日中の体感でテストしていたのですが、私は18:00頃を境に不快感を感じるようになりました。

この感覚を検証するために、温度と湿度から不快指数も計算してみました。不快指数は次式で計算できます。

(式)不快指数 = 0.81 × 気温(℃) + 0.01 × 湿度(%) × (0.99 × 気温(℃) − 14.3) + 46.3

得られたデータを見てみると、暖房を入れる前の16:15に21.8℃で57.5%(不快指数:68.1)であったのに対して、不快感を感じた18:00頃は26.2℃で48.8%(不快指数:73.2)と、確かに不快指数が上昇していました。

不快指数の指標は、個人差があるそうですが、指数70以上で不快と感じる人が出始め、75以上で半数以上が、80以上で全員が不快と感じ、86を超えると我慢できなくなるそうです。センサを置いている場所は、暖房が当たらない部屋の隅に置いているのに対して、私が日中いた場所は暖房の風が当たる場所でした。私の周りの空気の温度が、センサ値よりも若干高かったとすると、75を超えていた可能性もあるので、18:00を境に不快感を感じ始めたのは、体感としても妥当な頃合いだったと考えられます。

不快指数をラズパイで表示してみるのも、楽しそうですね。