Skip to Content

Staubsensor DSM501a mit Arduino

Staubsensor DSM501a mit Arduino

In diesem Tutorial lernst du, wie du den Staubsensor DSM501a mit einem Arduino verwendest, um die Luftqualität zu beurteilen.

Das DSM501 Staubsensormodul in Kombination mit Arduino-Projekten ermöglicht die Überwachung der Luftqualität. Mit seiner Fähigkeit, Partikel bis zu einer Größe von 1 Mikrometer zu erkennen, ist dieses Modul ideal zur Messung von Konzentrationen von Hausstaub, Pollen, Milben, Keimen und Zigarettenrauch, die als Ursachen für Atemwegserkrankungen und Allergien bekannt sind.

Lass uns mit den benötigten Teilen beginnen.

Benötigte Teile

Neben dem DSM501 benötigst du einen Arduino oder einen anderen Mikrocontroller mit 5V-Logik. Ich habe einen Arduino Uno verwendet, aber jedes andere Arduino-Board mit 5V-Logik funktioniert ebenso gut.

Staubsensor DSM501a

Arduino

Arduino Uno

Dupont wire set

Dupont-Kabelsatz

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Grundlagen des DSM501 Staubsensors

Der DSM501 ist ein Sensormodul zur Messung von Partikelkonzentrationen. Der Sensor kann Partikel bis zu einer Größe von 1µm erkennen und misst die Menge der in einem Raum schwebenden Partikel bis zu einer Größe von 30m3. Das Bild unten zeigt die Rück- und Vorderseite des Sensormoduls.

DSM501 Dust Sensor Back and Front
DSM501 Staubsensor Rück- und Vorderseite

Funktion

Der Sensor arbeitet mit einem Heizelement, das einen Luftstrom erzeugt. Die Partikel im Luftstrom werden von einer IR-Diode (LED) beleuchtet, und die Menge des reflektierten Lichts wird von einem Infrarotsensor (PT) gemessen. Diese Messung wird dann in ein PWM-Ausgangssignal umgewandelt. Das Bild unten zeigt die Position der Komponenten und das Funktionsprinzip des Sensors.

Components and function of DSM501
Komponenten und Funktion des DSM501 (source)

Und hier ist ein Bild vom Inneren des DSM501. Du kannst den Widerstand sehen, der als Heizelement unten arbeitet, den IR-Photodetektor rechts und die IR-LED links.

Interior of DSM501
Innenansicht des DSM501 (source)

Installation

Der Sensor sollte in der unten dargestellten „vertikalen“ Position installiert werden. Nur in dieser Ausrichtung strömt die erwärmte Luft nach oben, vorbei an LED und Detektorelement. Achte darauf, den Sensor von anderen künstlichen Luftströmen (Ventilatoren) und Feuchtigkeitsquellen fernzuhalten.

Orientation of Sensor for correct operation
Ausrichtung des Sensors für korrekten Betrieb

Die Linse vor dem IR-Detektor (PT) ist mit einem antistatischen und staubabweisenden Polymer beschichtet. Dennoch sollte sie alle sechs Monate in Büro- und alle drei Monate in Industrieumgebungen gereinigt werden.

Das Modul verfügt über einen VR-Trimmer zur Empfindlichkeitseinstellung, der jedoch voreingestellt ist und nicht verändert werden sollte.

Pinbelegung

Das folgende Bild zeigt die Pinbelegung des DSM501. Den Steuerpin kannst du vorerst ignorieren. Vout1 und Vout2 sind die PWM-Ausgänge. Vout2 erkennt Partikel > 1µm und Vout1 Partikel > 2,5µm. VCC und GND sind die Stromversorgungsanschlüsse. Das Sensormodul arbeitet mit 5V.

Pinout of DSM501
Pinbelegung des DSM501

Beachte, dass das DSM501-Modul meist mit einem vorgefertigten Stecker und Kabel geliefert wird, das eine falsche Farbcodierung hat! Lass dich davon nicht täuschen. Schwarz ist NICHT Masse und Rot ist NICHT VCC. Siehe das Bild unten und achte darauf.

