-
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
}
Następne wpisy z tego wątku
- 17.02.17 18:02 s...@g...com
- 17.02.17 18:27 niepełnosprawny intelektualnie 'POPIS/EU
Najnowsze wątki z tej grupy
- Pytanie o transformator do dzwonka
- międzymordzie USB 3.2 jako 2.0
- elektronicy powinni pomysleć o karierze elektryka
- jak szybko plynie prad
- Płytki Milkv-Duo
- Światłowód między budynkami
- POtrzebny bufor 3.3<>5V, jedonkieruowy, trójstanowy, wąski
- retro
- Bezprzewodowe polączenie Windows z projektorem
- rozklejanie obudowy
- Prośba o identyfikację komponentu
- Smart gniazdko straciło na zasięgu wifi?
- Smart gniazdko straciło zasięg wifi?
- nurtuje mnie
- dziwna sprawa...
Najnowsze wątki
- 2024-11-08 Belka
- 2024-11-09 pierdolec na punkcie psa
- 2024-11-09 Warszawa => Sales Executive <=
- 2024-11-09 Wrocław => SAP BTP Consultant (mid/senior) <=
- 2024-11-09 Warszawa => ECM Specialist / Consultant <=
- 2024-11-09 Warszawa => Senior Frontend Developer (React + React Native) <=
- 2024-11-10 TVN donosi: Obywatelskie zatrzymanie policjanta (nie na służbie)
- 2024-11-08 Warszawa => Head of International Freight Forwarding Department <=
- 2024-11-08 Warszawa => Key Account Manager <=
- 2024-11-08 Szczecin => Key Account Manager (ERP) <=
- 2024-11-08 Białystok => Full Stack web developer (obszar .Net Core, Angular6+) <
- 2024-11-08 Wrocław => Senior PHP Symfony Developer <=
- 2024-11-08 Warszawa => QA Engineer <=
- 2024-11-08 Warszawa => QA Inżynier <=
- 2024-11-08 Warszawa => Key Account Manager <=