DIY Arduino PM10, Temperatur & Feuchtigkeitssensor-Set
Komponenten und Zubehör
| Arduino Nano R3 | ×1 |
| SDS018 PM-Sensor (Laser, UART) | ×1 |
| DHT22 Temperatur/Feuchtigkeitssensor (Modul mit Pull-Up & Kondensator) | ×1 |
| OLED Display I2C SSD1306 128×32 Pixel | ×1 |
| LED Grün, Gelb, Rot (3mm) | je ×1 |
| Widerstände 390 Ω (LED-Vorwiderstände) | ×3 |
| Kondensator 100 nF (optional für DHT22) | ×1 |
| Widerstand 4,7 kΩ (optional Pull-Up DHT22) | ×1 |
| Powerbank (USB-Stromversorgung) | ×1 |
| Schrauben M3×16, M3×6 (Gehäuse, SDS018) | 4 / 1 |
| LED-Fassungen 3mm (optional) | ×3 |
| Female Jumper, Schrumpfschlauch, Pinheader 2-polig | je nach Bedarf |
Benötigte Werkzeuge
- Lötkolben & bleifreies Lot
- 3D-Drucker (Gehäuse)
- Heißklebepistole
- Akku-Schrauber
Apps und Online-Dienste
- Arduino IDE
- Bibliotheken:
Adafruit_SSD1306,DHT sensor library by Adafruit
Projekthintergrund
Zusammenhang Feinstaub & COVID-19
Studien (u. a. SIMA, italienische Unis, März 2020) deuten darauf hin, dass PM10-Partikel als Träger für Viren fungieren können. Feinstaub ermöglicht längere Verweildauer und weitere Ausbreitung von Viren in der Luft. In Norditalien (Lombardei) blieben PM10-Werte trotz Lockdown hoch – intensive Tierhaltung als Hauptquelle. Höhere PM10-Konzentrationen korrelierten mit höheren Infektionsraten.
Umweltfaktoren:
- Hohe Temperatur & UV-Strahlung → schneller Vireninaktivierung
- Relative Feuchte 40–60 % → geringste Virusüberlebensrate
- < 40 % oder > 60 % → bessere Ausbreitung/Überleben
Lösung: Tragbares Warnsystem
Ein kostengünstiges, nachbaubares Gerät misst PM10, Temperatur, relative Feuchte und warnt visuell (3 LEDs + OLED) bei kritischen Werten. So können Menschen entscheiden, drinnen zu bleiben, Maske zu tragen oder zu lüften.
Alarm-Logik (6 Stufen)
| Stufe | PM10 (µg/m³) | Feuchte (%) | LEDs |
|---|---|---|---|
| Normal | 0–25 | 40–60 | Alle AUS |
| Niedrig | 0–25 | <40 oder >60 | Grün AN |
| Niedrig | 26–50 | 40–60 | Grün AN |
| Warnung | 26–50 | <40 oder >60 | Grün + Gelb AN |
| Warnung | >51 | 40–60 | Grün + Gelb AN |
| Alarm | >51 | <40 oder >60 | Grün + Gelb + Rot AN |
Sensoren & Anschlüsse
SDS018 (PM10/PM2.5)
- Prinzip: Laserstreuung, 0,3–10 µm, UART, eingebauter Lüfter
- Auflösung 0,3 µg/m³, Antwortzeit <10 s
- Pinout: 1 NC, 2 1µm PWM, 3 5V, 4 2,5µm PWM, 5 GND, 6 RX, 7 TX
- Anschluss: SDS018 5V→5V, GND→GND, TX→Arduino RX (Pin 0)
DHT22 (Temp/Feuchte)
- 3–5V, 0–100% RH (±2–5%), -40–80°C (±0,5°C), 0,5 Hz
- Modul mit 100nF (VCC-GND) & 4,7k Pull-Up (DATA-VCC)
- DATA → Arduino D2
OLED SSD1306 I2C
- 128×32, weiß auf schwarz, 3,3–5V
- SDA→A4, SCL→A5, VCC→5V, GND→GND
LEDs
- Rot→D3, Grün→D4, Gelb→D5, je 390Ω an Kathode → GND
Arduino Nano Hardware-Modifikation
Um SDS018-UART (Pin 0) und USB-Serial gleichzeitig nutzen zu können: SMD-Widerstand an RX-Leitung (roter Pfeil) entfernen, senkrecht verlöten, zwei Drähte + Pinheader anlöten. Jumper stecken nur beim Programmieren; im Betrieb entfernt → SDS018-Daten lesbar + Serial Monitor aktiv. Alternativ Widerstand permanent entfernen (dann kein Reprogrammieren mehr).
Stromversorgung
Via USB durch Powerbank (5V). Alternativ Vin 7–12V.
Gehäuse & Montage (3D-Druck, orange PLA)
- Unterteil: Arduino Nano, SDS018 (M3×6), USB-Öffnung
- Oberteil: DHT22, OLED, 3 LEDs (3mm Bohrungen, optional 5mm für Fassungen)
- Heißkleber für Arduino, Display, DHT22
- 4× M3×16 Schrauben verbinden beide Teile
3D-Modelle: Oberteil, Unterteil
Firmware (Arduino Sketch)
Ablauf: Peripherie-Init → LED-Test → Loop (alle 2 s):
- DHT22 lesen (Temp, Feuchte) → Serial Monitor
- SDS018 lesen (PM2.5, PM10) → Serial Monitor (Protokoll: 0xAA 0xC0 ... 0xAB, Checksumme)
- Alarmstufe bestimmen → LEDs schalten
- Display alternierend: PM10 + Feuchte (bei Alarm „Alarm!!!“) ↔ PM2.5 + Temperatur
#include
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int startDHT = 0, switchDisplay = 0;
const int ledRed=3, ledGreen=4, ledYellow=5;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(ledYellow, OUTPUT);
dht.begin(); Serial.begin(9600); Serial.println("start");
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { for(;;); }
display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE);
// LED-Test
digitalWrite(ledGreen, HIGH); delay(500);
digitalWrite(ledYellow, HIGH); delay(500);
digitalWrite(ledRed, HIGH); delay(500);
digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW); delay(500);
}
void loop() {
if(!startDHT) { delay(2000); startDHT=1; }
float h = dht.readHumidity();
float t = dht.readTemperature();
if(isnan(h)||isnan(t)) { Serial.println("DHT Fehler"); return; }
Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temp: "); Serial.print(t); Serial.println("°C");
// SDS018 lesen
uint8_t buf[10]={0}; float pm25=0, pm10=0;
while(Serial.available()>0) {
for(int i=0;i<10;i++) buf[i]=Serial.read();
if(buf[0]==0xAA && buf[1]==0xC0 && buf[9]==0xAB) {
uint8_t cs=0; for(int i=2;i<=7;i++) cs+=buf[i];
if(cs==buf[8]) {
digitalWrite(LED_BUILTIN, HIGH);
pm25 = ((buf[3]*256.0)+buf[2])/10.0;
pm10 = ((buf[5]*256.0)+buf[4])/10.0;
Serial.print("PM2.5: "); Serial.print(pm25); Serial.println(" ug/m3");
Serial.print("PM10: "); Serial.print(pm10); Serial.println(" ug/m3");
}
Serial.println("-----------------");
}
Serial.flush();
}
// LED-Logik
if(pm10<=25 && h>=40 && h<=60) { setLEDs(0,0,0); } // Normal
else if(pm10<=25 && (h<40 || h>60)) { setLEDs(1,0,0); } // Low
else if(pm10>25 && pm10<=50 && h>=40 && h<=60) { setLEDs(1,0,0); } // Low
else if(pm10>25 && pm10<=50 && (h<40 || h>60)) { setLEDs(1,1,0); } // Warnung
else if(pm10>50 && h>=40 && h<=60) { setLEDs(1,1,0); } // Warnung
else { setLEDs(1,1,1); } // Alarm
// Display
display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0);
if(!switchDisplay) {
if(pm10>50) display.print("Alarm!!!");
else { display.print("PM10:"); display.println(pm10); }
display.print(" HR%:"); display.println(h);
switchDisplay=1;
} else {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // invers
display.print("PM25:"); display.println(pm25);
display.print("T[C]:"); display.println(t);
switchDisplay=0;
}
display.display();
delay(500); digitalWrite(LED_BUILTIN, LOW); delay(1500);
}
void setLEDs(bool g, bool y, bool r) {
digitalWrite(ledGreen, g); digitalWrite(ledYellow, y); digitalWrite(ledRed, r);
}
3D-Druck Dateien
Schaltplan
Herstellungsprozess
- SABICs zirkulärer Ansatz: Kunststoffverpackungen, Sicherheit und Nachhaltigkeit im Zeichen von COVID‑19
- Wie COVID-19 die Automatisierung in der Kunststoffindustrie beschleunigte
- COVID-19 und das Ende des post-WWII-Wirtschaftsparadigmas
- Der Pandemie-Effekt: COVID-19 beschleunigt Blockchain- und Kryptowährungs-Innovation
- COVID-19 beschleunigt das Ende jährlicher Shipper-RFPs
- Wayfair & COVID-19: Steuerbefreite Verkäufer in der Post-Pandemie-Wirtschaft
- Skills Gap überbrücken: Reskilling- und Retraining-Strategien Post-COVID für Hersteller
- COVID-19 Leitfaden & Ressourcen für Fertigungsführungskräfte
- Wie COVID-19 die Zukunft von Arbeit und Automatisierung neu formt – Erkenntnisse aus einer neuen Studie
- Schnelle, präzise COVID-19-Detektion mit Graphentechnologie