Skip to Content

Sensore di polveri GP2Y1010AU0F con Arduino

Sensore di polveri GP2Y1010AU0F con Arduino

In questo tutorial imparerai come utilizzare il sensore di polveri GP2Y1010AU0F con un Arduino per misurare la densità di polveri. Vedremo le caratteristiche del sensore, come collegarlo a una scheda Arduino e come interpretare i dati che fornisce.

Misurare la densità di polveri è importante per la salute, perché alti livelli di polvere nell’aria possono causare problemi respiratori, allergie e altri disturbi. Monitorare i livelli di polvere ci permette di valutare la qualità dell’aria, sia in ambienti interni che esterni, identificare potenziali rischi per la salute e adottare le misure necessarie per migliorarla.

Componenti necessari

Per questo progetto ho usato un Arduino Uno, ma qualsiasi altra scheda Arduino, oppure una scheda ESP8266/ESP32, funzionerà altrettanto bene.

Il sensore di polveri GP2Y1010AU0F viene fornito con un condensatore da 220µF e una resistenza da 150Ω, necessari per collegare il sensore ad Arduino. Non serve acquistarli separatamente.

Sensore di polveri GP2Y1010AU0F

Arduino

Arduino Uno

Dupont wire set

Set di cavi Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cavo USB per 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.

Nozioni di base sul sensore di polveri GP2Y1010AU0F

Il GP2Y1010AU0F è un sensore ottico per la qualità dell’aria, progettato per rilevare particelle di polvere. È particolarmente efficace nel rilevare particelle molto fini come il fumo di sigaretta, ed è comunemente usato nei sistemi di purificazione dell’aria. L’immagine seguente mostra il sensore.

Picture of the GP2Y1010AU0F Dust Sensor
Immagine del sensore di polveri GP2Y1010AU0F

Struttura interna

All’interno del sensore sono disposti in diagonale un LED a infrarossi e una fotoresistenza a infrarossi. La luce del LED IR viene riflessa dalle particelle di polvere che entrano nel dispositivo attraverso un foro (dust path). La quantità di luce IR riflessa viene misurata dal sensore a infrarossi e convertita in una tensione di uscita. Più polvere c’è nel percorso, più luce viene riflessa e maggiore sarà la tensione di uscita. L’immagine qui sotto mostra la costruzione interna del sensore GP2Y1010AU0F.

Internal construction of GP2Y1010AU0F
Costruzione interna del GP2Y1010AU0F

Il GP2Y1010AU0F ha un basso consumo di corrente, massimo 20mA o tipico 11mA, e funziona a 5V. La sua tensione di uscita è proporzionale alla densità di polveri rilevata, con una sensibilità di 0,5V/0,1mg/m 3 . Il sensore può rilevare particelle piccole fino a 0,5µm e la densità massima di polveri che può misurare è 580 µg/m 3 .

Schema interno

L’immagine seguente mostra lo schema interno del GP2Y1010AU0F. Puoi vedere il circuito che alimenta il LED IR (IRED) e il circuito amplificatore con il fotodiodo IR (PD) che genera il segnale di uscita Vo sul pin 5.

Internal schematic of GP2Y1010AU0F
Schema interno del GP2Y1010AU0F ( source )

C’è anche un trimmer (resistenza regolabile Rs) per regolare la sensibilità del sensore, ma non dovresti modificarlo. Nell’immagine qui sotto puoi vedere la posizione del trimmer e dell’IC amplificatore.

Electronics of the GP2Y1010AU0F
Elettronica del GP2Y1010AU0F

Il GP2Y1010AU0F ha un connettore a sei pin. Il LED a infrarossi è alimentato tramite (1) V-LED e (2) LED-GND e controllato tramite il pin (3) LED. L’IC amplificatore del segnale è alimentato tramite (6) Vcc e (4) S-GND e il segnale di uscita Vo si trova sul pin (5).

Datasheet

Per informazioni più dettagliate sul GP2Y1010AU0F dai un’occhiata al datasheet e alle application notes linkate qui sotto.

Collegare il GP2Y1010AU0F ad Arduino

Per collegare il GP2Y1010AU0F ad Arduino dobbiamo seguire l’esempio di applicazione fornito nelle Application Notes (vedi sotto).

Application Example GP2Y1010AU0F
Esempio di applicazione GP2Y1010AU0F ( source )

