Skip to content

Commit ee27ac1

Browse files
authored
Merge pull request #7 from bobobo1618/master
Add error handling and remove WProgram.h include
2 parents acaed58 + eaba184 commit ee27ac1

File tree

2 files changed

+45
-27
lines changed

2 files changed

+45
-27
lines changed

src/SparkFun_SCD30_Arduino_Library.cpp

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -107,20 +107,22 @@ float SCD30::getTemperature(void)
107107
}
108108

109109
//Enables or disables the ASC
110-
void SCD30::setAutoSelfCalibration(boolean enable)
110+
bool SCD30::setAutoSelfCalibration(boolean enable)
111111
{
112112
if (enable)
113-
sendCommand(COMMAND_AUTOMATIC_SELF_CALIBRATION, 1); //Activate continuous ASC
113+
return sendCommand(COMMAND_AUTOMATIC_SELF_CALIBRATION, 1); //Activate continuous ASC
114114
else
115-
sendCommand(COMMAND_AUTOMATIC_SELF_CALIBRATION, 0); //Deactivate continuous ASC
115+
return sendCommand(COMMAND_AUTOMATIC_SELF_CALIBRATION, 0); //Deactivate continuous ASC
116116
}
117117

118118
//Set the forced recalibration factor. See 1.3.7.
119119
//The reference CO2 concentration has to be within the range 400 ppm ≤ cref(CO2) ≤ 2000 ppm.
120-
void SCD30::setForcedRecalibrationFactor(uint16_t concentration)
120+
bool SCD30::setForcedRecalibrationFactor(uint16_t concentration)
121121
{
122-
if(concentration < 400 || concentration > 2000) return; //Error check.
123-
sendCommand(COMMAND_SET_FORCED_RECALIBRATION_FACTOR, concentration);
122+
if(concentration < 400 || concentration > 2000) {
123+
return false; //Error check.
124+
}
125+
return sendCommand(COMMAND_SET_FORCED_RECALIBRATION_FACTOR, concentration);
124126
}
125127

126128
//Get the temperature offset. See 1.3.8.
@@ -131,24 +133,27 @@ float SCD30::getTemperatureOffset()
131133
}
132134

133135
//Set the temperature offset. See 1.3.8.
134-
void SCD30::setTemperatureOffset(float tempOffset)
136+
bool SCD30::setTemperatureOffset(float tempOffset)
135137
{
136138
int16_t tickOffset = tempOffset * 100;
137-
sendCommand(COMMAND_SET_TEMPERATURE_OFFSET, tickOffset);
139+
return sendCommand(COMMAND_SET_TEMPERATURE_OFFSET, tickOffset);
138140
}
139141

140142
//Set the altitude compenstation. See 1.3.9.
141-
void SCD30::setAltitudeCompensation(uint16_t altitude)
143+
bool SCD30::setAltitudeCompensation(uint16_t altitude)
142144
{
143-
sendCommand(COMMAND_SET_ALTITUDE_COMPENSATION, altitude);
145+
return sendCommand(COMMAND_SET_ALTITUDE_COMPENSATION, altitude);
144146
}
145147

146148
//Set the pressure compenstation. This is passed during measurement startup.
147149
//mbar can be 700 to 1200
148-
void SCD30::setAmbientPressure(uint16_t pressure_mbar)
150+
bool SCD30::setAmbientPressure(uint16_t pressure_mbar)
149151
{
150-
if(pressure_mbar < 700 || pressure_mbar > 1200) pressure_mbar = 0; //Error check
151-
sendCommand(COMMAND_CONTINUOUS_MEASUREMENT, pressure_mbar);
152+
if(pressure_mbar < 700 || pressure_mbar > 1200)
153+
{
154+
return false;
155+
}
156+
return sendCommand(COMMAND_CONTINUOUS_MEASUREMENT, pressure_mbar);
152157
}
153158

154159
//Begins continuous measurements
@@ -169,9 +174,9 @@ boolean SCD30::beginMeasuring(void)
169174

