Dust sensor設置メモ
ハウスダスト気になる
もともとハウスダストに弱く、一時期咳が本当にひどかったので、
埃を計測しようと軽い気持ちでやりました.
なお、コロってはいません。
どうせなら便利な代物があるだろうと思い、千石に出向いてPPD42NS購入しました。
下記はヨドバシですが、お値段1980と少々高め。まぁ普通の3軸とかに比べれば大したことはない。
センサーの仕様
こちらはseeed technology というメーカーが作っていて、公式サイトに製品紹介・使い方とか色々乗ってる
センサーは6軸とかしか使ったことないので、少し新鮮な気持ち。大きいし実感だけはある。
そこによると、、、
タバコ煙濃度や室内の粉塵濃度を敏感に正確に反映できます。
https://wiki.seeedstudio.com/jp/Grove-Dust_Sensor/
内蔵の空気加熱装置で自動的に空気を集めることができます。
メンテナンスは容易で、高感度は長持ちします。
アウトプットが二つあり、 1μm以上と、2.5μm以上の微粒子濃度を同時に出力できます。
軽便で、組み立ては簡単です
Grove-ダストセンサーは空気中粉塵濃度の測定によって、空気質を反映するモジュールです。
一定時間内のLowパルスの占有時間(Low Pulse Occupancy time:LPO time)によりParticulate Matterレベル(PMレベル)が分かります。PM濃度はLPO timeに正比例します。Grove-ダストセンサーは直径 1μmの微粒子までも検出でき、空気清浄機システムに信頼できるデータを提供できます。
調べたところ、ダストを測定する計測器は大きく2種類。Particle counter と粉じん計があるらしい。
仕組みは、こちらのように
①空気を吸ってトンネルに通す
②レーザで照射して
③射影で写った面積とる
④面積を電気信号に変換。
というかんたんな仕組み。
またレーザ照射方向をふやすことで、被測定物を捉える次元が上げるので、体積とか撮れるようになる!
両者の差分ですが、今回はそこまで深入りせず、
Particle counter:X個/(体積)
粉じん計:X mg/(体積)
という違いだけ抑えて、向き不向きは今回不問とします。
言い忘れましが、このセンサーはParticle counterです。
仕様書はこちらで大体1μmが測定粒度らしいです。
下記は真面目な別製品の比較表です。pm2.5は2.5μm以下らしいです。
更に仕様書をみると、こんなグラフたちがあります。解釈すると
- DOWN( 0v) time = ホコリがある時間。これをLOPといい、30秒中の占有率で粉塵濃度がわかるよ
- タバコの煙(とれないのでは??)の粒子数(粉塵濃度)とLOPの関係グラフ。これを逆算したもんのはコード中に定義されている。
- concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62
- 粒子の種類に影響するのかはわからない
この分野に疎いのですが、pcs/ft3という単位で側庭するそうです。ftという単位に馴染みないので、一応補足
たぶんメーカーの公式だと思われるブログや公式に色々tipsがありました
- 暗い部屋でやろう。レーザー照射に影響出るよ
- 直立させてやろう。(たぶん空気を通過させるため)
- ノイズがすごいので、平滑化しよう
- 抵抗につないだりすると敏感になるよ
- 扇風機回したり、30秒ではなくて15秒計測*2の平均とかとればより正確になるよ
Raspiにつないで計測してみる。
raspiへの接続ですが、公式見ると変換モジュールっぽいもの必用だと書いています
が、hi:4v, low:0vなので直でraspiにつないで問題なさそうです。高いし、、、、
データシートにも
- 1 : COMMON(GND)
- 2 : OUTPUT(P2)
- 3 : INPUT(5VDC 90mA)
- 4 : OUTPUT(P1)
- 5 : INPUT(T1)・・・FOR THRESHOLD FOR [P2]
で1,3必須で2,4,5は状況に応じてという感じ。P1はPM1用、P2は閾値設定できるらしいが、操作方法に記載がない?このあたりは時間あったら調べます。
raspiへの接続はかんたんにこんな感じにしました。配線はテキトーです。
本当はPPD42NSを基盤に直でつなげたかったのですが、
Connecterでいいのがなかったので、もとのコネクターを引っこ抜いて持ってたジャンプワイヤーでつなげた仕様です
早速計測を開始します。回したコードはこちら、単純に30秒ごとに計測。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
mport RPi.GPIO as GPIO import time from datetime import datetime as dt import logging import json import sys import logging logger = logging.getLogger(__name__) fmt = "[%(asctime)s][%(levelname)s] %(name)s :%(message)s" logging.basicConfig(level=logging.DEBUG, format=fmt) class ParticleCounter(): def __init__(self,sampling_sec): self.sampling_sec = 30 pass def set_pin_number(self, PIN=21): self.PIN = PIN GPIO.setmode(GPIO.BCM) GPIO.setup(self.PIN, GPIO.IN) GPIO.setwarnings(False) def particle_count(self, count_times=10): self.count_times = count_times logging.info("Start") for i in range(self.count_times): logging.info("Rev:{0}".format(i)) low_pulse_time_rst = self.get_low_pulse_time() concentration_rst = self.get_concentration(low_pulse_time_rst['during_low'],low_pulse_time_rst['t_end']) low_pulse_time_rst.update(concentration_rst) logger.info(" Rst:{0}".format(low_pulse_time_rst['concentration'])) self.write_data(low_pulse_time_rst) def get_low_pulse_time(self): t_start = time.time() during_low,t_current = 0,0 while True: during_low += self.time_low() t_current = (time.time() - t_start) if (t_current > self.sampling_sec): break return {'during_low':during_low, 't_start':t_start, 't_end':t_current} def get_concentration(self,during_low_sec, sampling_sec): ratio = 100*during_low_sec/sampling_sec; concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62 return {'ratio':ratio, 'concentration':concentration} def write_data(self,dict_obj): # dict_obj['write_time'] = dt.now().strftime("%Y%m%d%H%M%s%Z") dict_obj['write_time'] = dt.now().strftime("%Y%m%d%H%M%S") with open('file.txt', 'a') as file: file.write(json.dumps(dict_obj)) file.write(',\n') def time_low(self): t_start = time.time() t_end = time.time() if GPIO.input(self.PIN) == 1: return 0.0 while GPIO.input(self.PIN) == 0: t_end = time.time() return (t_end - t_start) |
計測時の天気はこちら。
また平日は基本出社で不在。土日は窓を開けっぱにしてますね。
洗濯物は基本部屋干し。11日深夜から12日まで干しっぱ
15日はこちら
7日間計測した結果
まず、生データはこちら。
やはりノイズやボラがすごいので平滑化で回避します。
20期移動平均→10分移動平均で見てみます。
長いように見えますが、そもそもホコリは動きが遅いだろうと推測し、長めに取った次第です
9/9の14時が異常ですので、拡大します。
いくつか思ったこと
- 深夜から14時に向かって上昇。9, 10, 11 が特に顕著
- 帰宅時間帯は比較的落ち着いている
- 休日の11,12は窓を開けていたが、特段変わらず
- 洗濯物の影響も特になし。その後12日も特段上昇傾向なし
- 家に帰ってきた。起床した。→一時的に急激な上昇する
- たとえば12日の12時〜14時は一時帰宅
- 他5時起き、8時起きが言われてみればわかる(ここは言いたくないので詳しく言わない)
- 22時近辺はアニメ見ながら飯食っているのでボラが大きい。
- →とはいえ、早朝ほどではない
- 天候は若干の影響のみ?
- 部屋は基本締め切り。今週は天気は良くなく、humidity > 70%は普通で湿度高め
- 晴れ日の10,15は1日を通して変動がほか日よりも少ない
あくまで自分ちに限定すると
- 天候はそこまで関係ない
- 自分がいない+寝ている間にホコリがたまる
- 動いていると舞っていて、計測に引っかからない
- 洗濯しても急上昇とかしない
- 動きたて(帰ってきた)の近辺はホコリが舞う
- 積もってたものがかき乱されるため
本来、暗所設置が基本ですが今回は設備なかったので、少し明るい空間でした。
とはいえ、基本平日家にいるには数時間なので大した影響はないように見えますね
ただ高さは考えたほうがいいかと思った。おそらく沈着する時間が数値に大きく影響するかと
残念ながら、今回のやる気の元になった咳がひどい現象は今週はありませんでした、
なので、決定的原因みつかるまで測定しようか悩むとこ。。。
ちなみに上のConcetration値の効果を示した試料がこれしかなかった。本当は家屋内のstandardが欲しかった。
Class3~5だと結構きれいらしい。ってことは、うち、きれいなのかな?