Puoi vedere che il segnale di uscita Vo sul pin (5) va all’ADC (convertitore analogico-digitale) del microcontrollore e che il LED IR sul pin (3) è controllato tramite un pin di uscita del microcontrollore.

Non avremo bisogno del transistor mostrato per pilotare il LED IR, dato che un pin GPIO di Arduino può facilmente fornire i 20mA richiesti dal LED. C’è anche un po’ di circuiteria aggiuntiva come una resistenza da 150Ω per limitare la corrente del LED IR e un condensatore da 220µF, ma nulla di complicato.

Il seguente pinout mostra dove si trovano i sei pin sul connettore del sensore.

Pinout of GP2Y1010AU0F
Pinout del GP2Y1010AU0F

V-LED alimenta il LED e va collegato a 5V con una resistenza da 150Ω. LED-GND  è la massa per il LED IR e va collegata al GND pin di Arduino. LED serve per accendere e spegnere il LED e lo colleghiamo al pin 7 di Arduino. Comunque, qualsiasi altro pin di uscita digitale va bene.

S-GND  è la massa per il sensore e va collegata al GND pin di Arduino. Vo fornisce l’uscita del sensore e va collegato all’ingresso analogico A0 di Arduino. Vcc è l’alimentazione per il modulo sensore e va collegato a 5V.

La foto seguente mostra il cablaggio completo su breadboard, incluso il condensatore da 220µF.

Connecting GP2Y1010AU0F to Arduino
Collegamento GP2Y1010AU0F ad Arduino

Quando colleghi il condensatore, fai attenzione alla polarità corretta. Il pin negativo (di solito più corto e segnato da una striscia bianca) deve essere collegato a massa (filo nero).

Codice per misurare la densità di polveri con GP2Y1010AU0F

Per misurare la densità di polveri, diamo prima un’occhiata alla curva di risposta del GP2Y1010AU0F. Mostra come la tensione di uscita Vo cambia all’aumentare della densità di polveri, misurata in milligrammi per metro cubo (mg/m 3 ).

Response Curve of GP2Y1010AU0F
Curva di risposta del GP2Y1010AU0F ( source )

Per densità di polveri da 0 a 0,5 mg/m 3 il grafico mostra una relazione quasi lineare tra tensione e densità di polveri. Quando ci avviciniamo alla densità massima di 580 µg/m 3 (=0,58 mg/m 3 ) che il sensore può rilevare, la curva si appiattisce e non possiamo più misurare valori utili. La tensione di uscita massima sarà circa 3,7V a questo punto.

Calcolo della densità di polveri

La parte lineare del grafico può essere descritta dalla seguente equazione:

D[mg/m 3 ] = 0.170 x Vo − 0.1

Ci permette di calcolare la densità di polveri D in mg/m 3 misurando la tensione di uscita Vo con Arduino. Poiché le densità di polveri in mg/m 3 tendono a essere numeri piccoli, possiamo anche misurare le densità in µg/m 3 , semplicemente moltiplicando la densità in mg/m 3 per 1000.

D[µg/m 3 ] = (0.170 x Vo − 0.1) x 1000

Protocollo di campionamento

Il datasheet del GP2Y1010AU0F indica che dovremmo usare il seguente protocollo di campionamento quando misuriamo la densità di polveri. Dopo aver acceso il LED IR bisogna attendere 0,28 millisecondi, poi leggere la tensione di uscita Vo e successivamente spegnere il LED IR.

Sampling Protocol for GP2Y1010AU0F
Protocollo di campionamento per GP2Y1010AU0F ( source )

Con l’equazione della densità di polveri sopra e il protocollo di campionamento, ora abbiamo tutte le informazioni per scrivere il codice che misura effettivamente la densità di polveri con il GP2Y1010AU0F e Arduino.

Codice per la misurazione della densità di polveri

Guarda prima il codice completo e poi analizziamolo nei dettagli.

const int sensorPin = A0;
const int ledPin = 7;
const int adcMax = 1023;
const float Vcc = 5.0;

float readDensity() {
  digitalWrite(ledPin, LOW);
  delayMicroseconds(280);
  int adc = analogRead(sensorPin);  
  float v0 = Vcc * adc / adcMax;
  float density = 0.170 * v0 - 0.1;  // mg/m^3
  digitalWrite(ledPin, HIGH);
  return density * 1000;             // ug/m^3
}

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  delay(1000);
}

