シャープGP2Y1010AU0Fセンサーで作る高精度空気質モニター
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| コンデンサ 220µF | 1 |
| スルーホール抵抗 150Ω | 1 |
必要な工具
- はんだごて
使用アプリ・サービス
- Arduino IDE
- Processing(PC側可視化用)
プロジェクト概要
シャープ光学式ダストセンサー(GP2Y1010AU0F)は、タバコの煙のような極微細粒子の検出に特に優れ、空気清浄機システムで広く採用されています。赤外線発光ダイオードとフォトトランジスタが対角配置されており、空気中の粉塵による反射光を検知する仕組みです。
以前の動画ではDSM501AとPPD42NSベースの空気質モニターを紹介しました。今回は同等に安価(約5ドル)で入手できるシャープGP2Y1010AU0Fベースのデバイスを紹介します。電気回路は非常にシンプル(下図参照)。消費電流が非常に低い(最大20mA、典型11mA)ため、Arduinoから直接給電可能。出力は粉塵濃度に比例したアナログ電圧で、感度は0.5V/0.1mg/m³です。

Arduinoサンプルコード(DFRobot公開版)を改変し、読み取り値をµg/m³単位で出力するようにしました。さらにProcessingで「meter」ライブラリを用いたコードを書き、PC画面上で大型アナログメーター風に可視化することで、視覚的に分かりやすい表示を実現しています。
3種類のセンサー比較
同条件下でDSM501A、PPD42NS、GP2Y1010AU0Fの3種をテストした結果、シャープGP2Y1010AU0Fが最優秀でした。主な利点:
- 非常に低い濃度値にも高感度で反応
- 消費電力が極めて低く、Arduinoから直接給電可能
- Arduinoコードがシンプルでカスタマイズ容易
- アナログ出力のため、追加回路なしで直接計測器に接続可能
購入先(AliExpress):シャープGP2Y1010AU0F
ソースコード
Arduinoコード
/* Standalone Sketch to use with a Arduino UNO and a Sharp Optical Dust Sensor GP2Y1010AU0F */
int measurePin = 0; // ダストセンサーをArduino A0ピンに接続
int ledPower = 2; // ダストセンサーのLEDドライバーピン3本をArduino D2に接続
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
void setup(){
Serial.begin(9600);
pinMode(ledPower, OUTPUT);
}
void loop(){
digitalWrite(ledPower, LOW); // LEDオン(アクティブロー)
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin); // ダスト値読み取り
delayMicroseconds(deltaTime);
digitalWrite(ledPower, HIGH); // LEDオフ
delayMicroseconds(sleepTime);
// 0-5Vを0-1023の整数値にマッピング
calcVoltage = voMeasured * (5.0 / 1024.0);
// 線形方程式(Chris Nafis 2012 https://www.howmuchsnow.com/arduino/airquality/ より)
dustDensity = 170 * calcVoltage - 0.1;
Serial.println(dustDensity); // 単位: µg/m³
delay(1000);
}
Processingコード(PC側可視化)
/* Meter as a partial circle. Change a few colors.
* Note that the circle starts at 90.0 degrees (6:00 OClock) and moves clockwise.
* created April 19, 2017 by Bill (Papa) Kujawa. Public domain.
*/
import processing.serial.*;
import meter.*;
Serial port;
String[] list;
Meter m;
void setup() {
size(1150, 910);
background(255, 255, 200);
port = new Serial(this, "COM4", 9600); // ポート番号は環境に合わせて変更
m = new Meter(this, 125, 25, true);
m.setMeterWidth(850);
m.setFrameColor(color(100, 0, 0));
m.setTitleFontColor(color(0, 200, 0));
m.setPivotPointColor(color(255, 0, 0));
m.setArcColor(color(0, 0, 200));
m.setScaleFontColor(color(200, 100, 0));
m.setTicMarkColor(color(217, 22, 247));
m.setArcMinDegrees(90.0);
m.setArcMaxDegrees(360.0);
m.setArcThickness(5);
m.setNeedleThickness(4);
m.setMinScaleValue(0.0);
m.setMaxScaleValue(800.0);
m.setInputSignalOutOfRangeFontColor(color(0, 255, 0));
m.setMinInputSignal(0);
m.setMaxInputSignal(800);
m.setHighSensorWarningActive(true);
m.setHighSensorWarningValue((float)200.0);
String[] scaleLabelsA = {"0", "100", "200", "300", "400", "500", "600", "700", "800"};
m.setScaleLabels(scaleLabelsA);
m.setTitle("Airquality (ug/m3)");
m.setDisplayDigitalMeterValue(true);
}
void draw() {
if (port.available() > 0) {
String val = port.readString();
list = split(val, ',');
float air = float(list[0]);
println("Airquality: " + air + " mg/m3 ");
m.updateMeter(int(air));
}
}
回路図

製造プロセス
- Raspberry Piで構築する空気質・気象ステーション:InfluxDB & Grafana活用
- OpenSensorsで空気質を測定: ArduinoとPythonによるガイド
- Heliumベースのソーラー駆動空気質センサー:設計と導入ガイド
- LoRaベースのスマートシティ大気質監視システム
- Arduinoで作るレトロNumitron管時計:シンプル、信頼性高く、省エネ
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- スマート室内空気品質・廃棄物監視システム:Raspberry Pi/Arduino/NodeMCUでIOTA Tangle連携
- K30 CO2センサで室内空気質をリアルタイム監視する
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Bosch Sensortec、AI搭載BME688空気質センサを発表、ウイルス感染リスク低減へ
- 先進カーボンベースNO₂センサーが室内空気質モニタリングを強化