eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaCzujnik pyłuCzujnik pyłu
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: Piotrne <p...@p...onet.pl>
    Newsgroups: pl.misc.elektronika
    Subject: Czujnik pyłu
    Date: Fri, 17 Feb 2017 01:12:39 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 234
    Message-ID: <5...@p...onet.pl>
    NNTP-Posting-Host: 193.34.223.162
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1487290359 4413 193.34.223.162 (17 Feb 2017 00:12:39
    GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Fri, 17 Feb 2017 00:12:39 +0000 (UTC)
    User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:31.0) Gecko/20100101 Thunderbird/31.6.0
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:713212
    [ ukryj nagłówki ]

    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:

    https://flic.kr/s/aHskUrY3TY - 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
    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: