部屋の空気の淀み感:Raspberry Piを使った不快指数モニタリング
前回記事でCO2ガスセンサを搭載するところまで、お話しました。
しかし実際に運用してみて分かったことがあります。
「この部屋の空気が淀んでいるな」と感じたときに、センサ出力値を見てみると・・・
700 ppm!!
・・・あれ、ぜんぜん高くない。。
そうなんです。
一週間ほど運用して分かったのですが、"空気の淀み感"の正体は、どうやらCO2濃度が高いことと、一致しないことが分かってきました。
この感覚は、私だけでなく妻も一緒だったようで、"何か不快感があるけど、ガス濃度は低いんだね"ということが度々ありました。
しかし、"空気の淀み感"の正体って、物理的には何なんだろう。。
CO2濃度でないとすると、、、
ひょっとして不快指数??
と思うようになりました。
不快指数については、以前の記事でも一度触れています。
思い立ったら作ってみる!!ということで、先日のモニタリングシステムに、不快指数の表示も追加することにしました。
不快指数の計算は、以下になります。
(式)不快指数 = 0.81 × 気温(℃) + 0.01 × 湿度(%) × (0.99 × 気温(℃) − 14.3) + 46.3
気温と湿度から計算できるので、Raspberry PiやMySQLの変更を加えることなく、表示部をいじるだけで実装可能です。
ということで、早速作ってみました。コードは以下になります。
【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>
さて、コードは書けました。
気になる出力結果はというと、以下のとおりです。
黒線が不快指数を示すグラフです。
不快指数の指標は、個人差があるそうですが、
指数70以上で不快と感じる人が出始め、
75以上で半数以上が、
80以上で全員が不快と感じ、
86を超えると我慢できなくなるそうです。
実際に計測した値を見てみると、、、
75を上回っていました
どおりで、部屋にいると不快感を感じる訳ですね(^▽^;)
1月に計測したときは、不快指数は70前後だったのですが、今日は気温が上昇したこともあり、不快指数が高まっていたようです。
空気が淀んだような感覚だったのですが、湿度と温度のバランスが悪く、不快感を感じるレンジだったのですね。換気不足が原因ではなかったことが分かりました。
体感だけに頼らずに、センサデータを蓄積してみると、視野が広がりますね。
せっかく作ったモニタリングシステムですので、健康管理目的でも、積極的に使いたいと思います!!