Color coding of connector cables of  DSM501
Farbcodierung der Anschlusskabel des DSM501

Nun ein kurzes Wort zum Steuerpin. Du kannst die Partikelgrößensensitivität von Vout1 durch Hinzufügen eines Widerstands zwischen Steuerpin und Masse anpassen. Wir werden ihn jedoch nicht verwenden und die Standardeinstellungen beibehalten: Vout2 (> 1µm) und Vout1 (> 2,5µm). Für mehr Details siehe datasheet. Das Bild unten zeigt, wie sich das PWM-Signal der Vout-Pins je nach detektierter Partikelgröße ändert.

(source)

Spezifikation

Unten findest du die Spezifikationen des DSM501. Wichtig ist vor allem die 5V Versorgungsspannung und der relativ hohe Stromverbrauch von 90mA durch das Heizelement.

  • Versorgungsspannung: DC5V±10%
  • Stromverbrauch: 90mA
  • Betriebstemperaturbereich: -10~ +65℃
  • Betriebsfeuchtigkeitsbereich: 95% RH oder weniger
  • Empfohlene Lagerbedingungen: -20~ +80℃
  • Abmessungen: B59 * H45 * T20 (mm)
  • Erkennbare Partikelgröße: ca. 1µm (Minimum)
  • Messbereich der Konzentration: 0 ~ 1,4 mg/m3
  • Ausgangssignal: PWM (Pulsweitenmodulation)
  • Stabilisierungszeit: 1 Minute nach Einschalten

Für weitere Details siehe die Datenblätter. Es gibt mehrere leicht unterschiedliche Versionen. Ich habe die zwei umfassendsten unten aufgeführt.

Anschluss des DSM501 an Arduino

Den DSM501 an einen Arduino anzuschließen ist einfach. Verbinde zuerst GND mit GND und VCC mit 5V. Dann verbinde Vout1 mit Pin 7 des Arduino und Vout2 mit Pin 8. Die genauen GPIO-Pins sind nicht kritisch, du kannst auch andere wählen. Der Steuerpin des DSM501 bleibt unverbunden (offen). Das folgende Diagramm zeigt die komplette Verdrahtung.

Wiring of DSM501 with Arduino
Verdrahtung des DSM501 mit Arduino

Nachdem die Verdrahtung abgeschlossen ist, sprechen wir darüber, wie wir die Partikelkonzentrationen messen, bevor wir Code schreiben.

Messung der Partikelkonzentrationen

Die Vout-Pins des DSM501 erzeugen ein pulsweitenmoduliertes (PWM) Signal, bei dem die Pulsdauer von der Menge der erkannten Partikel abhängt. Um dieses Signal in eine Partikelkonzentration umzuwandeln, müssen wir zuerst das sogenannte Low Pulse Ratio berechnen, wie unten beschrieben.

Low pulse ratio
Low Pulse Ratio (source)

Das Low Pulse Ratio ist einfach der Prozentsatz der Zeit, in der das Signal während der Messzeit t niedrig ist. Eine typische Messzeit liegt zwischen 5 und 30 Sekunden. Zum Beispiel würde im obigen Beispiel das Low Pulse Ratio berechnet als

Low Pulse Ratio (%) = (t1 + t2 + t3) / t x 100

Partikelkonzentration in mg/m3

Sobald wir das Low Pulse Ratio haben, müssen wir die entsprechende Partikelkonzentration in mg/m3 im folgenden Diagramm nachschlagen. Die rote Kurve beschreibt die typische Sensorcharakteristik, während die blauen und roten Kurven die oberen und unteren Grenzen darstellen.

Sensorcharakteristik zur Messung von mg/m3 Konzentration (source)

Natürlich wollen wir das Low Pulse Ratio programmatisch über eine Formel in eine Partikelkonzentration umrechnen und nicht das Diagramm konsultieren. Verschiedene Blogbeiträge bieten unterschiedliche Formeln, die meist leicht ungenau sind. Ich habe daher einige Punkte der roten Kurve oben ausgewählt, um die Grafik zu replizieren, und eine Polynom-Regression zweiten Grades berechnet. Das Bild unten zeigt die Punkte und die angepasste Kurve.

