pyłu

Z okazji występującego w okolicy smogu i braku wiarygodnych pomiarów stężenia pyłu w powietrzu, kupiłem na ebay-u za 4$ czujnik pyłu SHARP GP2Y1010AU0F. Mierzy według dokumentacji stężenia do 500 mikrogramów na metr sześcienny. Niestety nie pokrywa to spodziewanych stężeń (w okolicy spodziewam się około 2000 mikrogramów), ale innego czujnika za 4$ nie było.

Poskładałem z tego i z Arduino Uno miernik - według znalezionych opisów. Okazało się, że właściwie wszystkie opisy zawierały błędy: zamienione zasilanie całości i diody LED, błędny wzór wyznaczający stężenie pyłu, odwrotne włączanie/wyłączanie diody itp. Zrobiłem to "od zera" i działa jak powinno.

Dla zainteresowanych:

formatting link
- kilka obrazków

Kod dla Arduino Uno poniżej.

W mieszkaniu wychodzi 75 ug/m3, za oknem 110 ug/m3. Według pobliskiej stacji pomiarowej (Gliwice, ul. Mewy

- odległość 200 metrów), stężenie PM10 wynosi 197 ug/m3. Jest to pomiar na osiedlu, na którym nie ma ogrzewania węglowego ani dużych ulic, a osiedle graniczy z polami. W centrum miasta stężenia są prawdopodobnie wielokrotnie większe. Być może z tego powodu stację pomiarową przeniesiono z centrum na takie osiedle - wyniki pomiarów w centrum były nie do przyjęcia.

P.

/*******************************************************

Obsługa czujnika pyłu SHARP GP2Y1010AU0F

Program wyświetla stężenie pyłu w mikrogramach na metr sześcienny.

Program dla Arduino Uno z nakładką LCD + klawiaturka (2 linijki * 16 znaków, pod spodem 5 klawiszy i dodatkowo klawisz RST).

Podłączenie czujnika pyłu: piny złącza 6-stykowego numerowane 1 do 6, 1 przy brzegu czujnika, 6 przy otworze na powietrze:

1: przez rezystor 150 Ohm do +5V 2: GND 3: LEDpin (wybrane wyjście cyfrowe, np. 3) 4: GND 5: ADCin (wejście analogowe inne niż 0 (już zajęte przez klawiaturę)) 6: +5V

Dodatkowo między 1 a GND: kondensator 220 uF.

Program włącza diodę i po 280 mikrosekundach mierzy napięcie na wyjściu 5 podłączonym do ADCin. Potem wyłącza diodę. Przelicza napięcie na stężenie pyłu wg wykresu w dokumentacji czujnika. Czujnik ma zakres do 500 ug/m3, co odpowiada napięciu 3.5 V. Powyżej tej wartości następuje nasycenie, a program wyświetla wynik "999".

Program uśrednia 10 kolejnych pomiarów. Dlatego po włączeniu przez kilka sekund wynikiem jest 0, dopiero później pojawiają się właściwe wartości.

W drugiej linijce wyświetlana jest wartość z przetwornika A/C oraz wyliczone na tej podstawie napięcie.

Piotr Fabian, 2017-02-17

Obsługa LCD: wg Mark Bramwell Fragment obsługi czujnika: wg WaveShare (czas 280 us)

********************************************************/

#include <LiquidCrystal.h>

// Wyjścia używane przez wyświetlacz 16*2 "LCD shield" LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define REF_VOLTAGE 5.0 /* V */

/* Porty I/O */ const int LEDpin = 3; // Sterowanie LED czujnika const int ADCin = 2; // Wejście analogowe

float density, voltage; int adcval;

// wartości do obsługi klawiatury int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5

// odczyt klawiatury int read_LCD_buttons() { adc_key_in = analogRead(0); // czytamy wejście analogowe if (adc_key_in > 1000) return btnNONE; // brak klawisza /* // For V1.1 us this threshold

if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT;

*/ // For V1.0 comment the other threshold and use the one below:

if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT;

return btnNONE; }

/* Filtrowanie: średnia krocząca */ int filterpf(int m) { #define bfsize 10 static int buf[bfsize]; static int flag_first=1; static int idx=0; static int sum=0; int i; if (flag_first==1) { for(i=0;i<bfsize;i++) buf[i]=0; sum=0; flag_first=0; } sum-=buf[idx]; buf[idx]=m; sum+=m; idx++; if (idx>=bfsize) idx=0; return sum / bfsize; }

void setup(void) { pinMode(LEDpin, OUTPUT); digitalWrite(LEDpin, HIGH); // LEDpin: wyłączamy diodę

lcd.begin(16, 2); // włączamy obsługę LCD lcd.setCursor(0,0); }

int key;

void loop(void) {

#if 0

/* Fragment testujący diodę czujnika */ /* (dioda widoczna przez kamery i aparaty */ /* cyfrowe ze słabym filtrem IR) */ /* Dioda włączana jest klawiszem SELECT */

key = read_LCD_buttons(); lcd.setCursor(0,0); if (key==btnSELECT) { lcd.print("ON "); digitalWrite(LEDpin, LOW); } else { lcd.print("OFF"); digitalWrite(LEDpin, HIGH); }

#else digitalWrite(LEDpin, LOW); // ??? odwrotnie niż w przykładach?

delayMicroseconds(280); adcval = analogRead(ADCin); digitalWrite(LEDpin, HIGH);

lcd.setCursor(0,1); lcd.print(" "); lcd.print(adcval); lcd.print(" "); voltage = (REF_VOLTAGE / 1024.0) * adcval; lcd.print(voltage); lcd.print("V ");

adcval = filterpf(adcval); voltage = (REF_VOLTAGE / 1024.0) * adcval;

// Wg dokumentacji stężenie pyłu w ug/m3 // jest równe w przybliżeniu // 175*voltage-114 // Powyżej voltage>3.5V nasycenie, ze stężeniem pyłu powyżej 500 ug/m3 // PF, 2017-02-16 density = 175*voltage-114; if (density<0) density=0; if (voltage>3.5) density=999; // poza zakresem czujnika

/* wyświetlamy wyniki */ lcd.setCursor(0,0); lcd.print((int)density); lcd.print(" ug/m3"); lcd.print(" "); delay(500);

#endif }

Reply to
Piotrne
Loading thread data ...

W dniu piątek, 17 lutego 2017 01:12:40 UTC+1 użytkownik Piotrne napisał:

No i co? Lepiej ci się oddycha? Smoki na Śląsku były, są i będą. Za kumuny były jeszcze lepsze, bo były huty. I ciuchcie napędzane wąglem dowoziły górników do kopalń. I wąglem wszystko było jarane. A teraz VW zrobił przekręta na sofcie i jest lipa!! Byłem dzisiaj w KTW, powiadali w mediach że smok..

Są 3 prawdy:

1-prawda 2-świnto prawda 3-gówno prawda

3 !!

Reply to
stchebel

może posprzątali, taki zaszczyt przyjechał popisowy lider...

Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.