Měření polétavého prachu pomocí PMS 7003 – návod

PMS 7003

Úvod

Kolega astronom a polularizátor vědy a osvěty stran světelného znečištění, Jan Kondziolka, mne oslovil, zda bych mu pomohl naprogramovat Arduino a rozchodit senzor prachových částic PMS 7003. Po letmém pohledu na google a github, jsem nakonec kývnul, protože projekt je již velmi dobře popsán. Podělím se s vámi tedy o stručný návod jak na to.

V principu jde o měření prachových částic, které se běžně monitoruje i ČHMI. V naší aplikaci měříme pomocí laserového čidla PMS 7003, který svítí do proudu vzduchu laserem a vyhodnocuje odraz. Ze snímače lezou tyto veličiny

  • PM 1.0 (ug/m3) – částice > 1 mikro metr 
  • PM 2.5 (ug/m3) – částice > 2,5 mikro metru
  • PM 10 (ug/m3) – částice > 10 mikro metr 

Jelikož nejde o přesně kalibrované zařízení a zobrazovány budou pouze aktuální hodnoty, bude se spíše jednat o jakýsi demonstrátor znečištění ovzduší. Nikoli o stanici dlouhodobě monitorující a vyhodnocující kvalitu ovzduší v delším časovém horizontu

Hardware

Přistál mi na stole notoricky známý papírový pytlík s bublinkovou výstelkou opatřen čínskými písmenky. Projekt je to velmi jednoduchý, stačí pouze tři komponenty a tyto jsem obdržel jako zadání.

LCD display se připojuje klasicky na I2C sběrnici (SDA,SCK) + napájení

Senzor, to byl trochu oříšek, v datasheetu píší, že je sice napájen 5V, ale logiku má 3,3V! Komunikuje přes UART (RX, TX) nicméně pro základní funkci, kdy posílá jen data ze snímače, nám stačí jen TX vývod ze senzoru PMS 7003 a RX vstup v Arduinu. Nejprve jsem zkusil převodník úrovní a 3,3V ze snímače jsem převedl na 5V logiku, ale ani obraz ani zvuk. Nakonec jsem vyřadil převodník úrovní a připojil TX výstup z PMS 7003 přímo do Arduina na RX a voila…běželo na první dobrou. Ale to předbíhám. Hardware máme připojen a můžeme se vrhnout na programování. Jelikož UNO má HW piny pro sériovou komunikaci společné s USB převodníkem, nastavím si sériovou linku softwarově na jiných pinech. Jinak bych musel snímač neustále odpojovat při nahrávání programu z PC. Požiji tedy piny 2 – RX, (3 TX nepřipojen).

Program

Předem deklaruji, že nejsem žádný učený programátor. Základy jazyka wire ovládám, ale většinu kódů beru z příkladů v programu IDE, nebo postahuji z netu a pak akorát tak nějak učešu a dodělám podle sebe. Stáhl jsem si tedy základní kód na stránkách Adafruit přímo k tomuto snímači.

Jelikož zadání bylo aby zařízení zobrazovalo tři základní veličiny na jednoduchém displeji, bylo téměř hotovo. Nicméně nachystal jsem si kód pro případné pozdější rozšíření o modul reálného času RTC, a SD karty  pro logování naměřených hodnot. V kódu mám rovněž zakomentovanou možnost připojení OLED displeje 128×64, který zobrazí tyto tři aktuální veličiny plus aktuální datum a čas. Při cvičném sestavení to vypadá na tomto malém OLED velmi pěkně. 

Časem tedy zřejmě přibude ještě zmíněné logování na SD a případné další funkce.

Kód není třeba zcela popisovat. U klíčových věcí mám komentáře přímo v kódu. Jelikož je použit pouze malý display se 16 znaky na řádek, musel jsem osekat informace na minimum. Přemazání spodního řádku s hodnotami je řešeno velmi primitivně, a tedy před každým výpisem, se daná sekce přepíše mezerou. Vzorkovací frekvence zobrazování je řešena delay, ale ještě předělám na millis aby to bylo košér 🙂

 

Závěr

Komponenty mám tedy „zadrátované“ k sobě. Předám to kolegovi, který s tím již naloží dle svého. První úskalí vidím asi v možnosti kalibrace a možnosti vnášení korekcí do měření. Nejprve uvidíme jak to měří, porovnáme s nějakou meteorologickou stanicí a a pak případně upravíme kód, podle toho jaké budou požadavky na funkce. Zatím to není ošetřeno nijak uživatelsky. Pokud bude nutnost korekcí, bude se muset změnit kód. Do budoucna mě napadlo, že při použití SD modulu, by byl na kartě nějaký konfigurační soubor, který by se dal načíst v PC, přes poznámkový blok změnit hodnoty korekcí a Arduino už by si je při startu natáhlo a započítalo tuto opravu pro další měření. Uvidíme co přinese provoz.

1802total visits,8visits today