My replica of the sensor's characteristics curve
Meine Nachbildung der Sensorcharakteristik

Die Koeffizienten und die Formel für die Polynom-Anpassung lauten wie folgt:

c_mgm3 = 0.00258425*r**2 +0.0858521*r – 0.01345549

Mit dieser Formel können wir nun die Partikelkonzentration in mg/m3 für ein gegebenes Low Pulse Ratio r berechnen.

Partikelkonzentration in pcs/283ml

Ähnlich liefert das Datenblatt eine zweite charakteristische Sensor-Kurve zur Messung der Partikelkonzentration in pcs/283ml.

Sensorcharakteristik zur Messung der pcs/283ml Konzentration (source)

Diese Grafik zeigt eine lineare Beziehung zwischen dem Low Pulse Ratio r und der pcs/283ml Konzentration bis zu einer Konzentration von 12000 pcs/283ml, bei der der Sensor sättigt. Der lineare Bereich kann durch folgende Gleichung beschrieben werden:

c_pcs283ml = 625*r

Mit diesen beiden Formeln haben wir alles, um Partikelkonzentrationen in mg/m3 oder in pcs/283ml aus einem gemessenen Low Pulse Ratio r zu berechnen.

Code zur Messung von Staubkonzentrationen mit DSM501

Der folgende Code zeigt, wie man Partikelkonzentrationen in mg/m3 und in pcs/283ml für Partikelgrößen >1µm (PM1) oder >2,5µm (PM2.5) misst. Schau dir zuerst den kompletten Code an, bevor wir ins Detail gehen.

const int pinPM25 = 7;
const int pinPM1 = 8;
const unsigned long sampleTime = 5000;  // mSec   -> 5..30 sec

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

float calc_c_mgm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3);
}

float calc_c_pcs283ml(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_pcs283ml =  625 * r;
  return min(c_pcs283ml, 12500);
}

void setup() {
  Serial.begin(9600);
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  Serial.println("Warming up...");
  // delay(60000);  // 1 minute warm-up
}

void loop() {
  static unsigned long t_start = millis();
  static float lowPM = 0;

  lowPM += pulseIn(pinPM25, LOW) / 1000.0;   // >2.5µm (PM2.5)
  //lowPM += pulseIn(pinPM1, LOW) / 1000.0;  // >1µm (PM1)

  if ((millis() - t_start) >= sampleTime) {
    Serial.print("low_%  PM    : ");
    Serial.println(calc_low_ratio(lowPM));
    Serial.print("c_mgm3 PM    : ");
    Serial.println(calc_c_mgm3(lowPM));
    Serial.print("c_pcs283ml PM: ");
    Serial.println(calc_c_pcs283ml(lowPM));   
    Serial.println();
    lowPM = 0;
    t_start = millis();
  }
}

Der Code beginnt mit der Definition von Konstanten für die Eingangssignal-Pins des DSM501 und die Messzeit. Die Messzeit ist die Zeit, die der Code für eine vollständige Messung der Partikelkonzentrationen benötigt.

const int pinPM25 = 7;
const int pinPM1 = 8;
const unsigned long sampleTime = 5000;  // mSec   -> 5..30 sec

Das Datenblatt empfiehlt einen Wert zwischen 5 und 30 Sekunden. Eine längere Messzeit liefert stabilere, aber weniger häufige Messungen.

Hilfsfunktionen

Als Nächstes definieren wir eine Hilfsfunktion zur Berechnung des Low Pulse Ratio. Sie teilt einfach die akkumulierte Zeit des niedrigen Pulses durch die Messzeit und multipliziert mit 100, um einen Prozentsatz zu erhalten.

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

Die calc_c_mgm3() Funktion berechnet die Partikelkonzentration in mg/m3. Sie verwendet die oben beschriebene Formel. Wir begrenzen die minimale Konzentration auf null durch Aufruf von max(0, c_mgm3), da negative Partikelkonzentrationen keinen Sinn ergeben.

