User | Revision | Line number | New contents of line |
ziqiyap |
0:9221dac25d3b
|
1
|
#ifndef SPS30_H
|
ziqiyap |
0:9221dac25d3b
|
2
|
#define SPS30_H
|
ziqiyap |
0:9221dac25d3b
|
3
|
|
ziqiyap |
0:9221dac25d3b
|
4
|
#define SPS30_I2C_ADDR 0x69
|
ziqiyap |
0:9221dac25d3b
|
5
|
|
ziqiyap |
0:9221dac25d3b
|
6
|
#define SPS30_CMMD_STRT_MEAS 0x0010
|
ziqiyap |
0:9221dac25d3b
|
7
|
#define SPS30_CMMD_STOP_MEAS 0x0104
|
ziqiyap |
0:9221dac25d3b
|
8
|
#define SPS30_CMMD_GET_READY_STAT 0x0202
|
ziqiyap |
0:9221dac25d3b
|
9
|
#define SPS30_CMMD_READ_MEAS 0x0300
|
ziqiyap |
0:9221dac25d3b
|
10
|
|
ziqiyap |
0:9221dac25d3b
|
11
|
#define SPS30_CMMD_AUTO_CLEAN_INTV 0x8004
|
ziqiyap |
0:9221dac25d3b
|
12
|
#define SPS30_CMMD_START_FAN_CLEAN 0x5607
|
ziqiyap |
0:9221dac25d3b
|
13
|
|
ziqiyap |
0:9221dac25d3b
|
14
|
#define SPS30_CMMD_SOFT_RESET 0xD304
|
ziqiyap |
0:9221dac25d3b
|
15
|
|
ziqiyap |
0:9221dac25d3b
|
16
|
#define SPS30_CMMD_READ_SERIALNBR 0xD033
|
ziqiyap |
0:9221dac25d3b
|
17
|
#define SPS30_CMMD_READ_ARTICLECODE 0xD025
|
ziqiyap |
0:9221dac25d3b
|
18
|
|
ziqiyap |
0:9221dac25d3b
|
19
|
#define SPS30_POLYNOMIAL 0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 100110p01
|
ziqiyap |
0:9221dac25d3b
|
20
|
#define SPS30_CRC_INIT 0xff
|
ziqiyap |
0:9221dac25d3b
|
21
|
|
ziqiyap |
0:9221dac25d3b
|
22
|
#define SPS30_SN_SIZE 33 //size of the s/n ascii string + CRC values
|
ziqiyap |
0:9221dac25d3b
|
23
|
#define SPS30_ACODE_SIZE 33 //size of the article code ascii string + CRC values
|
ziqiyap |
0:9221dac25d3b
|
24
|
|
ziqiyap |
0:9221dac25d3b
|
25
|
/** Create SPS30 controller class
|
ziqiyap |
0:9221dac25d3b
|
26
|
*
|
ziqiyap |
0:9221dac25d3b
|
27
|
* @param sps30 class
|
ziqiyap |
0:9221dac25d3b
|
28
|
*
|
ziqiyap |
0:9221dac25d3b
|
29
|
*/
|
ziqiyap |
0:9221dac25d3b
|
30
|
class sps30 {
|
ziqiyap |
0:9221dac25d3b
|
31
|
|
ziqiyap |
0:9221dac25d3b
|
32
|
public:
|
ziqiyap |
0:9221dac25d3b
|
33
|
enum SPSerror {
|
ziqiyap |
0:9221dac25d3b
|
34
|
SPSnoERROR, //all ok
|
ziqiyap |
0:9221dac25d3b
|
35
|
SPSisReady, //ready ststus register
|
ziqiyap |
0:9221dac25d3b
|
36
|
SPSnoAckERROR, //no I2C ACK error
|
ziqiyap |
0:9221dac25d3b
|
37
|
SPStimeoutERROR, //I2C timeout error
|
ziqiyap |
0:9221dac25d3b
|
38
|
SPScrcERROR, //CRC error, any
|
ziqiyap |
0:9221dac25d3b
|
39
|
// SPScrcERRORv1, //CRC error on value 1
|
ziqiyap |
0:9221dac25d3b
|
40
|
// SPScrcERRORv2, //CRC error on value 2
|
ziqiyap |
0:9221dac25d3b
|
41
|
// SPScrcERRORv3, //CRC error on value 3
|
ziqiyap |
0:9221dac25d3b
|
42
|
// SPScrcERRORv4, //CRC error on value 4
|
ziqiyap |
0:9221dac25d3b
|
43
|
// SPScrcERRORv5, //CRC error on value 5
|
ziqiyap |
0:9221dac25d3b
|
44
|
// SPScrcERRORv6, //CRC error on value 6
|
ziqiyap |
0:9221dac25d3b
|
45
|
};
|
ziqiyap |
0:9221dac25d3b
|
46
|
|
ziqiyap |
0:9221dac25d3b
|
47
|
uint16_t ready; /**< 1 = ready, 0 = busy */
|
ziqiyap |
0:9221dac25d3b
|
48
|
|
ziqiyap |
0:9221dac25d3b
|
49
|
float mass_1p0_f; /**< float of Mass Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
50
|
float mass_2p5_f; /**< float of Mass Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
51
|
float mass_4p0_f; /**< float of Mass Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
52
|
float mass_10p0_f; /**< float of Mass Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
53
|
|
ziqiyap |
0:9221dac25d3b
|
54
|
float num_0p5_f; /**< float of Number Conc of PM0.5 */
|
ziqiyap |
0:9221dac25d3b
|
55
|
float num_1p0_f; /**< float of Number Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
56
|
float num_2p5_f; /**< float of Number Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
57
|
float num_4p0_f; /**< float of Number Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
58
|
float num_10p0_f; /**< float of Number Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
59
|
|
ziqiyap |
0:9221dac25d3b
|
60
|
float typ_pm_size_f; /**< float of Typical Particle Size */
|
ziqiyap |
0:9221dac25d3b
|
61
|
|
ziqiyap |
0:9221dac25d3b
|
62
|
uint8_t acode[24]; /**< Article code number?? */
|
ziqiyap |
0:9221dac25d3b
|
63
|
uint8_t sn[24]; /**< ASCII Serial Number */
|
ziqiyap |
0:9221dac25d3b
|
64
|
|
ziqiyap |
0:9221dac25d3b
|
65
|
|
ziqiyap |
0:9221dac25d3b
|
66
|
|
ziqiyap |
0:9221dac25d3b
|
67
|
/** Create a SPS30 object using the specified I2C object
|
ziqiyap |
0:9221dac25d3b
|
68
|
* @param sda - mbed I2C interface pin
|
ziqiyap |
0:9221dac25d3b
|
69
|
* @param scl - mbed I2C interface pin
|
ziqiyap |
0:9221dac25d3b
|
70
|
* @param I2C Frequency (in Hz)
|
ziqiyap |
0:9221dac25d3b
|
71
|
*
|
ziqiyap |
0:9221dac25d3b
|
72
|
* @return none
|
ziqiyap |
0:9221dac25d3b
|
73
|
*/
|
ziqiyap |
0:9221dac25d3b
|
74
|
sps30(PinName sda, PinName scl, int i2cFrequency);
|
ziqiyap |
0:9221dac25d3b
|
75
|
|
ziqiyap |
0:9221dac25d3b
|
76
|
/** Destructor
|
ziqiyap |
0:9221dac25d3b
|
77
|
*
|
ziqiyap |
0:9221dac25d3b
|
78
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
79
|
*
|
ziqiyap |
0:9221dac25d3b
|
80
|
* @return none
|
ziqiyap |
0:9221dac25d3b
|
81
|
*/
|
ziqiyap |
0:9221dac25d3b
|
82
|
~sps30();
|
ziqiyap |
0:9221dac25d3b
|
83
|
|
ziqiyap |
0:9221dac25d3b
|
84
|
/** Start Auto-Measurement
|
ziqiyap |
0:9221dac25d3b
|
85
|
*
|
ziqiyap |
0:9221dac25d3b
|
86
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
87
|
*
|
ziqiyap |
0:9221dac25d3b
|
88
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
89
|
*/
|
ziqiyap |
0:9221dac25d3b
|
90
|
uint8_t startMeasurement();
|
ziqiyap |
0:9221dac25d3b
|
91
|
|
ziqiyap |
0:9221dac25d3b
|
92
|
/** Stop Auto-Measurement
|
ziqiyap |
0:9221dac25d3b
|
93
|
*
|
ziqiyap |
0:9221dac25d3b
|
94
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
95
|
*
|
ziqiyap |
0:9221dac25d3b
|
96
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
97
|
*/
|
ziqiyap |
0:9221dac25d3b
|
98
|
uint8_t stopMeasurement();
|
ziqiyap |
0:9221dac25d3b
|
99
|
|
ziqiyap |
0:9221dac25d3b
|
100
|
/** Get Ready Status register
|
ziqiyap |
0:9221dac25d3b
|
101
|
*
|
ziqiyap |
0:9221dac25d3b
|
102
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
103
|
* @see Ready Status result
|
ziqiyap |
0:9221dac25d3b
|
104
|
*
|
ziqiyap |
0:9221dac25d3b
|
105
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
106
|
*/
|
ziqiyap |
0:9221dac25d3b
|
107
|
uint8_t getReadyStatus();
|
ziqiyap |
0:9221dac25d3b
|
108
|
|
ziqiyap |
0:9221dac25d3b
|
109
|
/** Get all particulate matter parameters
|
ziqiyap |
0:9221dac25d3b
|
110
|
*
|
ziqiyap |
0:9221dac25d3b
|
111
|
* @param --none-
|
ziqiyap |
0:9221dac25d3b
|
112
|
* @see Results in Public member variables
|
ziqiyap |
0:9221dac25d3b
|
113
|
*
|
ziqiyap |
0:9221dac25d3b
|
114
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
115
|
*/
|
ziqiyap |
0:9221dac25d3b
|
116
|
uint8_t readMeasurement();
|
ziqiyap |
0:9221dac25d3b
|
117
|
|
ziqiyap |
0:9221dac25d3b
|
118
|
/** Calculate the SPS30 CRC value
|
ziqiyap |
0:9221dac25d3b
|
119
|
*
|
ziqiyap |
0:9221dac25d3b
|
120
|
* @param 16 bit value to perform a CRC check on
|
ziqiyap |
0:9221dac25d3b
|
121
|
*
|
ziqiyap |
0:9221dac25d3b
|
122
|
* @return 8 bit CRC value
|
ziqiyap |
0:9221dac25d3b
|
123
|
*/
|
ziqiyap |
0:9221dac25d3b
|
124
|
uint8_t calcCrc2b(uint16_t seed);
|
ziqiyap |
0:9221dac25d3b
|
125
|
|
ziqiyap |
0:9221dac25d3b
|
126
|
/** Compare received CRC value with calculated CRC value
|
ziqiyap |
0:9221dac25d3b
|
127
|
*
|
ziqiyap |
0:9221dac25d3b
|
128
|
* @param 16 bit value to perform a CRC check on
|
ziqiyap |
0:9221dac25d3b
|
129
|
* @param 8 bit value to compare CRC values
|
ziqiyap |
0:9221dac25d3b
|
130
|
*
|
ziqiyap |
0:9221dac25d3b
|
131
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
132
|
*/
|
ziqiyap |
0:9221dac25d3b
|
133
|
uint8_t checkCrc2b(uint16_t seed, uint8_t crcIn);
|
ziqiyap |
0:9221dac25d3b
|
134
|
|
ziqiyap |
0:9221dac25d3b
|
135
|
/** Get Article Code
|
ziqiyap |
0:9221dac25d3b
|
136
|
*
|
ziqiyap |
0:9221dac25d3b
|
137
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
138
|
*
|
ziqiyap |
0:9221dac25d3b
|
139
|
*
|
ziqiyap |
0:9221dac25d3b
|
140
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
141
|
*/
|
ziqiyap |
0:9221dac25d3b
|
142
|
uint8_t getArticleCode();
|
ziqiyap |
0:9221dac25d3b
|
143
|
|
ziqiyap |
0:9221dac25d3b
|
144
|
/** Get Serial Number
|
ziqiyap |
0:9221dac25d3b
|
145
|
*
|
ziqiyap |
0:9221dac25d3b
|
146
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
147
|
* @see ASCII Serial Number in scdSTR structure
|
ziqiyap |
0:9221dac25d3b
|
148
|
*
|
ziqiyap |
0:9221dac25d3b
|
149
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
150
|
*/
|
ziqiyap |
0:9221dac25d3b
|
151
|
uint8_t getSerialNumber();
|
ziqiyap |
0:9221dac25d3b
|
152
|
|
ziqiyap |
0:9221dac25d3b
|
153
|
/** Perform a soft reset
|
ziqiyap |
0:9221dac25d3b
|
154
|
*
|
ziqiyap |
0:9221dac25d3b
|
155
|
* @param --none--
|
ziqiyap |
0:9221dac25d3b
|
156
|
*
|
ziqiyap |
0:9221dac25d3b
|
157
|
* @return enum SPSerror
|
ziqiyap |
0:9221dac25d3b
|
158
|
*/
|
ziqiyap |
0:9221dac25d3b
|
159
|
uint8_t softReset();
|
ziqiyap |
0:9221dac25d3b
|
160
|
|
ziqiyap |
0:9221dac25d3b
|
161
|
private:
|
ziqiyap |
0:9221dac25d3b
|
162
|
char i2cBuff[60];
|
ziqiyap |
0:9221dac25d3b
|
163
|
|
ziqiyap |
0:9221dac25d3b
|
164
|
uint16_t mass_1p0_m; /**< High order 16 bit word of Mass Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
165
|
uint16_t mass_1p0_l; /**< Low order 16 bit word of Mass Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
166
|
uint16_t mass_2p5_m; /**< High order 16 bit word of Mass Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
167
|
uint16_t mass_2p5_l; /**< Low order 16 bit word of Mass Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
168
|
uint16_t mass_4p0_m; /**< High order 16 bit word of Mass Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
169
|
uint16_t mass_4p0_l; /**< Low order 16 bit word of Mass Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
170
|
uint16_t mass_10p0_m; /**< High order 16 bit word of Mass Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
171
|
uint16_t mass_10p0_l; /**< Low order 16 bit word of Mass Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
172
|
|
ziqiyap |
0:9221dac25d3b
|
173
|
uint16_t num_0p5_m; /**< High order 16 bit word of Number Conc of PM0.5 */
|
ziqiyap |
0:9221dac25d3b
|
174
|
uint16_t num_0p5_l; /**< Low order 16 bit word of Number Conc of PM0.5 */
|
ziqiyap |
0:9221dac25d3b
|
175
|
uint16_t num_1p0_m; /**< High order 16 bit word of Number Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
176
|
uint16_t num_1p0_l; /**< Low order 16 bit word of Number Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
177
|
uint16_t num_2p5_m; /**< High order 16 bit word of Number Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
178
|
uint16_t num_2p5_l; /**< Low order 16 bit word of Number Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
179
|
uint16_t num_4p0_m; /**< High order 16 bit word of Number Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
180
|
uint16_t num_4p0_l; /**< Low order 16 bit word of Number Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
181
|
uint16_t num_10p0_m; /**< High order 16 bit word of Number Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
182
|
uint16_t num_10p0_l; /**< Low order 16 bit word of Number Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
183
|
|
ziqiyap |
0:9221dac25d3b
|
184
|
uint16_t typ_pm_size_m; /**< High order 16 bit word of Typical Particle Size */
|
ziqiyap |
0:9221dac25d3b
|
185
|
uint16_t typ_pm_size_l; /**< Low order 16 bit word of Typical Particle Size */
|
ziqiyap |
0:9221dac25d3b
|
186
|
|
ziqiyap |
0:9221dac25d3b
|
187
|
uint32_t mass_1p0_i; /**< 32 bit int of Mass Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
188
|
uint32_t mass_2p5_i; /**< 32 bit int of Mass Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
189
|
uint32_t mass_4p0_i; /**< 32 bit int of Mass Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
190
|
uint32_t mass_10p0_i; /**< 32 bit int of Mass Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
191
|
|
ziqiyap |
0:9221dac25d3b
|
192
|
uint32_t num_0p5_i; /**< 32 bit int of Number Conc of PM0.5 */
|
ziqiyap |
0:9221dac25d3b
|
193
|
uint32_t num_1p0_i; /**< 32 bit int of Number Conc of PM1.0 */
|
ziqiyap |
0:9221dac25d3b
|
194
|
uint32_t num_2p5_i; /**< 32 bit int of Number Conc of PM2.5 */
|
ziqiyap |
0:9221dac25d3b
|
195
|
uint32_t num_4p0_i; /**< 32 bit int of Number Conc of PM4.0 */
|
ziqiyap |
0:9221dac25d3b
|
196
|
uint32_t num_10p0_i; /**< 32 bit int of Number Conc of PM10 */
|
ziqiyap |
0:9221dac25d3b
|
197
|
|
ziqiyap |
0:9221dac25d3b
|
198
|
uint32_t typ_pm_size_i; /**< 32 bit int of Typical Particle Size */
|
ziqiyap |
0:9221dac25d3b
|
199
|
|
ziqiyap |
0:9221dac25d3b
|
200
|
protected:
|
ziqiyap |
0:9221dac25d3b
|
201
|
I2C _i2c;
|
ziqiyap |
0:9221dac25d3b
|
202
|
|
ziqiyap |
0:9221dac25d3b
|
203
|
};
|
ziqiyap |
0:9221dac25d3b
|
204
|
#endif
|
ziqiyap |
0:9221dac25d3b
|
205
|
|