Monitor de calitate a aerului cu Arduino și senzorul SDS011 - proiect DIY pas cu pas

Monitor de calitate a aerului cu Arduino și senzorul SDS011 - proiect DIY pas cu pas

Pe piață există zeci de senzori de particule fine, dar SDS011 de la Nova Fitness s-a impus ca standardul de facto pentru proiectele DIY de monitorizare a calității aerului. Folosește un laser real (nu LED infraroșu, ca senzorii ieftini), citește concentrații până la 999.9 µg/m³ cu eroare sub 10%, comunică prin UART la 9600 baud și are ventilator integrat pentru flux constant de aer. Plus că vine pre-calibrat din fabrică, ceea ce înseamnă că funcționează „out of the box" - lucru rar la senzorii sub 200 lei.

În acest ghid construiești un monitor compact cu Arduino Nano, SDS011 și un ecran OLED 0.96". Citirile PM2.5 și PM10 apar live, în µg/m³, cu actualizare la fiecare secundă.

Demonstrație video

Înainte să intri în detalii, uite cum arată proiectul în lucru:

Ce vei construi

Un dispozitiv care:

  • aspiră aer prin ventilatorul intern al SDS011;
  • măsoară particulele PM2.5 (sub 2.5 µm) și PM10 (sub 10 µm);
  • afișează valorile în µg/m³ pe un OLED 128x64;
  • trimite citirile și pe Serial Monitor, util pentru debugging și logging extern.

Monitor de calitate aer cu Arduino Nano și SDS011 cu afișaj OLED

Lista de componente

Componentă Detalii
Senzor Nova SDS011 Senzor laser PM2.5/PM10 cu UART și ventilator integrat
Arduino Nano (compatibil) Microcontroler ATmega328P pe modul mic
OLED 0.96" SSD1306 128x64 pixeli, conexiune SPI
Fire jumper și breadboard Pentru prototipare rapidă
Sursă 5V USB, baterie sau adaptor extern

Cum funcționează senzorul SDS011

Principiul fizic se numește laser scattering (împrăștiere a luminii laser) și e folosit și de senzorii profesionali, doar că la o scară mult mai compactă. Pașii interni:

  1. Ventilatorul mic trage aer constant prin orificiul de admisie.
  2. Un fascicul laser intersectează curentul de aer din camera de măsurare.
  3. Fiecare particulă care trece prin laser împrăștie lumina în toate direcțiile, proporțional cu mărimea ei.
  4. Un fotodetector poziționat lateral captează lumina împrăștiată și o convertește în impulsuri electrice.
  5. Microcontrolerul intern numără impulsurile, clasifică particulele pe categorii (2.5 µm și 10 µm) și calculează masa lor în µg/m³.
  6. Rezultatul iese pe UART la 9600 baud, în formă de mesaj binar standardizat.

Componente interne SDS011 - laser, ventilator, fotodetector

Specificații tehnice

  • Domeniu de măsură: 0.0 - 999.9 µg/m³
  • Timp de răspuns: ~1 secundă
  • Eroare: ±10% sau ±10 µg/m³ (la valori mici)
  • Temperatură de operare: -20°C până la +50°C
  • Curent: 100 mA activ, sub 4 mA în standby (sleep)
  • Alimentare: 5V DC, dar pinii RX/TX sunt toleranți la 3.3V
  • Durată de viață estimată: ~8000 ore de funcționare continuă (~10 ani la o citire pe minut)

SDS011 față de alți senzori populari

Dacă te întrebi de ce am ales SDS011 și nu altceva, uite o comparație rapidă:

Senzor Tehnologie Preț orientativ Observații
SDS011 Laser scattering ~150 lei Cel mai bun raport preț/precizie. Ventilator integrat. UART simplu.
PMS5003 / PMS7003 Laser scattering ~120-180 lei Mai compact decât SDS011, dar fără carcasă metalică. Citește și PM1.0.
GP2Y1010AU0F Optic IR ~50 lei Ieftin, dar imprecis. Necesită calibrare manuală și nu separă PM2.5 de PM10.
Senzori industriali Beta attenuation 5000+ lei Standard de referință, dar inaccesibil pentru DIY.

Pentru proiecte DIY, SDS011 lovește exact punctul „precizie decentă la preț accesibil".

Schema de conexiuni

SDS011 → Arduino Nano