void loop() {
  Serial.print("Dust:");
  Serial.println(readDensity());
  delay(1000);
}

Costanti

Il codice inizia definendo alcune costanti. sensorPin è l’ingresso analogico a cui è collegata l’uscita Vo del sensore di polveri, e ledPin è l’uscita digitale che controlla il LED IR all’interno del sensore.

adcMax è il valore massimo che può restituire l’ADC (convertitore analogico-digitale). Nel caso di Arduino Uno, che ha un ADC a 10 bit, questo valore è 1023. Se usi un altro microcontrollore, dovrai adattare questo valore. Consulta la funzione analogRead() o il datasheet del tuo microcontrollore per maggiori informazioni.

Specifichiamo anche la tensione di alimentazione Vcc qui. In teoria il sensore può funzionare anche a 3,3V, ma in tal caso dovrai adattare la resistenza per il LED IR o mantenere quella tensione a 5V. Inoltre, dovrai assicurarti che l’ingresso analogico non superi la tensione massima. Per semplicità, è meglio restare a 5V.

const int sensorPin = A0;
const int ledPin = 7;
const int adcMax = 1023;
const float Vcc = 5.0;

Lettura della densità di polveri

Poi abbiamo la funzione readDensity() che legge la densità di polveri misurata dal sensore. Prima la funzione accende il LED IR tramite digitalWrite(ledPin, LOW) . Nota che la logica è invertita (LOW significa acceso).

Poi aspettiamo 0,28ms (=280µs) come consigliato dal datasheet prima di leggere l’uscita Vo del sensore usando analogRead() . Tuttavia, l’ADC di Arduino non restituisce la tensione su A0 ma un valore grezzo (0…1023) che dobbiamo convertire in tensione v0 tramite v0 = Vcc * adc / adcMax .

Ora possiamo applicare l’equazione vista sopra per convertire la tensione v0 in una misura di polveri density in mg/m^3. Dopo aver spento il LED IR, moltiplichiamo la densità density per 1000 per restituire una misura in µg/m 3 .

float readDensity() {
  digitalWrite(ledPin, LOW);
  delayMicroseconds(280);
  int adc = analogRead(sensorPin);  
  float v0 = Vcc * adc / adcMax;
  float density = 0.170 * v0 - 0.1;  // mg/m^3
  digitalWrite(ledPin, HIGH);
  return density * 1000;             // ug/m^3
}

Funzione setup

La funzione setup è semplice. Inizializziamo l’interfaccia seriale, impostiamo la modalità di ledPin su OUTPUT e aspettiamo un secondo: il datasheet dice che il sensore ha bisogno di circa 1 secondo per essere pronto.

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  delay(1000);
}

Funzione loop

Nella funzione loop, chiamiamo semplicemente la nostra funzione readDensity() e stampiamo la densità di polveri misurata sul serial monitor. Ripetiamo la misura circa ogni secondo (senza contare i 0,28ms della misura). Puoi campionare più velocemente, fino a 100ms funziona bene. Più veloce di così e ho notato che il sensore smette di reagire correttamente.

void loop() {
  Serial.print("Dust:");
  Serial.println(readDensity());
  delay(1000);
}

Esempio di output

Se apri il Serial Plotter dovresti vedere le normali densità di polveri oscillare intorno a 0 µg/m 3 . Ho agitato energicamente uno spolverino davanti al sensore e puoi vedere il picco di densità di polveri nel grafico qui sotto.

Serial Plotter output when Sensor is exposed to dust
Output del Serial Plotter quando il sensore è esposto alla polvere

Poi ho bruciato un fiammifero e il sensore ha reagito di nuovo fortemente al fumo prodotto. Nota che il fumo è rimasto nell’aria più a lungo della polvere.

Serial Plotter output when Sensor is exposed to Smoke
Output del Serial Plotter quando il sensore è esposto al fumo

Infine, puoi anche testare il funzionamento del sensore e del codice bloccando il percorso della polvere con un oggetto, ad esempio un piccolo cacciavite come mostrato nella foto qui sotto.

Blocking Dust Path for Testing
Blocco del percorso della polvere per il test