float calc_c_mgm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3);
}

Wenn man genau auf die Sensorcharakteristik schaut, sieht man, dass bei sehr niedrigen Low Pulse Ratios die berechnete Konzentration negativ werden könnte.

Ähnlich berechnet die calc_c_pcs283ml() Funktion die Partikelkonzentration in pcs/283ml, begrenzt aber die maximale Konzentration auf 12500 pcs/283ml, da der Sensor dort sättigt und die Charakteristik nicht mehr linear ist.

float calc_c_pcs283ml(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_pcs283ml =  625 * r;
  return min(c_pcs283ml, 12500);
}

Setup-Funktion

Die setup() Funktion startet die serielle Kommunikation und setzt die Modi der Pins, die Daten vom DSM501 lesen. Das Datenblatt sagt, der Sensor benötigt etwa 1 Minute Aufwärmzeit, bis die Messwerte stabil sind. Du kannst die entsprechende delay hier aktivieren.

void setup() {
  Serial.begin(9600);
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  Serial.println("Warming up...");
  // delay(60000);  // 1 minute
}

Loop-Funktion

Schließlich haben wir die loop() Funktion. Sie verwendet die pulseIn() Funktion, um die Low-Zeit entweder des P25- oder des PM1-Eingangs zu messen. Kommentiere einfach den Eingang aus, den du nicht messen möchtest.

  lowPM += pulseIn(pinPM25, LOW) / 1000.0;   // >2.5µm (PM2.5)
  //lowPM += pulseIn(pinPM1, LOW) / 1000.0;  // >1µm (PM1)

Beachte, dass pulseIn die Dauer in Mikrosekunden zurückgibt, die wir durch Multiplikation mit 1000 in Millisekunden umwandeln.

Die Low-Zeiten werden akkumuliert, bis die Messzeit abgelaufen ist. Dann berechnen wir die verschiedenen Partikelkonzentrationen basierend auf dem Low Pulse Ratio und geben sie aus.

  if ((millis() - t_start) >= sampleTime) {
    Serial.print("low_%  PM    : ");
    Serial.println(calc_low_ratio(lowPM));
    Serial.print("c_mgm3 PM    : ");
    Serial.println(calc_c_mgm3(lowPM));
    Serial.print("c_pcs283ml PM: ");
    Serial.println(calc_c_pcs283ml(lowPM));   
    Serial.println();
    lowPM = 0;
    t_start = millis();
  }

Am Ende der Messzeit setzen wir die akkumulierte Partikelkonzentration lowPM auf 0 zurück und starten auch die Messzeit neu, um den nächsten Messzyklus zu beginnen.

Im nächsten Abschnitt verfeinern wir dieses System und bauen ein einfaches Luftqualitäts-Warnsystem.

Luftqualitäts-Warnsystem mit DSM501

Längerer Kontakt mit kleinen, in der Luft schwebenden Partikeln kann gesundheitliche Probleme verursachen. Eine gängige Methode zur Messung der Luftqualität ist die Zählung der Konzentration von Feinstaub (PM) mit einem Durchmesser von weniger als 2,5µm. Das Gesundheitsrisiko bei PM2.5 besteht darin, dass sie tief in die Atemwege gelangen, die Lunge erreichen und in den Blutkreislauf eintreten können.

Es gibt verschiedene Skalen zur Einstufung des Gesundheitsrisikos unterschiedlicher PM2.5-Konzentrationen. Die folgende Tabelle der Luftqualitätskategorien stammt von Victorian Government in Australia.

Air Quality Categories for PM2.5
Luftqualitätskategorien für PM2.5 (source)

Du siehst, dass die Kategorien von Gut bis Extrem schlecht reichen und von der Konzentration von PM2.5 abhängen, gemittelt über eine oder 24 Stunden. Beachte, dass diese Kategorien auf PM2.5-Konzentrationen in µg/m3 und nicht in mg/m3 basieren, was die Einheit ist, die wir bisher verwendet haben. Für detailliertere Informationen zu diesen Stufen und deren potenziellen Auswirkungen auf die Gesundheit siehe Air quality categories and general health advice.