Pin SDS011 Pin Arduino Nano
TX D3
RX D4
VCC (5V) 5V
GND GND

OLED SSD1306 (mod SPI) → Arduino Nano

Pin OLED Pin Arduino Nano
VCC 5V
GND GND
D0 (Clock) D10
D1 (MOSI / Data) D9
RES (Reset) D13
DC (Data/Command) D11
CS (Chip Select) D12

Schema completă a circuitului - Arduino Nano, SDS011 și OLED SSD1306

Biblioteci necesare

Toate sunt în Arduino Library Manager (Sketch → Include Library → Manage Libraries):

  • SDS011 de R. Zschiegner - driver pentru senzor
  • Adafruit GFX Library - grafică de bază pentru OLED
  • Adafruit SSD1306 - driver pentru controller-ul ecranului

Codul sursă

Codul citește valorile PM la fiecare ciclu și le afișează simultan pe OLED și pe Serial Monitor:

// Monitor calitate aer cu SDS011 + OLED SSD1306
// Adaptat dupa: circuitdigest.com (link in finalul articolului)

#include <SDS011.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

float p10, p25;
int error;
SDS011 my_sds;

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {
  // comunicatie cu SDS011: RX pe pinul 3, TX pe pinul 4
  my_sds.begin(3, 4);
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  display.display();
}

void loop() {
  error = my_sds.read(&p25, &p10);
  if (!error) {
    // afiseaza pe Serial pentru debugging
    Serial.println("PM2.5: " + String(p25));
    Serial.println("PM10:  " + String(p10));

    // afiseaza pe OLED
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0, 15);
    display.println("PM2.5");
    display.setCursor(67, 15);
    display.println(p25);
    display.setCursor(0, 40);
    display.println("PM10");
    display.setCursor(67, 40);
    display.println(p10);
    display.display();
    display.clearDisplay();
  }
  delay(100);
}

Asamblare și testare pas cu pas

  1. Identifică pinii senzorului. SDS011 are un cablu JST cu 7 pini, dar pentru proiectul ăsta folosești doar 4: TX, RX, 5V și GND. Verifică marcajul de pe cablu sau datasheet-ul oficial înainte să conectezi - dacă inversezi VCC cu GND, riști să arzi senzorul.
  2. Conectează SDS011 la Arduino conform primului tabel. Folosește breadboard la prima rulare; perfboard-ul vine la final.
  3. Conectează OLED-ul pe pinii SPI. Cele 7 conexiuni sunt ușor de încurcat - merită să le bifezi una câte una.
  4. Alimentează Arduino prin USB de la calculator.
  5. În Arduino IDE alege Board: Arduino Nano, procesorul corect (ATmega328P sau "Old Bootloader" în funcție de cipul ce vine pe placă) și COM-portul.
  6. Instalează cele trei biblioteci din Library Manager.
  7. Copiază codul de mai sus, apasă Verify (bifa) ca să compileze, apoi Upload (săgeată).
  8. După upload, deschide Serial Monitor la 9600 baud. Ar trebui să vezi linii cu „PM2.5: ..." și „PM10: ..." la fiecare câteva sutimi de secundă.
  9. Privește OLED-ul: aceleași valori trebuie să apară și acolo, cu actualizare aproape în timp real.

Dacă auzi ventilatorul senzorului pornit (un zgomot fin, similar cu un mini-cooler), e semn bun. Senzorul are nevoie de 10-15 secunde după pornire pentru citiri stabile.

Montaj final cu Arduino Nano, SDS011 si OLED pe breadboard

Calibrare și precizie

SDS011 vine pre-calibrat din fabrică și nu necesită ajustări pentru utilizare normală. Totuși, dacă vrei date foarte precise (de exemplu, pentru un proiect de cercetare), reține:

  • Umiditate ridicată (peste 70%) supraestimează valorile, pentru că laserul „vede" și picăturile de apă ca pe particule. O corecție simplă: ignoră citirile sau aplică un factor de scădere la umiditate mare.
  • Senzorul îmbătrânește - după 3-4 ani, sensibilitatea poate scădea cu 10-15%. Poți recalibra comparând cu o stație oficială (de exemplu, datele de la aqicn.org sau sensor.community) și ajustând prin software cu un factor de scală.
  • Sleep mode - SDS011 are durată de viață limitată (~8000 ore active). Dacă vrei să-l ții pornit non-stop, e mai bine să-l rotești 30 secunde pornit, 4-5 minute oprit (sleep). Comanda e disponibilă în biblioteca SDS011.