La densità di polveri misurata dovrebbe salire vicino al valore massimo di circa 580 µg/m 3 che il sensore può misurare. Io ho ottenuto un valore di 534 µg/m 3 .

Ed ecco fatto! Un piccolo sensore di polveri che ti aiuterà a mantenere sano il tuo ambiente.

Conclusioni

Il GP2Y1010AU0F è un sensore facile da usare e abbastanza sensibile. Reagisce bene a polvere, fumo e dovrebbe essere in grado di rilevare anche il polline, anche se non l’ho ancora testato.

Se colleghi il sensore a un microcontrollore diverso dall’Arduino Uno usato qui, fai attenzione alle diverse tensioni (5V vs 3,3V), alla risoluzione e al range di ingresso dell’ADC (convertitore analogico-digitale). Molti tutorial sul GP2Y1010AU0F sbagliano leggermente questi dettagli e le misure risultanti della densità di polveri sono errate. Fai attenzione anche alla conversione da mg/m 3 a µg/m 3 , che a volte viene implementata in modo errato.

Infine, se ti serve un sensore che possa misurare la concentrazione di particelle PM2.5 dai un’occhiata al DSM501 sensor .

FAQ

Quali sono i livelli sani e non sani di densità di polveri misurati in µg/m 3 ?

I livelli sani di densità di polveri sono tipicamente inferiori a 50 µg/m 3 , mentre livelli non sani sono superiori a 150 µg/m 3 .

Qual è la relazione tra la densità di polveri misurata in µg/m 3 e il particolato PM, in particolare PM2.5 e PM10?

La densità di polveri misurata in µg/m 3 è direttamente collegata al particolato (PM), inclusi PM2.5 e PM10. PM2.5 si riferisce a particelle con diametro di 2,5 µm o inferiore, mentre PM10 a particelle con diametro di 10 µm o inferiore. Una densità di polveri più alta indica livelli più elevati di PM2.5 e PM10 nell’aria.

Particle Size Comparison
Confronto delle dimensioni delle particelle ( source )

Perché l’inquinamento da PM2.5 è dannoso per la salute?

Tra tutte le misure di inquinamento dell’aria, il PM2.5 rappresenta la minaccia più grande per la salute. A causa delle sue dimensioni ridotte, il PM2.5 può rimanere sospeso nell’aria a lungo e, se inalato, può penetrare in profondità nel flusso sanguigno.

Quali sono le principali fonti di inquinamento da PM2.5?

Le fonti comuni di inquinamento da PM2.5 sono motori e combustione, processi industriali, stufe, caminetti e bruciatura domestica della legna, fumo da fuochi d’artificio e incendi boschivi, fumo di sigaretta, polvere e pollini.

Un sensore PM2.5 o PM10 può misurare il polline?

La maggior parte delle particelle di polline è più grande delle particelle PM2.5 e PM10 e verrebbe ignorata da un sensore PM2.5 o PM10. Tuttavia, mentre i pollini di solito superano i 10 µm, possono rompersi in particelle più piccole nella gamma PM2.5, che possono essere rilevate.

Posso calibrare il sensore GP2Y1010AU0F per misurare valori PM2.5 o PM25?

No, il sensore GP2Y1010AU0F è progettato per rilevare particelle più grandi e non può essere calibrato per misurare valori PM2.5 o PM25.

Qual è la dimensione tipica del polline e un sensore di polveri come il GP2Y1010AU0F può misurare la densità di polline?

La dimensione tipica del polline è tra 10 e 100 µm. Se riesci a vedere il polline fluttuare nell’aria, significa che la particella è piuttosto grande, almeno 60 µm. Il sensore di polveri GP2Y1010AU0F può rilevare particelle più grandi di 0,5 µm, quindi può rilevare anche il polline.

Qual è un livello non sano di densità di polline?

Un livello non sano di densità di polline è generalmente considerato alto quando supera i 100 granuli per metro cubo, il che può scatenare allergie nei soggetti sensibili.

A quale densità in µg/m^3 corrispondono 100 granuli per metro cubo?

La conversione da granuli a microgrammi per metro cubo (µg/m^3) dipende dalla densità del materiale specifico. Per il polline, il fattore di conversione è circa 1 granulo = 6,48 µg/m^3. Quindi, 100 granuli di polline equivalgono a 648 µg/m^3.