Wir bauen ein vereinfachtes Luftqualitäts-Warnsystem, das nur die ersten drei Stufen (Gut bis Schlecht) verwendet. Je nach gemessener PM2.5-Konzentration schaltet das System eine grüne LED (Gut), eine gelbe LED (Mäßig) oder eine rote LED (Schlecht oder schlechter) ein.

Verdrahtung für das Luftqualitäts-Warnsystem

Wir können die gleiche Schaltung wie zuvor verwenden, ohne die Verdrahtung des DSM501 zu ändern, und einfach die drei LEDs mit ihren Vorwiderständen hinzufügen. Die grüne LED wird an Pin 4, die gelbe an Pin 3 und die rote an Pin 2 angeschlossen. Das Bild unten zeigt die komplette Verdrahtung.

Wiring for Air Quality Warning with DSM501
Verdrahtung für Luftqualitäts-Warnung mit DSM501

Code für das Luftqualitäts-Warnsystem

Der folgende Code ähnelt stark dem vorherigen. Die Hauptunterschiede sind, dass wir jetzt drei LEDs schalten und die PM2.5-Konzentrationen in µg/m3 messen.

const int pinPM25 = 7;
const int pinPM1 = 8;
const int pinGreen = 4;
const int pinYellow = 3;
const int pinRed = 2;
const unsigned long sampleTime = 30000;  // 30 sec

float calc_low_ratio(float lowPulse) {
  return lowPulse / sampleTime * 100.0;  // low ratio in %
}

float calc_c_ugm3(float lowPulse) {
  float r = calc_low_ratio(lowPulse);
  float c_mgm3 = 0.00258425 * pow(r, 2) + 0.0858521 * r - 0.01345549;
  return max(0, c_mgm3) * 1000;
}

void setup() {
  pinMode(pinPM25, INPUT);
  pinMode(pinPM1, INPUT);
  pinMode(pinGreen, OUTPUT);
  pinMode(pinYellow, OUTPUT);
  pinMode(pinRed, OUTPUT);
  // delay(60000);  // 1 minute
}

void loop() {
  static unsigned long t_start = millis();
  static float lowPM25 = 0;

  lowPM25 += pulseIn(pinPM25, LOW) / 1000.0;

  if ((millis() - t_start) >= sampleTime) {
    float c_ugm3 = calc_c_ugm3(lowPM25);
    digitalWrite(pinGreen, c_ugm3 <= 25 ? HIGH : LOW);
    digitalWrite(pinYellow, c_ugm3 > 25 && c_ugm3 <= 50 ? HIGH : LOW);
    digitalWrite(pinRed, c_ugm3 > 50 ? HIGH : LOW);
    lowPM25 = 0;
    t_start = millis();
  }
}

Zuerst definieren wir Konstanten für die Pins des DSM501, die LED-Pins und die Messzeit.

Beachte, dass wir eine Messzeit von 30 Sekunden verwenden. Du könntest die Messzeit auf eine Stunde ändern, wie es bei der Definition der Luftqualitätskategorien verwendet wird, aber dann hättest du nur eine Messung pro Stunde. Die bessere Option wäre ein gleitendes Fenster, aber um den Code einfach zu halten, habe ich das nicht implementiert.

Die calc_low_ratio() Funktion ist dieselbe wie zuvor und die neue calc_c_ugm3() ist im Wesentlichen die alte calc_c_mgm3() Funktion. Wir multiplizieren nur mit 1000, um von mg/m3 auf µg/m3 umzuwandeln.

In der Setup-Funktion setzen wir die Pin-Modi und in der Loop-Funktion messen wir die PM2.5-Konzentration und schalten je nach Wert eine der drei LEDs ein oder aus.

...
digitalWrite(pinGreen, c_ugm3 <= 25 ? HIGH : LOW);
digitalWrite(pinYellow, c_ugm3 > 25 && c_ugm3 <= 50 ? HIGH : LOW);
digitalWrite(pinRed, c_ugm3 > 50 ? HIGH : LOW);
...

