Skip to content

Commit 6e87a79

Browse files
committed
Initail update
1 parent 63e9687 commit 6e87a79

File tree

7 files changed

+310
-1
lines changed

7 files changed

+310
-1
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
__vm/
2+
Debug/
3+
*.vcxproj
4+
*.filters
5+
.vs/
6+
*.sln
7+
.vscode/

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# Blinker_PMSX003ST
2-
Arduino library for Plantower PMSX003ST family sensors.
2+
Arduino library for Plantower PMSX003ST family sensors.Support Arduino, ESP8266, ESP32.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include "BLINKER_PMSX003ST.h"
2+
3+
#if defined(ESP32)
4+
HardwareSerial pmsSerial(2);// UART1/Serial1 pins 16,17
5+
#else
6+
#include <SoftwareSerial.h>
7+
SoftwareSerial pmsSerial(4,5);
8+
#endif
9+
10+
BLINKER_PMSX003ST pms;
11+
12+
void setup() {
13+
Serial.begin(115200);
14+
Serial.println("\nStart");
15+
16+
pmsSerial.begin(9600);
17+
pms.begin(pmsSerial);
18+
// pms.wakeUp();
19+
pms.setMode(PASSIVE);
20+
}
21+
22+
void loop() {
23+
pms.request();
24+
if(!pms.read()){
25+
return;
26+
}
27+
Serial.print("PM1.0(CF1)\t");
28+
Serial.print(pms.getPmCf1(1.0));
29+
Serial.println("ug/m3");
30+
Serial.print("PM2.5(CF1)\t");
31+
Serial.print(pms.getPmCf1(2.5));
32+
Serial.println("ug/m3");
33+
Serial.print("PM10(CF1)\t");
34+
Serial.print(pms.getPmCf1(10));
35+
Serial.println("ug/m3");
36+
Serial.print("PM1.0(ATO)\t");
37+
Serial.print(pms.getPmAto(1.0));
38+
Serial.println("ug/m3");
39+
Serial.print("PM2.5(ATO)\t");
40+
Serial.print(pms.getPmAto(2.5));
41+
Serial.println("ug/m3");
42+
Serial.print("PM10(ATO)\t");
43+
Serial.print(pms.getPmAto(10));
44+
Serial.println("ug/m3");
45+
Serial.print(" PCS0.3\t");
46+
Serial.print(pms.getPcs(0.3));
47+
Serial.println("pcs/0.1L");
48+
Serial.print(" PCS0.5\t");
49+
Serial.print(pms.getPcs(0.5));
50+
Serial.println("pcs/0.1L");
51+
Serial.print(" PCS1.0\t");
52+
Serial.print(pms.getPcs(1));
53+
Serial.println("pcs/0.1L");
54+
Serial.print(" PCS2.5\t");
55+
Serial.print(pms.getPcs(2.5));
56+
Serial.println("pcs/0.1L");
57+
Serial.print(" PCS5.0\t");
58+
Serial.print(pms.getPcs(5));
59+
Serial.println("pcs/0.1L");
60+
Serial.print(" PCS10\t");
61+
Serial.print(pms.getPcs(10));
62+
Serial.println("pcs/0.1L");
63+
Serial.print("Formalde\t");
64+
Serial.print(pms.getForm());
65+
Serial.println("ug/m3");
66+
Serial.print("Temperat\t");
67+
Serial.print(pms.getTemp());
68+
Serial.println("'C");
69+
Serial.print("Humidity\t");
70+
Serial.print(pms.getHumi());
71+
Serial.println("%");
72+
Serial.println();
73+
delay(1000);
74+
}

