KKM: PLANTOWER PMS5003

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.
UVOD
PMS5003 je vrsta digitalnog univerzalnog senzora za mjerenje koncentracije čestica u zraku,
koji se može koristiti za dobivanje informacija o čistoći zraka.
SPECIFIKACIJE
OSNOVNO
• Radni napon: 4.95 ~ 5.05V
• Maksimalna električna struja: 120mA
• Struja mirovanja: ≤200 uA
• Vrijeme odaziva: ≤10 s
• Raspon radne temperature: -20 ~ 50C
• Raspon radne vlažnosti: 0 ~ 99% RH
• Maksimalna veličina: 65 × 42 × 23 (mm)
ISTAKNUTO
• Brzi odaziv
• Kalibracijska krivulja drugog reda u više točaka
• Minimalna rezolucija 0,3 mikrona
PRINCIP RADA
Senzor koristi princip laserskog raspršivanja, tj. proizvodi raspršivanje
pomoću lasera za zračenje suspendirajućih čestica u zraku, a zatim prikuplja to svijetlo
u određenom stupnju te konačno dobijemo krivulju promjene raspršenog svjetla. Na kraju, ekvivalentni promjer čestica i broj čestica s različitim promjerom po jedinici volumena koji se može izračunati pomoću mikroprocesora na temelju MIE teorije.
Blokovski prikaz rada senzora
PINOVI
•PIN1 (VCC) – pozitivan napon 5V
•PIN2 (GND) – nulti potencijal
•PIN3 (SET) – 3.3V aktivan 0V/GND neaktivan, nije potrebno spajati ako se ne koristi neaktivan mod jer je iznutra spojen preko pull up otpornika
•PIN4 (RX) – Serijski port RX pin / TTL [email protected]
•PIN5 (TX) – Serijski port TX pin / TTL [email protected]
•PIN6 (RESET) – Signal resetiranja modula / TTL razina @ 3.3V V ,low reset
•PIN7/8 (NC) – Not connected
SPAJANJE I KOD
Kako bismo spojili ovaj modul koristiti ćemo 3 njegova pina. 2 za napajanje te jedan pin preko kojega će modul serijskom vezom slati podatke na Croduino.
#include //Koristi serial library
SoftwareSerial pmsSerial(2, 3);
//TX RX linija za slanje te linija za primanje
void
setup
() {
Serial.begin(115200);
//Linija za primanje
// baud rate senzora 9600
pmsSerial.begin(9600);
//Linija za komunkikaciju s PMS senzorom
}
struct
pms5003data {
//deklaracija uint16_t koji ima vrijednost od 0 do 65,535
uint16_t framelen;
uint16_t pm10_standard, pm25_standard, pm100_standard;
uint16_t pm10_env, pm25_env, pm100_env;
uint16_t particles_03um, particles_05um, particles_10um, particles_25um, particles_50um, particles_100um;
uint16_t unused;
uint16_t checksum;
};
//stvaranje strukture podataka
struct
pms5003data data;
void
loop
() {
if
(readPMSdata(&pmsSerial)) {
//Ako dolaze nekakvi podatci preko primajuće linije onda
Serial.println(
"---------------------------------------"
);
Serial.print(
"Cestica u zraku > 0.3um / 0.1L zraka:"
);
Serial.println(data.particles_03um);
//Čestica većih od 0.3 um
Serial.print(
"Cestica u zraku > 0.5um / 0.1L zraka:"
);
Serial.println(data.particles_05um);
//Čestica većih od 0.5 um
Serial.print(
"Cestica u zraku > 1.0um / 0.1L zraka:"
);
Serial.println(data.particles_10um);
//Čestica većih od 1 um
Serial.print(
"Cestica u zraku > 2.5um / 0.1L zraka:"
);
Serial.println(data.particles_25um);
//Čestica većih od 2.5 um
Serial.print(
"Cestica u zraku > 5.0um / 0.1L zraka:"
);
Serial.println(data.particles_50um);
//Čestica većih od 5 um
Serial.print(
"Cestica u zraku > 10.0 um / 0.1L zraka:"
);
Serial.println(data.particles_100um);
//Čestica većih od 10 um
Serial.println(
"---------------------------------------"
);
}
}
boolean
readPMSdata(Stream *s) {
if
(! s->available()) {
return
false
;
}
//čitaj byte po bit dok ne dobijemo '0x42' startni byte
if
(s->peek() != 0x42) {
s->read();
return
false
;
}
// Sada pročitaj sva 32 bytes
if
(s->available() < 32) {
return
false
; } uint8_t buffer[32]; uint16_t sum = 0; s->readBytes(buffer, 32);
// provjerimo sve s kontrolnim zbrojem
for
(uint8_t i=0; i<30; i++) {
sum += buffer[i];
}
// Podatci dolaze u endian'd protokolu, ovaj dio koda omogućava podržanost na svim platformama
uint16_t buffer_u16[15];
for
(uint8_t i=0; i<15; i++) {
buffer_u16[i] = buffer[2 + i*2 + 1];
buffer_u16[i] += (buffer[2 + i*2] << 8);
}
// spremimo sve u strukturu
memcpy
((
void
*)&data, (
void
*)buffer_u16, 30);
if
(sum != data.checksum) {
Serial.println(
"Checksum failure"
);
return
false
;
}
// kada sve uspije vraćamo rezultat
return
true
;
}
KONAČNI REZULTAT
Kako bi smo dobili serial monitor s Croduina koristimo CTRL+SHIFT+M prečac unutar Arduino IDE programa te nam se nakon toga otvara serial monitor preko kojega ćemo primati informacije s našeg senzora.
Primjetite kako su očitanja senzora podjeljena u 6 kategorija ovisno o veličinama detektiranih čestica u zraku.
————————————————–
• Čestica u zraku veće od 0.3μm u 0.1L zraka ima 6942
• Čestica u zraku veće od 0.5μm u 0.1L zraka ima 2052
• Čestica u zraku veće od 1.0μm u 0.1L zraka ima 332
• Čestica u zraku veće od 2.5μm u 0.1L zraka ima 34
• Čestica u zraku veće od 5.0μm u 0.1L zraka ima 4
•Čestica u zraku veće od 10.0μm u 0.1L zraka ima 0
Imajte na umu da je ovaj modul potrebno kalibrirati prije korištenja u ozbiljnijim projektima.