Für PM2.5-Konzentrationen < 25 µg/m3 (Gut) schalten wir die grüne LED ein. Für Konzentrationen zwischen 25 µg/m3 und 50 µg/m3 (Mäßig) schalten wir die gelbe LED ein, und über 50 µg/m3 (Schlecht) schalten wir die rote LED ein.

Das folgende kurze Video zeigt das System in Aktion. Du kannst sehen, wie die rote LED angeht, wenn der Sensor dem Staub ausgesetzt wird, der durch das Bewegen des Staubwedels entsteht.

Demonstration des Luftqualitäts-Warnsystems

Und das ist dein eigenes kleines Luftqualitäts-Warnsystem!

Fazit

Der DSM501 ist ein günstiger und einfach zu verwendender Sensor zur Messung von PM1- und PM2.5-Partikelkonzentrationen. In Kombination mit einem Arduino ermöglicht er den Bau eines einfachen Luftqualitäts-Warnsystems.

Der Nachteil des Sensors ist, dass die Dokumentation etwas mangelhaft ist. Ich musste die Formeln zur Messung der Partikelkonzentrationen aus den Sensorcharakteristikkurven im Datenblatt ableiten, was etwas ungenau ist. Du wirst feststellen, dass verschiedene Artikel leicht unterschiedliche Formeln verwenden.

Ich weiß nicht, wie genau der DSM501 ist, und ohne eine bekannte Partikelquelle kannst du den Sensor nicht wirklich kalibrieren. Für ungefähre Schätzungen der Luftqualität sollte er jedoch ausreichen.

Wenn du schließlich einen Sensor möchtest, der kleinere Partikel erkennen kann, weniger Strom verbraucht und mit einem ESP32 funktioniert, schau dir den GP2Y1010AU0F Dust Sensor an.

Links

Hier einige Links, die ich beim Nachschlagen von Informationen zu Luftqualität, Partikelgrößen und Pollen nützlich fand.

FAQ

Was sind gesunde und ungesunde Staubdichtewerte, gemessen in µg/m3?

Gesunde Staubdichtewerte liegen typischerweise unter 50 µg/m3, während ungesunde Werte über 150 µg/m3 liegen.

Wie ist die Beziehung zwischen Staubdichte, gemessen in µg/m3, und Feinstaub PM, speziell PM2.5 und PM10?

Die Staubdichte, gemessen in µg/m3, steht in direktem Zusammenhang mit Feinstaub (PM), einschließlich PM2.5 und PM10. PM2.5 bezeichnet Partikel mit einem Durchmesser von 2,5 µm oder kleiner, PM10 Partikel mit einem Durchmesser von 10 µm oder kleiner. Höhere Staubdichte bedeutet höhere Konzentrationen von PM2.5 und PM10 in der Luft.

Particle Size Comparison
Partikelgrößenvergleich (source)

Warum ist PM2.5-Verschmutzung schlecht für die Gesundheit?

Von allen Luftverschmutzungsmaßen stellt PM2.5 die größte Gesundheitsgefahr dar. Aufgrund seiner geringen Größe kann PM2.5 lange in der Luft schweben und beim Einatmen tief in den Blutkreislauf gelangen.

Was sind die Hauptquellen von PM2.5-Verschmutzung?

Häufige Quellen von PM2.5-Verschmutzung sind Motor- und Verbrennungsprozesse, industrielle Prozesse, Öfen, Kamine und Holzverbrennung zu Hause, Rauch von Feuerwerk und Waldbränden, Rauchen, Staub- und Pollenpartikel.

Kann ein PM2.5- oder PM10-Sensor Pollen messen?

Die meisten Pollenpartikel sind größer als PM2.5- und PM10-Partikel und würden von einem PM2.5- oder PM10-Sensor ignoriert werden. Allerdings können Pollenpartikel, die normalerweise über 10 µm groß sind, in kleinere Partikel im PM2.5-Bereich zerfallen, die gemessen werden können.