library.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "Blinker_PMSX003ST",
3+
"description": "Arduino library for Plantower PMSX003ST family sensors.",
4+
"keywords": "AQI, PMS",
5+
"authors": [
6+
{
7+
"name": "i3water",
8+
"url": "https://github.com/i3water",
9+
"maintainer": true
10+
}
11+
],
12+
"repository": {
13+
"type": "git",
14+
"url": "https://github.com/i3water/Blinker_PMSX003ST.git"
15+
},
16+
"version": "1.0.0",
17+
"export": {
18+
"exclude": [
19+
"tests"
20+
]
21+
},
22+
"frameworks": "arduino",
23+
"platforms": "*",
24+
"examples": [
25+
"examples/*/*.ino"
26+
]
27+
}

library.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=Blinker_PMSX003ST
2+
version=1.0.0
3+
author=i3water
4+
maintainer=i3wawter
5+
sentence=Arduino library for Plantower PMSX003ST family sensors.
6+
paragraph=Supports PMSX003ST sensors (5003ST/G5ST), Arduino, ESP8266, ESP32.
7+
category=Communication
8+
url=https://github.com/i3water/Blinker_PMSX003ST
9+
architectures=*

src/BLINKER_PMSX003ST.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include "BLINKER_PMSX003ST.h"
2+
3+
void BLINKER_PMSX003ST::begin(Stream& s) {
4+
strem = &s;
5+
}
6+
7+
void BLINKER_PMSX003ST::send(byte cmd,byte dataH,byte dataL) {
8+
Packet[2] = cmd;
9+
Packet[3] = dataH;
10+
Packet[4] = dataL;
11+
LRC = 0;
12+
foreach(Packet) {
13+
strem->write(row);
14+
LRC += row;
15+
}
16+
strem->write((LRC >> 8) & 0xff);
17+
strem->write(LRC & 0xff);
18+
}
19+
20+
void BLINKER_PMSX003ST::sleep() {
21+
send(PMS_CMD_SLEEP, 0x00, PMS_CMD_SLEEP_SLEEP);
22+
}
23+
24+
void BLINKER_PMSX003ST::wakeUp() {
25+
send(PMS_CMD_SLEEP, 0x00, PMS_CMD_SLEEP_WAKEUP);
26+
}
27+
28+
void BLINKER_PMSX003ST::setMode(byte mode) {
29+
send(PMS_CMD_MODE,0x00,mode);
30+
while(strem->available() > 0) {
31+
strem->read();
32+
}
33+
}
34+
35+
void BLINKER_PMSX003ST::request() {
36+
send(PMS_CMD_READ,0x00,0x00);
37+
}
38+
39+
int BLINKER_PMSX003ST::read(unsigned long timeout) {
40+
static unsigned long start;
41+
static int cnt;
42+
static unsigned int check;
43+
cnt = 0;
44+
check = 0;
45+
start = millis();
46+
47+
while (strem->available() < 40) {
48+
if (millis() - start > timeout) {
49+
return false;
50+
}
51+
}
52+
53+
while (strem->available() > 0) {
54+
byte c = strem->read();
55+
buffer[39-(cnt)] = c;
56+
if (cnt < 38) {
57+
check += (unsigned int)c;
58+
}
59+
cnt++;
60+
cnt = cnt % 40;
61+
}
62+
63+
if ((buffer[39] << 8 | buffer[38]) != 0x424D ||
64+
(buffer[1] << 8 | buffer[0]) != check) {
65+
return false;
66+
}
67+
68+
for (uint8_t num = 0; num < 20; num++) {
69+
data[num] = buffer[num*2 + 1] << 8 | buffer[num*2];
70+
}
71+
return true;
72+
}
73+
74+
double BLINKER_PMSX003ST::getHumi() {
75+
return data[DATA_HUMI]/10.0;
76+
}
77+
78+
double BLINKER_PMSX003ST::getTemp() {
79+
return data[DATA_TEMP]/10.0;
80+
}
81+
82+
double BLINKER_PMSX003ST::getForm() {
83+
return data[DATA_FORMALDE]/1000.0;
84+
}
85+
86+
unsigned int BLINKER_PMSX003ST::getPcs(double pcs) {
87+
switch((int)(pcs*10)){
88+
case 100: return data[DATA_PCS100ug];
89+
case 50 : return data[DATA_PCS50ug];
90+
case 25 : return data[DATA_PCS25ug];
91+
case 10 : return data[DATA_PCS10ug];
92+
case 5 : return data[DATA_PCS05ug];
93+
case 3 : return data[DATA_PCS03ug];
94+
}
95+
return 0;
96+
}
97+
98+
unsigned int BLINKER_PMSX003ST::getPmAto(double pm){
99+
switch((int)(pm*10)){
100+
case 100: return data[DATA_PM100ATO];
101+
case 25 : return data[DATA_PM25ATO];
102+
case 10 : return data[DATA_PM10ATO];
103+
}
104+
return 0;
105+
}
106+
107+
unsigned int BLINKER_PMSX003ST::getPmCf1(double pm){
108+
switch((int)(pm*10)){
109+
case 100: return data[DATA_PM100CF1];
110+
case 25 : return data[DATA_PM25CF1];
111+
case 10 : return data[DATA_PM10CF1];
112+
}
113+
return 0;
114+
}

