DSM501A粉塵センサーで作るArduino空気質モニター
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | メインマイコン |
| DSM501A粉塵センサーモジュール | 1 | PM2.5/PM10検出対応 |
| 英数字LCD 16×2文字 | 1 | HD44780互換 |
| 40mmファンキット | 1 | センサー内部の空気循環用 |
| LED(汎用) | 5 | 空気質レベル表示用(白・緑・黄・赤・青) |
| 抵抗 221Ω | 1 | LCDコントラスト調整用 |
| ポテンショメーター 10kΩ | 1 | LCD輝度調整用 |
必要な工具
- はんだごて
使用アプリ・オンラインサービス
- Arduino IDE
プロジェクト概要
空気質モニタリングは1980年代から確立された科学ですが、当時は技術的制約が大きく、装置は複雑で高価でした。しかし現代では、より精密で高速、小型、低コストなソリューションが実現しています。
本プロジェクトでは、Samyoung製「DSM501A」粉塵センサーを使用します。これは市場で最も安価なセンサーの一つで、AliExpressなどで数ドルで購入可能です。PM2.5およびPM10粒子の検出が可能です。
センサーのピン配置
DSM501Aのピン配置は以下の通りです(配線色は参考程度に)。
- Vout1(PM2.5)→ Arduino D2
- Vout2(PM10)→ Arduino D3
- Vcc → Arduino 5V
- GND → Arduino GND

回路構成
回路は非常にシンプルです。LEDダイオードはArduinoのアナログピンA1〜A5に接続し、コード内で出力として定義します。LCDディスプレイ(16×2文字、HD44780互換)にはPM10濃度(個/0.01cf)と空気質の5段階評価を表示します。
空気質レベル判定基準
- Clean(清潔):PM10 < 1,000
- Good(良好):1,000 ≦ PM10 < 10,000
- Acceptable(許容):10,000 ≦ PM10 < 20,000
- Heavy(汚染):20,000 ≦ PM10 < 50,000
- Hazard(危険):PM10 ≧ 50,000
PM10とPM2.5の両濃度はシリアルモニターでも確認可能です。汚染度合いに応じて対応する色のLEDが点灯するため、一目で状況が把握できます。

重要なポイント
センサーの排気口にファンを取り付けて空気を吸引させると、不要なピーク値を大幅に抑制でき、測定精度が向上します。全体は電気設備用のプラスチックケースに収納しています。
今後の展開
今後、さらにいくつかの安価な粉塵センサーをテストし、比較結果を次のプロジェクトで公開予定です。
ソースコード
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int pin2 = 3;
int pin1 = 2;
unsigned long duration1;
unsigned long duration2;
unsigned long starttime;
unsigned long sampletime_ms = 30000; // サンプリング時間 30秒
unsigned long lowpulseoccupancy1 = 0;
unsigned long lowpulseoccupancy2 = 0;
float ratio1 = 0;
float ratio2 = 0;
float concentration1 = 0;
float concentration2 = 0;
int wLed = A1; // 白:Clean
int gLed = A2; // 緑:Good
int yLed = A3; // 黄:Acceptable
int rLed = A4; // 赤:Heavy
int bLed = A5; // 青:Hazard
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(wLed, OUTPUT);
pinMode(gLed, OUTPUT);
pinMode(yLed, OUTPUT);
pinMode(rLed, OUTPUT);
pinMode(bLed, OUTPUT);
starttime = millis();
lcd.begin(16, 2);
}
void loop() {
duration1 = pulseIn(pin1, LOW);
duration2 = pulseIn(pin2, LOW);
lowpulseoccupancy1 += duration1;
lowpulseoccupancy2 += duration2;
if ((millis() - starttime) > sampletime_ms) {
ratio1 = lowpulseoccupancy1 / (sampletime_ms * 10.0);
concentration1 = 1.1 * pow(ratio1, 3) - 3.8 * pow(ratio1, 2) + 520 * ratio1 + 0.62;
ratio2 = lowpulseoccupancy2 / (sampletime_ms * 10.0);
concentration2 = 1.1 * pow(ratio2, 3) - 3.8 * pow(ratio2, 2) + 520 * ratio2 + 0.62;
lcd.setCursor(0, 0);
lcd.print("PM10 ");
lcd.setCursor(6, 0);
lcd.print(concentration1, 3);
Serial.print("concentration1 = ");
Serial.print(concentration1);
Serial.print(" pcs/0.01cf - ");
Serial.print("concentration2 = ");
Serial.print(concentration2);
Serial.print(" pcs/0.01cf - ");
// LCD第2行クリア
lcd.setCursor(0, 1);
for (int i = 0; i < 16; ++i) lcd.write(' ');
// レベル判定とLED制御
if (concentration1 < 1000) {
lcd.setCursor(4, 1); lcd.print("CLEAN");
digitalWrite(wLed, HIGH); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW);
digitalWrite(rLed, LOW); digitalWrite(bLed, LOW);
} else if (concentration1 < 10000) {
lcd.setCursor(4, 1); lcd.print("GOOD");
digitalWrite(wLed, LOW); digitalWrite(gLed, HIGH); digitalWrite(yLed, LOW);
digitalWrite(rLed, LOW); digitalWrite(bLed, LOW);
} else if (concentration1 < 20000) {
lcd.setCursor(4, 1); lcd.print("ACCEPTABLE");
digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, HIGH);
digitalWrite(rLed, LOW); digitalWrite(bLed, LOW);
} else if (concentration1 < 50000) {
lcd.setCursor(4, 1); lcd.print("HEAVY");
digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW);
digitalWrite(rLed, HIGH); digitalWrite(bLed, LOW);
} else {
lcd.setCursor(4, 1); lcd.print("HAZARD");
digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW);
digitalWrite(rLed, LOW); digitalWrite(bLed, HIGH);
}
lowpulseoccupancy1 = 0;
lowpulseoccupancy2 = 0;
starttime = millis();
}
}
回路図

製造プロセス
- OpenSensorsで空気質を測定: ArduinoとPythonによるガイド
- Heliumベースのソーラー駆動空気質センサー:設計と導入ガイド
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- スマートホーム連携向けマルチポジション温度センサーシステム
- K30 CO2センサで室内空気質をリアルタイム監視する
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino、Yaler、IFTTTでWeb対応IoTゲージを構築する
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- 高性能 Arduino 気象観測気球データロガーの製作ガイド
- 先進カーボンベースNO₂センサーが室内空気質モニタリングを強化