Zelfbouw Arduino PM10, Temperatuur & Vochtigheid Sensor Kit
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerking |
|---|---|---|
| Arduino Nano R3 | 1 | |
| SDS018 PM-sensor (laser scattering) | 1 | Datasheet |
| DHT22 temperatuur/vochtigheid sensor (module met pull-up & condensator) | 1 | |
| OLED Display I2C SSD1306 (128x32) | 1 | |
| LED Groen 3mm | 1 | |
| LED Geel 3mm | 1 | |
| LED Rood 3mm | 1 | |
| Condensator 100 nF | 1 | Optioneel voor DHT22 |
| Weerstand 4.7 kΩ | 1 | Optioneel pull-up voor DHT22 |
| Powerbank (5V USB) | 1 | Voeding |
| Weerstand 390 Ω | 3 | Voor LED's |
| Machine schroef M3x16 | 4 | Behuizing |
| Machine schroef M3x6 | 1 | SDS018 bevestiging |
| LED-beugel 3mm (optioneel) | 3 | Montage hardware |
| Female jumper kabels | 3 | |
| Krimpkous | 1 | |
| Pin header 2-pins | 1 | |
| Jumper (0.1") | 1 | Voor programmeermodus |
Benodigde tools en machines
- Soldeerbout
- Loodvrij soldeertin
- 3D-printer (voor behuizing)
- Lijmpistool
- Draadloze boor/schroevendraaier
Apps en online services
- Arduino IDE
Over dit project
Abstract
Experimentele studies suggereren dat fijnstof (PM) kan fungeren als "drager" voor virale infecties zoals COVID-19. Het virus kan over grotere afstanden worden getransporteerd door in de lucht zwevende deeltjes en uren tot weken infectieus blijven. Luchtverontreiniging kan dus de verspreiding vergroten.
In Noord-Italie daalde de fijnstofconcentratie tijdens de lockdown niet significant, omdat intensive veehouderij (naast fabrieken en auto's) grote hoeveelheden PM10/PM2.5 produceert. Wetenschappers zien een correlatie tussen hoge PM10-waarden en hogere infectiecijfers in de Po-vallei.
Inleiding
Geïnspireerd door het Italiaanse onderzoeksprogramma "Report" over vervuiling door intensive veehouderij. Dierlijke afvalstoffen (mest, urine) produceren ammoniak, waterstofsulfide, methaan en fijnstof (PM10, PM2.5). In Lombardije komt 85% van de ammoniak uit mest. Een studie (maart 2020) toont een significante relatie tussen dagelijkse PM10-overschrijdingen en COVID-19 verspreiding (10-29 feb 2020).
Zuid-Italie (minder vervuild) toonde klassieke persoon-tot-persoon transmissie, terwijl Noord-Italie een versneld patroon vertoonde door fijnstof als drager. Vochtigheid en temperatuur beïnvloeden virusoverleving: lage vochtigheid (<40% of >60%) en gematigde temperaturen bevorderen overleving.
Mijn oplossing
Een herhaalbaar, goedkoop, gebruiksvriendelijk apparaat dat PM10, temperatuur en relatieve vochtigheid meet om te waarschuwen bij gevaarlijke waarden. Mensen kunnen dan thuisblijven, een masker dragen of terugkeren.
Het apparaat bestaat uit:
- SDS018 (PM10/PM2.5)
- DHT22 (temperatuur/vochtigheid)
- OLED I2C display
- 3 LED's (groen, geel, rood)
- Arduino Nano
Alarmniveaus en LED-indicatie
| Niveau | PM10 (µg/m³) | Vochtigheid (%) | LED's |
|---|---|---|---|
| Normaal | 0 – 25 | 40 – 60 | Allemaal UIT |
| Laag | 0 – 25 | <40 of >60 | Groen AAN |
| Laag | 26 – 50 | 40 – 60 | Groen AAN |
| Waarschuwing | 26 – 50 | <40 of >60 | Groen + Geel AAN |
| Waarschuwing | >51 | 40 – 60 | Groen + Geel AAN |
| Alarm | >51 | <40 of >60 | Groen + Geel + Rood AAN |
SDS018 - PM10 Sensor
Meet deeltjes 0.3–10µm via laserverstrooiing. UART output, ingebouwde ventilator, resolutie 0.3 µg/m³, CE/FCC/RoHS.
Aansluiting SDS018 op Arduino Nano:
- Pin 3 (5V) → 5V Nano
- Pin 5 (GND) → GND Nano
- Pin 7 (TX) → RX Nano (D0)
DHT22 Sensor
Digitale temperatuur (-40–80°C, ±0.5°C) en vochtigheid (0–100%, 2–5%). 3–5V, 2.5mA, sample rate 0.5 Hz.
Aansluiting:
- VDD → 5V Nano
- GND → GND Nano
- 100nF condensator tussen VDD-GND
- 4.7kΩ pull-up tussen DATA-VDD
- DATA → D2 Nano
Bibliotheek: Adafruit DHT sensor library v1.3.10
OLED I2C Display (SSD1306)
128x32 pixels, wit op zwart, 3.3–5V, I2C.
Aansluiting:
- VCC → 5V Nano
- GND → GND Nano
- SCL → A5 Nano
- SDA → A4 Nano
Bibliotheek: Adafruit SSD1306 v2.2.1
LED-aansluitingen
- Rood anode → D3, katode via 390Ω → GND
- Groen anode → D4, katode via 390Ω → GND
- Geel anode → D5, katode via 390Ω → GND
Arduino Nano Hardware Aanpassing
Om de SDS018 UART te lezen terwijl de USB-seriële poort vrij blijft voor programmeren, wordt de SMD-weerstand op de RX-lijntje (naar USB-chip) verwijderd en verticaal gesoldeerd met draden naar een pin header. Jumper erop = programmeermodus, jumper eraf = SDS018 communicatie. Alternatief: weerstand permanent verwijderen (dan niet meer herprogrammeerbaar).
Voeding
Arduino Nano via USB (powerbank) of Vin (7-12V). Gekozen: powerbank op USB.
Behuizing en Montage
3D-geprinte oranje PLA behuizing in twee delen (onder: Arduino + SDS018; boven: DHT22, display, LED's). Openingen voor USB, SDS018 inlaat, LED's. Bevestiging met lijmpistool en M3 schroeven. Zie bijgevoegde 3D-bestanden (Sketchfab links).
Firmware
Arduino sketch met vereenvoudigd flowchart:
Opstart: peripheral setup, LED-test. Hoofdlus (elke 2 sec):
- DHT22 uitlezen → temperatuur & vochtigheid naar Serial Monitor
- SDS018 uitlezen (10 bytes UART) → PM2.5 & PM10 naar Serial Monitor
- Bepaal alarmniveau op basis van PM10 en vochtigheid → stuur LED's
- Display wisselt elke cyclus: PM10 + vochtigheid OF PM2.5 + temperatuur. Bij alarm: "Alarm!!!" ipv PM10.
Complete Code
#include <Adafruit_SSD1306.h>
#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 startdhr22 = 0;
int 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)) {
Serial.println(F("SSD1306 allocation failed"));
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() {
// DHT22
if(0 == startdhr22) { delay(2000); startdhr22 = 1; }
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; }
Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.println(F("°C"));
// SDS018
uint8_t dataIN[10] = {0};
float pm25, pm10;
while(Serial.available() > 0) {
for(int i=0; i<10; ++i) dataIN[i] = Serial.read();
if((0xAA == dataIN[0]) && (0xC0 == dataIN[1]) && (0xAB == dataIN[9])) {
uint8_t cksum = 0;
for(int i=2; i<=7; ++i) cksum += dataIN[i];
if(cksum == dataIN[8]) {
digitalWrite(LED_BUILTIN, HIGH);
uint8_t pm25Lo = dataIN[2], pm25Hi = dataIN[3];
uint8_t pm10Lo = dataIN[4], pm10Hi = dataIN[5];
pm25 = ((pm25Hi * 256.0) + pm25Lo)/10.0;
pm10 = ((pm10Hi * 256.0) + pm10Lo)/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 logica
if((pm10 <= 25) && (h >= 40 && h <= 60)) { // Normaal
digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 <= 25) && (h < 40 || h > 60)) { // Laag (vochtigheid)
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 > 25 && pm10 <= 50) && (h >= 40 && h <= 60)) { // Laag (PM)
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
} else if((pm10 > 25 && pm10 <= 50) && (h < 40 || h > 60)) { // Waarschuwing
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
} else if((pm10 > 50) && (h >= 40 && h <= 60)) { // Waarschuwing (hoge PM)
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
} else { // Alarm
digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, HIGH);
}
// Display
if(0 == switchDisplay) {
display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0);
if(pm10 > 50) display.print("Alarm!!!");
else { display.print("PM10:"); display.println(pm10); }
display.print(" HR%:"); display.println(h);
display.display(); switchDisplay = 1;
} else {
display.clearDisplay(); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.setCursor(0,0);
display.print("PM25:"); display.println(pm25);
display.print("T[C]:"); display.println(t);
display.display(); switchDisplay = 0;
}
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(1500);
}
3D-print bestanden (Custom parts)
- Bovenste deel: Case - upper part
- Onderste deel: Case - lower part
Schema
Productieproces
- Hoe COVID-19 Automatisering in de Kunststofindustrie Versnelde
- Hoe COVID-19 De Toekomst Van Werk En Automatisering Herschaft – Inzichten Uit Een Nieuw Onderzoek
- Hoe automatisering productieveerkracht versnelde tijdens COVID-19
- COVID-10 en het Einde van het Post-WWII Economisch Paradigma
- Het Pandemie-effect: COVID-10 Versnelt Blockchain en Cryptocurrency Innovatie
- COVID-19 versnelt het einde van jaarlijkse zender RFP's
- Wayfair & COVID-19: Belastingvrije verkopers uitdagingen in een post-pandemie economie
- De vaardigheidskloof overbruggen: Reskilling en heropleiding strategieën post-COVID voor fabrikanten
- COVID‑19 Richtlijnen & Bronnen voor Productieleiders
- Snelle, nauwkeurige COVID-19 detectie met grafene-technologie
- SABIC's circulaire benadering: Kunststofverpakking, veiligheid en duurzaamheid tijdens COVID-19