Skip to content

Commit df2ef8d

Browse files
committed
get sensor info
1 parent 8db44c9 commit df2ef8d

File tree

3 files changed

+77
-35
lines changed

3 files changed

+77
-35
lines changed

examples/SDP3x/SDP3x.ino

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,20 @@ SDPSensor sdp(0x21);
1818

1919

2020
/* Try until succeeds. */
21-
void initSensorUntilSuccess() {
21+
bool initSensorUntilSuccess() {
2222
while (sdp.stopContinuous() != ESP_OK); // sdp.reset() is also possible
2323
while (sdp.begin() != ESP_OK);
2424
while (sdp.startContinuous() != ESP_OK);
25+
return true;
2526
}
2627

2728

2829
/* Try until the first error occurs. */
29-
void initSensorSingleTrial() {
30+
bool initSensorSingleTrial() {
3031
sdp.stopContinuous(); // sdp.reset() is also possible
3132
sdp.begin();
32-
sdp.startContinuous();
33+
esp_err_t err = sdp.startContinuous();
34+
return err == ESP_OK;
3335
}
3436

3537

@@ -39,8 +41,21 @@ void setup() {
3941
sdp.initI2C(19, 23); // same as Wire.begin(SDA, SCL)
4042

4143
// choose how you want to initialize the sensor
42-
initSensorSingleTrial();
43-
//initSensorUntilSuccess();
44+
bool success = initSensorSingleTrial();
45+
//bool success = initSensorUntilSuccess();
46+
if (success) {
47+
uint32_t modelNumber;
48+
uint32_t rangePa;
49+
sdp.getInfo(&modelNumber, &rangePa, NULL, NULL);
50+
51+
Serial.println("Initialized an SDP sensor:");
52+
Serial.print(" model number: ");
53+
Serial.println(modelNumber);
54+
Serial.print(" measurement range (in Pa): ");
55+
Serial.println(rangePa);
56+
} else {
57+
Serial.println("Failed to initialize an SDP sensor.");
58+
}
4459
}
4560

4661

@@ -51,5 +66,5 @@ void loop() {
5166
if (err == ESP_OK) {
5267
// success; process the 'pressure' here
5368
}
54-
ESP_LOGI("sdp", "raw pressure: %d, err code: %s", pressure, esp_err_to_name(err));
69+
ESP_LOGI("main", "raw pressure: %d, err code: %s", pressure, esp_err_to_name(err));
5570
}

sdpsensor.cpp

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ SDPSensor::SDPSensor(uint8_t i2c_addr, i2c_port_t i2c_port) {
5757
this->i2c_port = i2c_port;
5858
this->pressureScale = 0; // will be read & set in the begin()
5959
this->initialized = false;
60+
this->modelNumber = 0;
61+
this->rangePa = 0;
62+
this->productId = 0;
63+
this->serialNumber = 0;
6064
}
6165

6266

@@ -125,65 +129,64 @@ esp_err_t SDPSensor::begin() {
125129
}
126130

127131
/*
128-
Read product id and serial number.
129-
Data Format:
132+
Read product id and serial number.
133+
Data Format:
130134
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6...17 |
131135
| Value | pid1 |CRC| pid2 |CRC| serial |
132-
*/
136+
*/
133137
err = i2c_master_read_from_device(i2c_port, i2c_addr, read_buffer, 18, ticks_to_wait_long);
134138
if (err != ESP_OK) {
135139
logInitFailed(err);
136140
return err;
137141
}
138142

139-
const uint32_t pid = (read_buffer[0] << 24) | (read_buffer[1] << 16)
143+
productId = (read_buffer[0] << 24) | (read_buffer[1] << 16)
140144
| (read_buffer[3] << 8) | (read_buffer[4] << 0);
141145

142-
uint64_t serial_num = 0;
143-
uint64_t *pserial = &serial_num;
146+
uint64_t *pserial = &serialNumber;
144147
for (int i = 6; i < 18; i++) {
145-
if ((i + 1) % 3 == 0) continue; // CRC
148+
if ((i + 1) % 3 == 0) continue; // CRC
146149
*pserial <<= 8;
147150
*pserial |= (uint64_t) read_buffer[i];
148151
}
149152

150-
uint32_t model_number, range_pa;
151-
switch (pid & 0xFFFFFF00) {
153+
modelNumber, rangePa;
154+
switch (productId & 0xFFFFFF00) {
152155
case SPD31_500_PID:
153-
model_number = 31;
154-
range_pa = 500;
156+
modelNumber = 31;
157+
rangePa = 500;
155158
break;
156159
case SDP32_125_PID:
157-
model_number = 32;
158-
range_pa = 125;
160+
modelNumber = 32;
161+
rangePa = 125;
159162
break;
160163
case SDP800_500_PID:
161-
model_number = 800;
162-
range_pa = 500;
164+
modelNumber = 800;
165+
rangePa = 500;
163166
break;
164167
case SDP810_500_PID:
165-
model_number = 810;
166-
range_pa = 500;
168+
modelNumber = 810;
169+
rangePa = 500;
167170
break;
168171
case SDP801_500_PID:
169-
model_number = 801;
170-
range_pa = 500;
172+
modelNumber = 801;
173+
rangePa = 500;
171174
break;
172175
case SDP811_500_PID:
173-
model_number = 811;
174-
range_pa = 500;
176+
modelNumber = 811;
177+
rangePa = 500;
175178
break;
176179
case SDP800_125_PID:
177-
model_number = 800;
178-
range_pa = 125;
180+
modelNumber = 800;
181+
rangePa = 125;
179182
break;
180183
case SDP810_125_PID:
181-
model_number = 810;
182-
range_pa = 125;
184+
modelNumber = 810;
185+
rangePa = 125;
183186
break;
184187
}
185188

186-
ESP_LOGI(TAG_SDPSENSOR, "Initialized SDP%d %dPa sensor (PID=0x%08X), serial=0x%016llX", model_number, range_pa, pid, serial_num);
189+
ESP_LOGI(TAG_SDPSENSOR, "Initialized SDP%d %dPa sensor (PID=0x%08X), serial=0x%016llX", modelNumber, rangePa, productId, serialNumber);
187190

188191
err = i2c_master_write_to_device(i2c_port, i2c_addr, cmd_measure, SDPSENSOR_I2C_CMD_LEN, ticks_to_wait_long);
189192
if (err != ESP_OK) {
@@ -201,14 +204,22 @@ esp_err_t SDPSensor::begin() {
201204

202205
this->pressureScale = ((int16_t) read_buffer[6]) << 8 | read_buffer[7];
203206

204-
ESP_LOGI(TAG_SDPSENSOR, "SDP%d pressure scale: %d", model_number, this->pressureScale);
207+
ESP_LOGI(TAG_SDPSENSOR, "SDP%d pressure scale: %d", modelNumber, this->pressureScale);
205208

206209
this->initialized = true;
207210

208211
return err;
209212
}
210213

211214

215+
void SDPSensor::getInfo(uint32_t *modelNumber, uint32_t *rangePa, uint32_t *productId, uint64_t *serialNumber) {
216+
if (modelNumber != NULL) *modelNumber = this->modelNumber;
217+
if (rangePa != NULL) *rangePa = this->rangePa;
218+
if (productId != NULL) *productId = this->productId;
219+
if (serialNumber != NULL) *serialNumber = this->serialNumber;
220+
}
221+
222+
212223
uint16_t SDPSensor::getPressureScale() {
213224
return pressureScale;
214225
}
@@ -272,10 +283,10 @@ esp_err_t SDPSensor::readDiffPressureTemperature(int16_t *diffPressureRaw, float
272283
uint8_t data[6] = { 0 };
273284

274285
/*
275-
Data Format:
286+
Data Format:
276287
| Byte | 0 | 1 | 2 | 3 | 4 | 5 |
277288
| Value | pressure | CRC |temperature| CRC |
278-
*/
289+
*/
279290
esp_err_t err = i2c_master_read_from_device(i2c_port, i2c_addr, data, 6, I2C_NO_TIMEOUT);
280291

281292
if (err == ESP_OK) {

sdpsensor.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ class SDPSensor {
1717
i2c_port_t i2c_port; /* I2C master port */
1818
uint16_t pressureScale; /* Diff pressure scale */
1919
bool initialized;
20+
21+
/* Information parameters */
22+
uint32_t modelNumber;
23+
uint32_t rangePa;
24+
uint32_t productId;
25+
uint64_t serialNumber;
26+
2027
public:
2128

2229
/**
@@ -55,6 +62,15 @@ class SDPSensor {
5562
*/
5663
esp_err_t begin();
5764

65+
/**
66+
* Get sensor info parameters. Arguments can be NULL.
67+
*
68+
* @param modelNumber - a pointer to save the model number (3x or 8xx)
69+
* @param rangePa - a pointer to save the measurement range (in Pa)
70+
* @param productId - a pointer to save the product ID (combination of two above)
71+
* @param serialNumber - a pointer to save the unique serial number
72+
*/
73+
void getInfo(uint32_t *modelNumber, uint32_t *rangePa, uint32_t *productId, uint64_t *serialNumber);
5874

5975
/**
6076
* Return the diff pressure scale, saved in the `initSensor()` call.

0 commit comments

Comments
 (0)