Arduino-Luftqualitäts-Monitor mit DSM501A-Feinstaubsensor bauen
Bauteile und Zubehör
| Arduino Nano R3 | 1 |
| DSM501A-Staubsensor-Modul | 1 |
| Alphanumerisches LCD 16×2 | 1 |
| Lüfterkit 40 mm | 1 |
| LED (diverse) | 5 |
| Widerstand 221 Ω | 1 |
| Potentiometer 10 kΩ | 1 |
Benötigte Werkzeuge
- Lötkolben
Apps und Online-Dienste
- Arduino IDE
Über das Projekt
Luftqualitätsüberwachung ist seit den 1980ern etablierte Wissenschaft. Damals war die Technik begrenzt, Lösungen komplex, unhandlich und teuer. Heute sind Geräte präziser, schneller, kleiner und erschwinglicher. Dieses Projekt nutzt den Samyoung DSM501A-Staubsensor – einer der günstigsten Sensoren (wenige Dollar bei AliExpress) – der PM2,5- und PM10-Partikel detektiert.

Die Schaltung ist simpel: Vout1 (PM2,5) an Arduino D2, Vout2 (PM10) an D3, Vcc an 5 V, GND an GND. Fünf LEDs an den analogen Pins A1–A5 (als Ausgänge definiert) zeigen die Luftqualität an. Ein 16×2-LCD (Hitachi HD44780-kompatibel) zeigt PM10-Konzentration in Partikeln/0,01 cf und fünf Qualitätsstufen:
- Clean (sauber)
- Good (gut)
- Acceptable (akzeptabel)
- Heavy (schwer)
- Hazard (gefährlich)
Beide Konzentrationen (PM10 & PM2,5) lassen sich im Serial Monitor verfolgen. Je nach PM10-Wert leuchtet eine farbige LED für schnelle Ablesbarkeit. Ein Lüfter, der Luft aus dem Sensorausgang saugt, verbessert die Messwerte deutlich (weniger Spitzen). Das Gerät ist in einem Installationsgehäuse verbaut.

Zukünftig plane ich Tests weiterer günstiger Staubsensoren – Ergebnisse folgen in späteren Projekten.
Code
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int pin2 = 3;
int pin1 = 2;
unsigned long duration1, duration2, starttime, sampletime_ms = 3000;
unsigned long lowpulseoccupancy1 = 0, lowpulseoccupancy2 = 0;
float ratio1 = 0, ratio2 = 0, concentration1 = 0, concentration2 = 0;
int wLed = A1, gLed = A2, yLed = A3, rLed = A4, bLed = A5;
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 - ");
// LED & LCD-Anzeige je nach Konzentration
if (concentration1 < 1000) { showStatus("CLEAN", wLed); }
else if (concentration1 < 10000) { showStatus("GOOD", gLed); }
else if (concentration1 < 20000) { showStatus("ACCEPTABLE", yLed); }
else if (concentration1 < 50000) { showStatus("HEAVY", rLed); }
else { showStatus("HAZARD", bLed); }
lowpulseoccupancy1 = lowpulseoccupancy2 = 0;
starttime = millis();
}
}
void showStatus(const char* txt, int led) {
lcd.setCursor(0, 1);
for (int i = 0; i < 16; ++i) lcd.write(' ');
lcd.setCursor(4, 1); lcd.print(txt);
digitalWrite(wLed, led == wLed);
digitalWrite(gLed, led == gLed);
digitalWrite(yLed, led == yLed);
digitalWrite(rLed, led == rLed);
digitalWrite(bLed, led == bLed);
}
Schaltplan

Herstellungsprozess
- Luftqualität messen mit OpenSensors: Arduino & Python Anleitung
- Helium-basierter solarbetriebener Luftqualitätssensor: Design- und Deployments-Guide
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Multi-Position Temperatursensor-System für Smart-Home-Integration
- K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- DFRobot Kapazitiver Fingerabdrucksensor mit Arduino oder ESP8266 einbinden
- Web-fähigen IoT-Messer mit Arduino, Yaler und IFTTT bauen
- Arduino-basierte abstoßende Magnetschwebung: Einfache Schaltung & DIY-Anleitung
- Fortschrittlicher kohlenstoffbasierter NO₂-Sensor verbessert Innenraumluftüberwachung