SensirionのSPS30という粒子状物質(PM2.5)センサーを使ったときのメモです
センサー
センサー類はセンシリオンがよい。性能が良くて、その割に安価。
センサー | 公称精度(PM2.5) | 濃度域 | 備考 |
---|---|---|---|
Sensirion SPS30 | 0–100 µg/m³で±(5 µg/m³+読値の5%)、100–1000 で±10% | 0–1000 µg/m³ | 校正はDustTrak DRX基準。10年以上設計寿命、MCERTS取得。(Sensirion) |
Panasonic SN-GCJA5 | 0–35 で±5 µg/m³、35–1000 で±10% | 表示0–2000 µg/m³ | 0.3 µm以上検出。公称寿命5年。(パナソニック) |
MemsFrontier MPM10 series | 0–100 で±10 µg/m³、100–500 で±10%(“mass concentration consistency”) | 0–1000 µg/m³ | 仕様は素子間一致性であり参照器に対する絶対誤差ではありません。(ロブ.in) |
パナのセンサーも(sps30より精度は少し落ちるものの)悪くないが、価格がとっても高い(アリエクで4,000円ちょっと)。
PMセンサーは、レーザーと光検出器でpmを検出しているらしい。センシリオンsps30のチラシより。自動クリーニング機構付き。

そもそもPM2.5を測るだけなら既製品が手っ取り早くてよいのですが、安価なPM2.5モニターに使われているMPM10はファンが1~3年で壊れて異音がでるらしいので、それで1万円くらいするとなると考えます。壊れたら自分でセンサーを交換したら良いのかもしれません。
qingpingの空気質モニター 1と2が人気なようです。2はセンサーを簡単に交換可能になっているので、SPS30センサー単体を買って試行錯誤するより、これを買ったほうが良いかとも思いました。精度がそれほどいらないなら、これのがおしゃれで楽ですね。
- qingping
- 価格¥7,999(2025/09/02 08:29時点)
- Amazonで口コミ・レビューを見る
- qingping
- 価格¥22,999(2025/09/02 08:29時点)
- Amazonで口コミ・レビューを見る
あとは7万円とかの空気清浄機を買うと、そこそこの精度のpm2.5モニタがついていますね..。
購入
sps30は日本の電子部品屋さんで買うと一つ6,000円ちょいくらいだが、アリエクで1,900円。

(アリエク初回クーポンを使ったので~1750円引き。実際は2~3年前には初回購入しているが、初回クーポンは一度も使っていなかったので残っていた。)
USB-UARTドングルも購入。FT232系のチップはいくつか持っているが、はんだ付けする気力はない。既製品が便利。
amazon.co.jpだと、電子部品屋さんよりちょっと安く買える。
注文から到着まで7日くらい。


ほかの中華系のショッピングサイトでシンガポールを経由してもやはり7日かかる。これがもう数日早かったら、amazonのように気軽に注文するのですが。
開封
ポスト投函されていた。


本物のようだ(笑)。どうも中国で生産されているのでむしろこちらのほうが直送で新鮮なのかもしれない。
コネクタコードもついているので、ピンにはんだ付けして、UARTドングルにつなぎます。

接続
UARTドングル
このUSB-シリアル変換ドングルのチップはCH343Gらしい。パソコンに接続したら普通にドライバが当たってシリアルポートとして認識されました。
電源
電源はパソコンのUSB端子(というかドングルの5V出力)からとることに。
sps30の電源は4.5~5.5V。MAX5.5VなのでパソコンのUSBから電源を取るときは電圧が超えていないことを確認したい。うちのmacbook proだと5.6Vあるように見えるが、仕様では5.4Vまでしか出ないようになっているらしい。たぶんアナログテスタの方の精度が悪いせい。ということでmacを信じてそのまま使う。
4.7Vのツェナーダイオードはあるが、合わせて使う適切な抵抗値が12Ωくらいで、これが14Ωになると、電流(測定時typ.55mA)が流れたときに電圧が4.5Vより低くなる可能性があるのでやめる。+-20%の炭素皮膜抵抗しかないしテスタの信頼性も低いので。
ショットキーも使うと0.2~0.3 V足されて、だいたい5 Vになるが、まあダイオードの定格電力も足りてないなど家のパーツだけだと問題が多い。
(USB 5.6V) ──[ Rs ]──●───→ +5V(相当) to Load
│
┌─┴─┐
│ ▽ │ ZD ≒ 4.7V
└─┬─┘
││→ ─|<|─ Schottky(BAT54等, 正方向)
│
(GND) ────────────────●────→ GND to Load
電流がmax 65mAもあるので、低ドロップアウトリニアレギュレータとか、スイッチング方式のDC-DC変換ICのがよいわな。
接続
SPS30はUARTとI2Cが使える。UARTのときは、VDD, RX, TX, GNDの4本を相手とつなぐだけ。I2Cのときは、SELをGNDに落とす。
今回はUARTを使うので、ドングルのRXとSPS30のTX, ドングルのTXとSPS30のRXと、VDD, GNDを接続してok。