src/BLINKER_PMSX003ST.h

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#ifndef BLINKER_PMSX003ST_H
2+
#define BLINKER_PMSX003ST_H
3+
4+
#if ARDUINO < 100
5+
#include <WProgram.h>
6+
#else
7+
#include <Arduino.h>
8+
#endif
9+
10+
#define foreach(x) for(int i=0,row = x[i],size = sizeof(x)/sizeof(x[0]);i < size;row=x[++i])
11+
12+
#define PMS_HEAD1 0x42
13+
#define PMS_HEAD2 0x4d
14+
15+
16+
17+
/* CMD parameters */
18+
#define PMS_CMD_READ 0xe2
19+
//only works in passive mode
20+
21+
#define PMS_CMD_MODE 0xe1
22+
#define PMS_CMD_MODE_PASSIVE 0x00
23+
#define PASSIVE 0x00
24+
#define PMS_CMD_MODE_ACTIVE 0x01
25+
#define ACTIVE 0x01
26+
#define PMS_CMD_SLEEP 0xe4
27+
#define PMS_CMD_SLEEP_SLEEP 0x00
28+
#define PMS_CMD_SLEEP_WAKEUP 0x01
29+
30+
/* receive packet prameters */
31+
32+
#define DATA_HUMI 3
33+
#define DATA_TEMP 4
34+
#define DATA_FORMALDE 5
35+
#define DATA_PCS100ug 6
36+
#define DATA_PCS50ug 7
37+
#define DATA_PCS25ug 8
38+
#define DATA_PCS10ug 9
39+
#define DATA_PCS05ug 10
40+
#define DATA_PCS03ug 11
41+
#define DATA_PM100ATO 12
42+
#define DATA_PM25ATO 13
43+
#define DATA_PM10ATO 14
44+
#define DATA_PM100CF1 15
45+
#define DATA_PM25CF1 16
46+
#define DATA_PM10CF1 17
47+
48+
/* class */
49+
50+
class BLINKER_PMSX003ST {
51+
public:
52+
unsigned int data[20];
53+
54+
//Setup
55+
void begin(Stream& s);
56+
void sleep();
57+
void wakeUp();
58+
void setMode(byte);
59+
void request();
60+
int read(unsigned long timeout = 900);
61+
62+
//Get the parameters
63+
double getHumi();
64+
double getTemp();
65+
double getForm();
66+
unsigned int getPcs(double); //available to 10, 5, 2.5, 1, 0.5, 0.3
67+
unsigned int getPmAto(double); //availalbe to 10, 2.5, 1
68+
unsigned int getPmCf1(double); //availalbe to 10, 2.5, 1
69+
70+
private:
71+
byte Packet[5] = {0x42, 0x4d, 0,};
72+
byte buffer[40];
73+
74+
Stream * strem;
75+
unsigned int LRC = 0;
76+
void send(byte, byte, byte);
77+
};
78+
#endif

0 commit comments

Comments
 (0)