W artykule będziemy omawiać czujnik pyłu/czystości powietrza DSM501A. Omówię sposób jego działania, przedstawię przykład jego użycia kolejno omawiając etapy tego co należy zrobić, abyście sami mogli wykonać taki przykład.
Spis treści
- Krótki opis
- Specyfikacja
- Przykład
- Pliki do pobrania
Krótki opis
Czujnik dzięki wewnętrznemu led -owi i grzejnikowi działa na zasadzie czujnika gęstości i sprawdza zagęszczenie pyłu w powietrzu. Na początku powietrze jest pobierane i ogrzewane grzejnikiem. Kolejno wbudowy LED podświetla to powietrze dla łatwiejszego wykrycia cząsteczek przez czujnik.
Specyfikacja
- Napięcie zasilania: od 4,5 V do 5,5 V
- Pobór prądu: 90 mA
- Czułość: 1 μm
- Komunikacja: sygnał częstotliwościowy PWM
- Temperatura pracy: od -10 °C do 65 °C
- Złącze połączeniowe: 20010WR-05
- Wymiary płytki: 58,8 x 44,55 x 16,8 mm
Składa się z :
- Dioda LED
- Czujnik
- Obwód wzmacniacza sygnału
- 2x Obwód napędu wyjściowego
- Grzałka
Przebieg Przykładu
Elementy
- Czujnik pyłu/ czystości powietrza PM2.5 DSM501A
- Płytka stykowa
- Kable stykowe
- Arduino Mega lub Uno
Podłączenie
Kable od czujnika wpinamy do płytki stykowej. Dodam, że nie będziemy korzystać ze wszystkich kabli a jedynie z 3 (po kolei od lewej do prawej 2,3,5) . Kable stykowe od arduino będziemy wpinać do wejść znajdujących się równolegle wejść w które wpięliśmy kable od czujnika na płytce stykowej.
- Kabel nr 2 do dowolnego cyfrowego wejścia na płytce do przykładu wykorzystam wejście nr 6 (oznaczenie na płytce”6″)
- Kabel nr 3 do 5V
- Kabel nr 5 do GND
Program:
Na początku dołączamy bibliotekę string.h . Biblioteka jest bezpośrednio dostępna w Arduino IDE, więc nie musimy jej pobierać.
#include<string.h>
Następnie definiujemy wszystkie zmienne jakie będą nam potrzebne do dalszego działania programu.
int pin = 6;//DSM501A input D6 unsigned long duration; unsigned long starttime; unsigned long endtime; unsigned long sampletime_ms = 3000; unsigned long lowpulseoccupancy = 0; float ratio = 0; float concentration = 0;
Kolejno skupmy się funkcją void setup(). Pierwszą rzeczą jaką w niej robimy to włączamy monitor portu szeregowego funkcją Serial.begin(). Drugą rzeczą jest przypisanie do zmiennej startime wartości mills(), która w arduino jest równa ilości czasu od chwili w której program został uruchomiony. Zauważmy że starttime jest typu który przechowuje tylko wartości dodatnie. Dlatego tylko w nim możemy przechować funkcję mills().
void setup() { Serial.begin(9600); starttime = millis(); }
Na koniec została nam funkcja void loop(), wykonują w petli pobieranie i wyświetlanie informacji pobranych z czujnika. Na początku przypisujemy 3 wcześniejszym zmiennym które utworzyliśmy nowe wartości. Ustalamy dla zmiennej duration wartość pulseIn(pin, LOW) która mówi o tym że funkcja najpierw czeka aż pin 6 który zdefiniowaliśmy jako “pin” przejdzie ze stanu wysokiego (“HIGH”) na stan niski(“LOW”). Gdy to się stanie funkcja wznowi odliczanie czasu które zostało wstrzymane wraz z wywołaniem właśnie tej funkcji. Potem definiujemy zmienną lowpulseocuppancy która jest równa sumie własnej wartości i duration. (Taki zapis ” lowpulseocuppancy += duration” jest skróconą formą takiego zapisu “lowpulseocuppancy = lowpulseocuppancy + duration”). Endtime również będzie równe funkcji mills() jednak jej wartość będzie inna niż ta w starttime gdyż ta funkcja zacznie liczyć czas dopiero po zdefiniowaniu jej w funkcji loop().
void loop() { duration = pulseIn(pin, LOW); lowpulseoccupancy += duration; endtime = millis();
Potem tworzymy funkcję if która wykona się jedynie jeżeli warunek znajdujący się w nawiasach() będzie prawdziwy. W tym przypadku jeżeli różnica dwóch zmiennych odliczających czas będzie większa niż sampletime_ms który jest równy 3 s (gdyż podstawową jednostką czasu w arduino są mili sekundy czyli 3000 ms = 3s), to tworzymy 2 nowe zmienne. Zmienne te są równe wzorom służacym do obliczenia procentu zawartości pyłu w powietrzu oraz jego ogólnej koncentracji w bliskiej przestrzeni.
if ((endtime-starttime) > sampletime_ms) { ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0);// Procent zanieczyszczenia 0=>100 concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // specjalna krzywa dotycząca zawartości pyłu
Później te zmienne zostaną przez nas na monitorze szeregowym. Jeżeli nie wiesz jak otworzyć monitor szeregowy odsyłam do innego artykułu w którym zostało to wyjaśnione( Czujnik opadów deszczu YL-83 – AJmaker). Uwaga symbol (“\n”) oznacza znak nowej linii.
Serial.print("lowpulseoccupancy:"); Serial.print(lowpulseoccupancy); Serial.print("\n"); Serial.print("ratio:"); Serial.print("\n"); Serial.print(ratio); Serial.print("DSM501A:"); Serial.println(concentration); Serial.print(";\n\n");
Ostatnim krokiem jest przywrócenie podstawowych wartości dla lowpulseoccupancy i starttime.
lowpulseoccupancy = 0; starttime = millis(); } }