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

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

部屋の空気の淀み感:Raspberry Piを使った不快指数モニタリング

前回記事でCO2ガスセンサを搭載するところまで、お話しました。

しかし実際に運用してみて分かったことがあります。
「この部屋の空気が淀んでいるな」と感じたときに、センサ出力値を見てみると・・・




700 ppm!!




・・・あれ、ぜんぜん高くない。。






そうなんです。


一週間ほど運用して分かったのですが、"空気の淀み感"の正体は、どうやらCO2濃度が高いことと、一致しないことが分かってきました。


この感覚は、私だけでなく妻も一緒だったようで、"何か不快感があるけど、ガス濃度は低いんだね"ということが度々ありました。




しかし、"空気の淀み感"の正体って、物理的には何なんだろう。。

CO2濃度でないとすると、、、



ひょっとして不快指数??



と思うようになりました。

不快指数については、以前の記事でも一度触れています。



思い立ったら作ってみる!!ということで、先日のモニタリングシステムに、不快指数の表示も追加することにしました。



不快指数の計算は、以下になります。

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



気温と湿度から計算できるので、Raspberry PiMySQLの変更を加えることなく、表示部をいじるだけで実装可能です。



ということで、早速作ってみました。コードは以下になります。


【Web_Display.py】

<!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;
     //データをjson形式で取得し、temp_dataという変数に代入する
    $.ajax({
    url: "mysql_CO2.php", //データ取得のURL
    type: "GET", //GETメソッドで取得
    dataType: 'json', //処理結果はjson形式で受信
    async: false, //非同期通信
    data: {
           target: 'temp',
           range: selectspan
          },
    success: function(json1) { temp_data = json1;} 
    });
     //データをjson形式で取得し、hum_dataという変数に代入する
    var hum_data;
    $.ajax({
    url: "mysql_CO2.php", //データ取得のURL
    dataType: 'json',
    async: false,
    data: {
           target: 'hum',
           range: selectspan
          },
    success: function(json1) { hum_data = json1;}
    });
     //データをjson形式で取得し、lux_dataという変数に代入する
    var lux_data;
    $.ajax({
    url: "mysql_CO2.php", //データ取得のURL
    dataType: 'json',
    async: false,
    data: {
           target: 'lux',
           range: selectspan
          },
    success: function(json1) { lux_data = json1;}
    });
     //データをjson形式で取得し、co2_dataという変数に代入する
    var co2_data;
    $.ajax({
    url: "mysql_CO2.php", //データ取得のURL
    dataType: 'json',
    async: false,
    data: {
           target: 'co2',
           range: selectspan
          },
    success: function(json1) { co2_data = json1;}
    });
    // ======================================
    //          絶対湿度 & 不快指数の計算
    // ======================================
    var abs_hum_data = [];
    var abs_hum_data_temp;
    var discomfort_index_data = [];
    var discomfort_index_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;
	discomfort_index_data_temp = 0.81*t + 0.01*RH*(0.99*t - 14.3) + 46.3;

	abs_hum_data.push( {"label": hum_data[i]["label"], "y": abs_hum_data_temp} );
	discomfort_index_data.push( {"label": hum_data[i]["label"], "y": discomfort_index_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",
                            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"
                        },
                        {
                            title: "CO2 Concentration",
                            lineColor: "#008000",
                            tickColor: "#008000",
                            labelFontColor: "#008000",
                            titleFontColor: "#008000",
                            includeZero: false,
                            suffix: "ppm"
                        },
                        {
                            title: "Discomfort Index",
                            lineColor: "#000000",
                            tickColor: "#000000",
                            labelFontColor: "#000000",
                            titleFontColor: "#000000",
                            includeZero: false,
                            suffix: ""
                        }
			],
                    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',  //co2グラフの種類
                        name: "CO2",
                        color: "#008000",
                        axisYIndex: 3,
                        showInLegend: true,
                        dataPoints: co2_data //表示するデータ
                    },
                    {
                        type: 'line',  //D.I.グラフの種類
                        name: "D.I.",
                        color: "#000000",
                        axisYIndex: 4,
                        showInLegend: true,
                        dataPoints: discomfort_index_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 Zeroを使った不快指数のモニタリング


黒線が不快指数を示すグラフです。



不快指数の指標は、個人差があるそうですが、
指数70以上で不快と感じる人が出始め、
75以上で半数以上が、
80以上で全員が不快と感じ、
86を超えると我慢できなくなるそうです。

実際に計測した値を見てみると、、、



75を上回っていました




どおりで、部屋にいると不快感を感じる訳ですね(^▽^;)

1月に計測したときは、不快指数は70前後だったのですが、今日は気温が上昇したこともあり、不快指数が高まっていたようです。



空気が淀んだような感覚だったのですが、湿度と温度のバランスが悪く、不快感を感じるレンジだったのですね。換気不足が原因ではなかったことが分かりました。



体感だけに頼らずに、センサデータを蓄積してみると、視野が広がりますね。
せっかく作ったモニタリングシステムですので、健康管理目的でも、積極的に使いたいと思います!!