ダストセンサーDSM501AでPM1.0(以上の)粒子数カウントしてみた
PM1.0を計測できるのか?と思いきや
PM1.0以上のサイズの粒子をカウントできるよというもののようだ。
PWM出力されるパルスを30秒間計測して、その中でLOWパルス幅の全体に占める比率から
粒子数を出すというもの。
もちろん、データシートにメーカー側が
「Lowパルス幅の占有率に対する粒子数」
のグラフを用意してくれているので、そのグラフを元に粒子数出してる。
(合っているのか?)
とりあえず、いろんな所で計測してみて、自分でも
この値からは空気が悪そうだというデータをとったほうが良さそうな気もする。
ピン配置は下記で左からPin1~Pin5
Pin1: コントロール(Vout1用のコントロール)
Pin2: Vout2 (PM1.0以上計測用)
Pin3: VCC
Pin4: Vout1 (PM2.5以上計測用)
Pin5: GND
以下が今回使ったArduino用スケッチコード
// DSM501A Pin3 → Arduino 5V // DSM501A Pin5 → Arduino GND // PM1.0以上を計測したい場合:DSM501A Pin2 → Arduino D8 // PM2.5以上を計測したい場合:DSM501A Pin4 → Arduino D8 // Wind Abaft Co., Ltd. #include<string.h> byte buff[2]; int pin = 8;//DSM501A input D8 unsigned long duration; unsigned long starttime; unsigned long endtime; unsigned long sampletime_ms = 30000; // データシートの計測方法が30秒のため unsigned long lowpulseoccupancy = 0; float ratio = 0; float concentration = 0; int i=0; void setup() { Serial.begin(9600); pinMode(8,INPUT); starttime = millis(); } void loop() { duration = pulseIn(pin, LOW); lowpulseoccupancy += duration; endtime = millis(); if ((endtime-starttime) > sampletime_ms) { ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0); // Integer percentage 0=>100 concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // データシートのグラフ参照 Serial.print("lowパルス幅(30秒間):"); Serial.print(lowpulseoccupancy); Serial.print(" Lowパルス幅の占有率[%]:"); Serial.print(ratio); Serial.print(" DSM501A計測粒子数[pcs/283ml]:"); Serial.println(concentration); lowpulseoccupancy = 0; starttime = millis(); } }