Cum interpretezi valorile

PM2.5 este indicatorul cel mai important pentru sănătate - particulele mici ajung adânc în plămâni și chiar în sânge. Iată ghidul orientativ pentru PM2.5 (µg/m³), aliniat la scara AQI și OMS:

  • 0 - 12 - aer bun, fără riscuri
  • 12 - 35 - moderat, persoanele foarte sensibile pot resimți disconfort
  • 35 - 55 - nesănătos pentru grupuri sensibile (astm, copii, vârstnici)
  • 55 - 150 - nesănătos pentru toată populația
  • peste 150 - foarte nesănătos, evită activitățile în aer liber

Pentru context: OMS recomandă media anuală sub 5 µg/m³, iar UE impune limita anuală de 25 µg/m³. În București media depășește frecvent 20 µg/m³, cu vârfuri iarna peste 100 µg/m³ în zilele cu inversiune termică.

Upgrade-uri și extinderi

Monitorul de bază e doar punctul de plecare. Cele mai utile direcții în care îl poți duce:

  • LED-uri „semafor" - verde / galben / roșu, controlate de Arduino în funcție de pragul PM2.5. Lampă vizuală pe birou care îți spune când să aerisești.
  • Buzzer de alertă - un beep scurt când valoarea trece de 35 µg/m³.
  • WiFi cu ESP8266 sau ESP32 - cel mai popular upgrade. Înlocuiești Arduino Nano cu un NodeMCU ESP8266 sau ESP32 și trimiți datele către Home Assistant, ThingsBoard, MQTT sau un Google Sheet via Apps Script. SDS011 e direct compatibil cu plăcile ESP (tolerează 3.3V pe UART).
  • Card SD pentru logging - cu modul SD card și un RTC (Real Time Clock) salvezi istoricul cu timestamp și îl analizezi mai târziu în Excel sau Python (matplotlib).
  • Sensor.Community - proiectul fost Luftdaten. Cu un firmware special urci datele tale pe harta colaborativă globală de calitate a aerului și contribui la știință cetățenească. Setup-ul oficial folosește ESP8266.
  • Carcasă imprimată 3D - protejează electronica și permite montaj exterior. Există zeci de modele open-source pe Thingiverse pentru SDS011, multe gândite să direcționeze fluxul de aer corect și să țină ploaia departe.
  • Power management - pentru un monitor portabil cu baterie, folosește comanda de sleep a SDS011 (citire o dată pe minut, restul timpului oprit). Reduci consumul mediu de la 100 mA la ~5 mA.

Probleme frecvente și depanare

  • Senzorul nu răspunde: verifică alimentarea (trebuie strict 5V) și că nu ai inversat TX cu RX. Ventilatorul trebuie să se audă pornit - dacă nu se aude, e probabil problemă de alimentare.
  • Valori constante 0.0: alimentare ok, dar comunicarea pe UART e ratată. Verifică pinii din my_sds.begin(3, 4) și asigură-te că nu folosești același Serial cu cel hardware (pinii 0 și 1 ai Arduino Nano).
  • OLED rămâne negru: probabil ai un OLED cu I2C, nu SPI. Verifică - dacă are doar 4 pini (VCC, GND, SCL, SDA), e I2C. În acest caz schimbă biblioteca pe inițializare I2C cu adresa 0x3C.
  • Valori care oscilează puternic: normal în primele 30 de secunde, după mișcări bruște sau lângă o sursă de praf (un soclu, un calorifer). Așteaptă să se stabilizeze.
  • Eroare la compilare: de obicei lipsește o bibliotecă. Verifică în Library Manager dacă toate trei sunt instalate (SDS011, Adafruit_GFX, Adafruit_SSD1306).
  • Valori prea mari iarna: probabil normal - iarna calitatea aerului scade real, mai ales în orașele cu încălzire pe lemne. Compară cu stația oficială cea mai apropiată pe aqicn.org ca să confirmi.

Proiect adaptat după tutorialul publicat de CircuitDigest: Air Quality Analyzer using Arduino and Nova PM Sensor SDS011. Video demonstrativ: CircuitDigest pe YouTube. Pentru variante alternative (cu ESP8266, ESP32 sau ESPHome), recomandăm și sursa originală.

0 comments

Leave a comment

Please note, comments need to be approved before they are published.