170175
//Sets interval between measurements
171176
//2 seconds to 1800 seconds (30 minutes)
172-
void SCD30::setMeasurementInterval(uint16_t interval)
177+
bool SCD30::setMeasurementInterval(uint16_t interval)
173178
{
174-
sendCommand(COMMAND_SET_MEASUREMENT_INTERVAL, interval);
179+
return sendCommand(COMMAND_SET_MEASUREMENT_INTERVAL, interval);
175180
}
176181

177182
//Returns true when data is available
@@ -202,9 +207,11 @@ boolean SCD30::readMeasurement()
202207
if (_i2cPort->endTransmission() != 0)
203208
return (0); //Sensor did not ACK
204209

205-
_i2cPort->requestFrom((uint8_t)SCD30_ADDRESS, (uint8_t)18);
210+
const uint8_t receivedBytes = _i2cPort->requestFrom((uint8_t)SCD30_ADDRESS, (uint8_t)18);
211+
bool error = false;
206212
if (_i2cPort->available())
207213
{
214+
byte bytesToCrc[2];
208215
for (byte x = 0 ; x < 18 ; x++)
209216
{
210217
byte incoming = _i2cPort->read();
@@ -217,28 +224,43 @@ boolean SCD30::readMeasurement()
217224
case 4:
218225
tempCO2 <<= 8;
219226
tempCO2 |= incoming;
227+
bytesToCrc[x%3] = incoming;
220228
break;
221229
case 6:
222230
case 7:
223231
case 9:
224232
case 10:
225233
tempTemperature <<= 8;
226234
tempTemperature |= incoming;
235+
bytesToCrc[x%3] = incoming;
227236
break;
228237
case 12:
229238
case 13:
230239
case 15:
231240
case 16:
232241
tempHumidity <<= 8;
233242
tempHumidity |= incoming;
243+
bytesToCrc[x%3] = incoming;
234244
break;
235245
default:
236-
//Do nothing with the CRC bytes
246+
//Validate CRC
247+
const uint8_t foundCrc = computeCRC8(bytesToCrc, 2);
248+
if (foundCrc != incoming) {
249+
Serial.printf("Found CRC in byte %u, expected %u, got %u\n", x, incoming, foundCrc);
250+
error = true;
251+
}
237252
break;
238253
}
239254
}
255+
} else {
256+
Serial.printf("No SCD30 data found from I2C, i2c claims we should receive %u bytes\n", receivedBytes);
257+
return false;
240258
}
241259

260+
if (error) {
261+
Serial.println("Encountered error reading SCD30 data.");
262+
return false;
263+
}
242264
//Now copy the uint32s into their associated floats
243265
memcpy(&co2, &tempCO2, sizeof(co2));
244266
memcpy(&temperature, &tempTemperature, sizeof(temperature));

src/SparkFun_SCD30_Arduino_Library.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@
2727

2828
#pragma once
2929

30-
#if (ARDUINO >= 100)
3130
#include "Arduino.h"
32-
#else
33-
#include "WProgram.h"
34-
#endif
3531

3632
#include <Wire.h>
3733

@@ -64,12 +60,12 @@ class SCD30
6460
float getTemperature(void);
6561
float getTemperatureOffset(void);
6662

67-
void setMeasurementInterval(uint16_t interval);
68-
void setAmbientPressure(uint16_t pressure_mbar);
69-
void setAltitudeCompensation(uint16_t altitude);
70-
void setAutoSelfCalibration(boolean enable);
71-
void setForcedRecalibrationFactor(uint16_t concentration);
72-
void setTemperatureOffset(float tempOffset);
63+
bool setMeasurementInterval(uint16_t interval);
64+
bool setAmbientPressure(uint16_t pressure_mbar);
65+
bool setAltitudeCompensation(uint16_t altitude);
66+
bool setAutoSelfCalibration(boolean enable);
67+
bool setForcedRecalibrationFactor(uint16_t concentration);
68+
bool setTemperatureOffset(float tempOffset);
7369

7470
boolean dataAvailable();
7571
boolean readMeasurement();

0 commit comments

Comments
 (0)