測定
測定コマンド送信をして、グラフ化してくれるwebアプリがありますので、テストにそれをお借りします。
からhtmlをダウンロードするか
で直接使うことができます。
すんなり測定できます。


しばらく測定すると次のことがわかった
- SPS30起動時に濃度が跳ねるが40秒くらいで落ち着く。->説明書にかいてある。ファンが起動して機器内部の空気が安定するまでの時間がいる。
- 0.8 ug/m3のときは+-0.2 ug/m3くらい読み取り値が振動する。->誤差。30秒くらいの平均をとるとよいとドキュメントに書いてある。
- 1秒ごとに内部で測定されているので、1秒ごとに読み取りに行ったら新しい数値を取得できる。測定モードのままだと、データを読み取りにいってもいかなくても内部で連続して測定が行われる。
- 取得間隔は60秒位で良いとき、測定以外はアイドルにしたほうが装置が長持ちする? -> アイドルから測定モードに戻して安定するのに仕様上は最大30秒かかり、そこから30秒平均を取ると60秒になってしまう。ので稼働時間を考えるとアイドルに落とす意味がない。
- 5分とか15分に1回(1分)測定なら、稼働時間と消費電力は1/5とか1/15に落とせる。家庭の調理による汚染を見たいくらいだと15分間隔でもよいらしい。でもまあ10年だかの長寿命らしいのでわざわざアイドルにしなくてよいかもしれない。
- 1週間稼働させるごとに自動クリーニングがかかる。手動コマンドでクリーニングをかけることも可能。
- 朝、自動車が走り出すと、近所の大気汚染測定一般局ではpm2.5濃度が上がっていなくても、室内濃度がすこし上がるかも。局所的に空気が汚れているということっぽい。そらまめくん(環境省): https://soramame.env.go.jp/preview/chart/13101010/7day/NOX/PM25
- 強力な空気清浄機を買おうかと思っていたけど、いまの空気清浄機の弱風でもなんとかなっているっぽい。部屋の吸気口のそばに空気清浄機が置いてあるせいか。空気清浄機のhepaフィルターのおかげか、PM10とPM1.0の数値がほぼおなじになる。つまりPM1.0よりも大きい粒子はかなり少ない。
- 既製品PM2.5モニタで、「PM2.5とPM10の値がいつも同じ、壊れている!」と口コミに書いている人がいた。これについてはPM10が10 um以下の粒子量を意味しているので、2.5 ~ 10 umの間の粒子が少なければ、PM2.5と同じ数値になるのは間違っていない。
- 空気中にほぼPM1.0しか残っていないと、TypicalSize値が0.5 umに収束する。PM1.0の代表値が0.5 umになっているのだと思う。だから、これはうちのhepaフィルターが0.5 umの粒子を通してしまっていることを意味するわけではない。
SPS30コマンド一覧
UART/SHDLCコマンド
コード | 名称 | 説明 |
---|---|---|
0x0010 | Start Measurement | 測定開始。出力形式を指定(0x03=IEEE754 float、0x05=uint16)。Idleからのみ。 |
0x0104 | Stop Measurement | 測定停止。Idleへ戻す。 |
0x0202 | Read Data-Ready Flag | 新データ有無を取得(0x00/0x01)。ポインタ設定は初回のみで可。 |
0x0300 | Read Measured Values | 最新測定値を取得。形式は開始時に選択した出力形式に依存。 |
0x1001 | Sleep | スリープへ移行。I²Cも無効化。 |
0x1103 | Wake-up | スリープ解除。SDA低パルスまたはコマンド2回送信で復帰。 |
0x5607 | Start Fan Cleaning | 手動ファン清掃を開始。測定中のみ実行可。 |
0x8004 | Read/Write Auto Cleaning Interval | 自動清掃間隔[s]の読出し/書込み。0で無効。NVMに保存。 |
0xD002 | Read Product Type | 製品タイプ文字列を取得(推奨ID “00080000”)。 |
0xD033 | Read Serial Number | シリアル番号を取得。 |
0xD100 | Read Version | FW/ハード/プロトコルの版情報を取得。 |
0xD206 | Read Device Status Register | ステータスレジスタ取得(エラー/警告/ファン/レーザ等)。 |
0xD210 | Clear Device Status Register | ステータスレジスタをクリア。 |
0xD304 | Reset | ソフトリセット。約<100 ms。 |
I2Cコマンド
コード | 名称 | 説明 |
---|---|---|
0x0010 | Start Measurement | 測定開始。出力形式を指定(0x03=IEEE754 float、0x05=uint16)。Idleからのみ。 |
0x0104 | Stop Measurement | 測定停止。Idleへ戻す。 |
0x0202 | Read Data-Ready Flag | 新データ有無を取得(0x00/0x01)。ポインタ設定は初回のみで可。 |
0x0300 | Read Measured Values | 最新測定値を取得。形式は開始時に選択した出力形式に依存。 |
0x1001 | Sleep | スリープへ移行。I²Cも無効化。 |
0x1103 | Wake-up | スリープ解除。SDA低パルスまたはコマンド2回送信で復帰。 |
0x5607 | Start Fan Cleaning | 手動ファン清掃を開始。測定中のみ実行可。 |
0x8004 | Read/Write Auto Cleaning Interval | 自動清掃間隔[s]の読出し/書込み。0で無効。NVMに保存。 |
0xD002 | Read Product Type | 製品タイプ文字列を取得(推奨ID “00080000”)。 |
0xD033 | Read Serial Number | シリアル番号を取得。 |
0xD100 | Read Version | FW/ハード/プロトコルの版情報を取得。 |
0xD206 | Read Device Status Register | ステータスレジスタ取得(エラー/警告/ファン/レーザ等)。 |
0xD210 | Clear Device Status Register | ステータスレジスタをクリア。 |
0xD304 | Reset | ソフトリセット。約<100 ms。 |
SPS30の低電力測定についてのノウハウ
公式ドキュメントの翻訳
概要
SPS30センサーモジュールには、測定・アイドル・スリープの3つの動作モードがあります。電源投入時、SPS30は自動的にアイドルモードに入ります(図1およびデータシート「Functional Overview」参照)。アイドルからは、測定モードまたはスリープモードへ遷移できます。
サンプリング間隔1秒の連続測定モードでは電流が45〜65 mAに増加します。スリープモードでは、測定モードと比べて消費電流が約1000分の1に低減します。
センサシステムの性能とのトレードオフ関係で、総消費電力に影響する主な変数は次の2つです。
- 測定モードに費やす時間 ↔ 出力の精度
- 測定間のスリープ時間 ↔ 短時間の汚染イベントを検出できる能力
2 測定モード時間の最適化
センサーをアイドル状態から測定モードにすると、レーザーとファンが自動的にオンになります。ファンには慣性があるため、目標回転数に達するまでに数秒を要します。この影響は、最初の数秒間のセンサー出力にも現れます。統計的な安定化も必要なため、典型的に出力が安定値に到達するまでの時間は、吸い込む空気中の粒子濃度に依存します。低濃度ほど時間がかかり、高濃度ほど短くなります。
2.1 立ち上がり時間
精度と性能の妥協点として、出力を使用する前に少なくとも30秒間、センサーを動作させることを推奨します。
さらに最適化するには、データシート1.1節「仕様概要」に示された典型立ち上がり時間に従い、実測濃度に応じて立ち上がり時間を調整できます。なお、これらは代表値(平均値)であり、個体差やエアロゾルの種類により実際の立ち上がり時間は変動します。
一般的には、300 #/cm³を超える高濃度では16秒後に十分な精度が得られます。したがって、以下の例のアルゴリズムで実際のPM濃度に合わせて立ち上がり時間を調整できます。
- 16秒後に測定
- 数濃度 >300 #/cm³ → 測定データを使用してよい
- 数濃度 ≤300 #/cm³ → 立ち上がり未完了、30秒後に再測定
- 30秒後に測定 → 測定データを使用してよい
さらに消費電力を下げる目的で精度低下を許容できる場合は、立ち上がり時間をさらに短縮することも可能ですが、8秒未満にはしないことを推奨します。
2.2 測定データの平均化
立ち上がり後は、複数の出力値を取得して平均することで、より安定した測定が得られます。
最良の精度を狙う出発点としては、立ち上がり後さらに30秒間の測定値を平均する方法が推奨され、測定モード合計60秒となります。平均時間を短くすれば省電力になりますが、測定の再現性が低下する可能性があります。許容可否はアプリケーションの電力・精度要件に基づき判断してください。
3 スリープモード時間の最適化
適切なサンプリング間隔の選択は、設置環境と用途に大きく依存します。粒子濃度が急速に変化する環境では、連続測定か、数分以内の短い測定間隔を推奨します。
図3の典型例では、5分間隔は最初のスパイクをかろうじて検出できますが、15分や30分では最初のスパイクを完全に見逃します。2つ目のより緩やかなイベントは、15分や30分の間隔でも検出できます。
幸いにも、実世界の多くの汚染イベントは時間とともに緩やかに低下します。そのため、多くのアプリケーションでは、10分超〜1時間の測定間隔で十分な場合があります。当社の経験とフィールド測定に基づくと、家庭の調理のようなイベントは15分間隔で対応可能なことが多いです。実装例は第4節に示します。
4 実装例
図4は典型的な屋内PMイベントを示しています。青の曲線は連続測定センサーの出力、オレンジの曲線は15分ごとに1分間測定するパルス動作センサーの出力です。フィールド測定では、4月24日20時に調理イベントが開始されています。ご覧のとおり、PM2.5が元のレベルに戻るまでにほぼ24時間かかっています。
また、オレンジの曲線には、粒子状物質センサーの典型的な立ち上がり挙動も見られます。前述のとおり、最良の性能を得るには、立ち上がり完了後の出力値のみを使用することを推奨します。
この実装例のユースケースでは、30秒待機したのちに、さらに30秒間の測定データを平均する方式が選ばれました。図5にこの手順の実装例を示します。
低消費電力での粒子状物質センサー測定の擬似コード
sensor(wake_up)
sensor(start)
sleep(30)
count = 0
PM2p5 = 0
for (count < 30):
PM2p5 = PM2p5 + sensor(read_values.PM2p5)
count = count + 1
sleep(1)
average_PM2p5 = PM2p5 / 30
print(average_PM2p5)
sensor(stop)
sensor(sleep)
図5:低消費電力アプリケーション向けの典型的な擬似コード
上記アルゴリズムを収集データに適用した結果を図6に示します。平均値(オレンジ)は、もう一方のセンサーの連続測定信号と完全に整合しています。
5 SPS30の平均消費電流
図7のとおり、測定モードに費やす時間と測定間のスリープ時間を適切に選ぶことで、消費電力は大幅に削減できます。前節の実装例(測定60秒+スリープ15分)では、平均3.5 mAとなり、連続測定(平均55 mA)と比べて15倍の低減が得られます。アプリケーションや測定・スリープ時間の選択次第では、さらに消費電力を下げることも可能です。
図7:測定モード(30/60/90秒)とスリープモード(1分〜100分)の時間に対する平均消費電流。※x軸は対数スケールです。
アプリケーションでSPS30が主な電気負荷であると仮定すると、平均3.5 mAの実装例では、単三電池4本(各2000 mAh想定)で2000 mAh / 3.5 mA = 約571時間 ≈ 3.4週間の動作が見込めます。
まとめ
- sps30を買った。アリエクやっふー!
- 測定できた。
todo
- スタンドアロンで測定できるようにしたいが、raspberry pi pico 2 Wでデータをどこかのサーバに飛ばすか、古いデータは捨てることにしてグラフィカル液晶でグラフ表示するだけにするか。