-
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
atman.pl!.POSTED!not-for-mail
From: Piotrne <p...@p...onet.pl>
Newsgroups: pl.misc.elektronika
Subject: Czujnik pyłu
Date: Fri, 17 Feb 2017 01:12:56 +0100
Organization: ATMAN - ATM S.A.
Lines: 234
Message-ID: <o85f68$49v$1@node2.news.atman.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 1487290376 4415 193.34.223.162 (17 Feb 2017 00:12:56
GMT)
X-Complaints-To: u...@a...pl
NNTP-Posting-Date: Fri, 17 Feb 2017 00:12:56 +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:713213
[ 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
}
Następne wpisy z tego wątku
- 17.02.17 08:13 Krzysiek
- 17.02.17 14:23 Piotrne
- 18.02.17 01:37 Piotrne
- 18.02.17 03:03 Zenek Kapelinder
- 18.02.17 11:32 Pawel
- 18.02.17 11:48 Pawel
- 18.02.17 15:12 AlexY
- 18.02.17 16:01 Piotrne
- 18.02.17 16:51 Zenek Kapelinder
- 18.02.17 16:59 Pawel
- 19.02.17 00:57 AlexY
- 19.02.17 03:26 Zenek Kapelinder
- 20.02.17 00:26 AlexY
- 20.02.17 07:20 t...@g...com
- 20.02.17 10:29 Zenek Kapelinder
Najnowsze wątki z tej grupy
- Digikey, SN74CBT3253CD, FST3253, ktoś ma?
- Szukam: czujnik ruchu z możliwością zaączenia na stałe
- kabelek - kynar ?
- Podnieść masę o 0.6V
- Moduł BT BLE 5.0
- Pomiar amplitudy w zegarku mechanicznym
- ale zawziętość i cierpliwość
- Chiński elektrolizer tester wody
- Dzisiaj Bentlejem czyli przybieżeli sześciu Króli do Rysia na kasie
- ciekawy układ magnetofonu
- Mikroskop 3D
- Jak być bezpiecznym z Li-Ion?
- Szukam monitora HDMI ok. 4"
- Obcinaczki z łapaczem
- termostat do lodowki
Najnowsze wątki
- 2025-01-01 Już nie płoną
- 2025-01-01 Digikey, SN74CBT3253CD, FST3253, ktoś ma?
- 2025-01-01 Co tam u Was
- 2025-01-01 Koder szuka pracy. Koduję w j.: Asembler, C, C++ (z bibl. Qt) i D.
- 2025-01-01 Gdańsk => Delphi Programmer <=
- 2025-01-01 Łódź => Programista Full Stack .Net <=
- 2025-01-01 Żerniki => Regionalny Kierownik Sprzedaży (OZE) <=
- 2025-01-01 Wrocław => Specjalista ds. Sprzedaży <=
- 2024-12-31 Warszawa => Spedytor Międzynarodowy <=
- 2024-12-31 Warszawa => Architekt rozwiązań (doświadczenie w obszarze Java, AWS
- 2025-01-01 Przypomnienie: Mini Netykieta polskich grup dyskusyjnych wer. 3.2.2
- 2024-12-31 Zamykanie konta dziecka.
- 2024-12-31 Czy apka bankowa to gra komputerowa?
- 2024-12-31 Szukam: czujnik ruchu z możliwością zaączenia na stałe
- 2024-12-31 Warszawa => Solution Architect (Java background) <=