Skip to content

Commit 9f03e63

Browse files
committed
reduce library size
1 parent fd1c400 commit 9f03e63

File tree

4 files changed

+53
-45
lines changed

4 files changed

+53
-45
lines changed

examples/Example1_BasicReadings/Example1_BasicReadings.ino

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ SGP30 mySensor; //create an object of the SGP30 class
2121
void setup() {
2222
Serial.begin(9600);
2323
Wire.begin();
24-
//Sensor supports I2C speeds up to 400kHz
25-
Wire.setClock(400000);
2624
//Initialize sensor
2725
if (mySensor.begin() != SUCCESS) {
2826
Serial.println("No SGP30 Detected. Check connections.");

examples/Example7_Reset/Example7_Reset.ino

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include <EEPROM.h>
1919

2020
SGP30 mySensor; //create an object of the SGP30 class
21-
byte count = 0;
2221
byte baselineC02Addr = 0x00;
2322
byte baselineTVOCAddr = 0x02;
2423

@@ -34,7 +33,7 @@ void setup() {
3433
//First fifteen readings will be
3534
//CO2: 400 ppm TVOC: 0 ppb
3635
//We will reset after 30 readings
37-
for (count; count < 30; count++)
36+
for (byte count = 0; count < 30; count++)
3837
{
3938
delay(1000); //Wait 1 second
4039
mySensor.measureAirQuality();

src/SparkFun_SGP30_Library.cpp

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,6 @@
3939

4040
#include "SparkFun_SGP30_Library.h"
4141

42-
//const uint8_t init_air_quality[2] = {0x20, 0x03};
43-
//const uint8_t measure_air_quality[2] = {0x20, 0x08};
44-
//const uint8_t get_baseline[2] = {0x20, 0x15};
45-
//const uint8_t set_baseline[2] = {0x20, 0x1E};
46-
//const uint8_t set_humidity[2] = {0x20, 0x61};
47-
//const uint8_t measure_test[2] = {0x20, 0x32};
48-
//const uint8_t get_feature_set_version[2] = {0x20, 0x2F};
49-
//const uint8_t get_serial_id[2] = {0x36, 0x82};
50-
//const uint8_t measure_raw_signals[2] = {0x20, 0x50};
5142

5243
//Constructor
5344
SGP30::SGP30() {
@@ -59,9 +50,6 @@ SGP30::SGP30() {
5950
H2 = 0;
6051
ethanol = 0;
6152
serialID = 0;
62-
_serialID1 = 0;
63-
_serialID2 = 0;
64-
_serialID3 = 0;
6553
}
6654

6755
//Start I2C communication using specified port
@@ -103,11 +91,11 @@ SGP30ERR SGP30::measureAirQuality(void) {
10391
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)6);
10492
}
10593
if (counter == 12) return ERR_I2C_TIMEOUT; //Error out
106-
_CO2 = _i2cPort->read() << 8; //store MSB in CO2
94+
uint16_t _CO2 = _i2cPort->read() << 8; //store MSB in CO2
10795
_CO2 |= _i2cPort->read(); //store LSB in CO2
10896
uint8_t checkSum = _i2cPort->read(); //verify checksum
10997
if (checkSum != _CRC8(_CO2)) return ERR_BAD_CRC; //checksum failed
110-
_TVOC = _i2cPort->read() << 8; //store MSB in TVOC
98+
uint16_t _TVOC = _i2cPort->read() << 8; //store MSB in TVOC
11199
_TVOC |= _i2cPort->read(); //store LSB in TVOC
112100
checkSum = _i2cPort->read(); //verify checksum
113101
if (checkSum != _CRC8(_TVOC)) return ERR_BAD_CRC; //checksum failed
@@ -137,11 +125,11 @@ SGP30ERR SGP30::getBaseline(void) {
137125
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)6);
138126
}
139127
if (counter == 12) return ERR_I2C_TIMEOUT; //Error out
140-
_baselineCO2 = _i2cPort->read() << 8; //store MSB in _baselineCO2
128+
uint16_t _baselineCO2 = _i2cPort->read() << 8; //store MSB in _baselineCO2
141129
_baselineCO2 |= _i2cPort->read(); //store LSB in _baselineCO2
142130
uint8_t checkSum = _i2cPort->read(); //verify checksum
143131
if (checkSum != _CRC8(_baselineCO2)) return ERR_BAD_CRC; //checksum failed
144-
_baselineTVOC = _i2cPort->read() << 8; //store MSB in _baselineTVOC
132+
uint16_t _baselineTVOC = _i2cPort->read() << 8; //store MSB in _baselineTVOC
145133
_baselineTVOC |= _i2cPort->read(); //store LSB in _baselineTVOC
146134
checkSum = _i2cPort->read(); //verify checksum
147135
if (checkSum != _CRC8(_baselineTVOC)) return ERR_BAD_CRC; //checksum failed
@@ -198,7 +186,7 @@ SGP30ERR SGP30::getFeatureSetVersion(void) {
198186
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)3);
199187
}
200188
if (counter == 3) return ERR_I2C_TIMEOUT; //Error out
201-
_featureSetVersion = _i2cPort->read() << 8; //store MSB in featureSetVerison
189+
uint16_t _featureSetVersion = _i2cPort->read() << 8; //store MSB in featureSetVerison
202190
_featureSetVersion |= _i2cPort->read(); //store LSB in featureSetVersion
203191
uint8_t checkSum = _i2cPort->read(); //verify checksum
204192
if (checkSum != _CRC8(_featureSetVersion)) return ERR_BAD_CRC; //checksum failed
@@ -224,11 +212,11 @@ SGP30ERR SGP30::measureRawSignals(void) {
224212
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)6);
225213
}
226214
if (counter == 5) return ERR_I2C_TIMEOUT; //Error out
227-
_H2 = _i2cPort->read() << 8; //store MSB in H2
228-
_H2 |= _i2cPort->read(); //store LSB in H2
215+
uint16_t _H2 = _i2cPort->read() << 8; //store MSB in _H2
216+
_H2 |= _i2cPort->read(); //store LSB in _H2
229217
uint8_t checkSum = _i2cPort->read(); //verify checksum
230218
if (checkSum != _CRC8(_H2)) return ERR_BAD_CRC; //checksumfailed
231-
_ethanol = _i2cPort->read() << 8; //store MSB in ethanol
219+
uint16_t _ethanol = _i2cPort->read() << 8; //store MSB in ethanol
232220
_ethanol |= _i2cPort->read(); //store LSB in ethanol
233221
checkSum = _i2cPort->read(); //verify checksum
234222
if (checkSum != _CRC8(_ethanol)) return ERR_BAD_CRC; //checksum failed
@@ -262,15 +250,15 @@ SGP30ERR SGP30::getSerialID(void) {
262250
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)9);
263251
}
264252
if (counter == 5) return ERR_I2C_TIMEOUT; //Error out
265-
_serialID1 = _i2cPort->read() << 8; //store MSB to top of _serialID1
253+
uint16_t _serialID1 = _i2cPort->read() << 8; //store MSB to top of _serialID1
266254
_serialID1 |= _i2cPort->read(); //store next byte in _serialID1
267255
uint8_t checkSum1 = _i2cPort->read(); //verify checksum
268256
if (checkSum1 != _CRC8(_serialID1)) return ERR_BAD_CRC; //checksum failed
269-
_serialID2 = _i2cPort->read() << 8; //store next byte to top of _serialID2
257+
uint16_t _serialID2 = _i2cPort->read() << 8; //store next byte to top of _serialID2
270258
_serialID2 |= _i2cPort->read(); //store next byte in _serialID2
271259
uint8_t checkSum2 = _i2cPort->read(); //verify checksum
272260
if (checkSum2 != _CRC8(_serialID2)) return ERR_BAD_CRC; //checksum failed
273-
_serialID3 = _i2cPort->read() << 8; //store next byte to top of _serialID3
261+
uint16_t _serialID3 = _i2cPort->read() << 8; //store next byte to top of _serialID3
274262
_serialID3 |= _i2cPort->read() ; //store LSB in _serialID3
275263
uint8_t checkSum3 = _i2cPort->read(); //verify checksum
276264
if (checkSum3 != _CRC8(_serialID3)) return ERR_BAD_CRC; //checksum failed
@@ -295,24 +283,57 @@ SGP30ERR SGP30::measureTest(void) {
295283
toRead = _i2cPort->requestFrom(_SGP30Address, (uint8_t)3);
296284
}
297285
if (counter == 22) return ERR_I2C_TIMEOUT; //Error out
298-
uint16_t results;
299-
results = _i2cPort->read() << 8; //store MSB in results
286+
uint16_t results = _i2cPort->read() << 8; //store MSB in results
300287
results |= _i2cPort->read(); //store LSB in results
301288
uint8_t checkSum = _i2cPort->read(); //verify checksum
302289
if (checkSum != _CRC8(results)) return ERR_BAD_CRC; //checksum failed
303290
if (results != 0xD400) return SELF_TEST_FAIL; //self test results incorrect
304291
return SUCCESS;
305292
}
306293

294+
#ifndef LOOKUP_TABLE
295+
//Given an array and a number of bytes, this calculate CRC8 for those bytes
296+
//CRC is only calc'd on the data portion (two bytes) of the four bytes being sent
297+
//From: http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html
298+
//Tested with: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
299+
//x^8+x^5+x^4+1 = 0x31
300+
uint8_t SGP30::_CRC8(uint16_t data)
301+
{
302+
uint8_t crc = 0xFF; //Init with 0xFF
303+
304+
crc ^= (data >> 8); // XOR-in the first input byte
305+
306+
for (uint8_t i = 0 ; i < 8 ; i++)
307+
{
308+
if ((crc & 0x80) != 0)
309+
crc = (uint8_t)((crc << 1) ^ 0x31);
310+
else
311+
crc <<= 1;
312+
}
313+
crc ^= (uint8_t)data; // XOR-in the last input byte
314+
315+
for (uint8_t i = 0 ; i < 8 ; i++)
316+
{
317+
if ((crc & 0x80) != 0)
318+
crc = (uint8_t)((crc << 1) ^ 0x31);
319+
else
320+
crc <<= 1;
321+
}
322+
323+
return crc; //No output reflection
324+
}
325+
#endif
326+
327+
#ifdef LOOKUP_TABLE
307328
//Generates CRC8 for SGP30 from lookup table
308-
uint8_t SGP30::_CRC8(uint16_t twoBytes) {
329+
uint8_t SGP30::_CRC8(uint16_t data) {
309330
uint8_t CRC = 0xFF; //inital value
310-
CRC ^= (uint8_t)(twoBytes >> 8); //start with MSB
331+
CRC ^= (uint8_t)(data >> 8); //start with MSB
311332
CRC = _CRC8LookupTable[CRC >> 4][CRC & 0xF]; //look up table [MSnibble][LSnibble]
312-
CRC ^= (uint8_t)twoBytes; //use LSB
333+
CRC ^= (uint8_t)data; //use LSB
313334
CRC = _CRC8LookupTable[CRC >> 4][CRC & 0xF]; //look up table [MSnibble][LSnibble]
314335
return CRC;
315336
}
316-
337+
#endif
317338

318339

src/SparkFun_SGP30_Library.h

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -141,21 +141,10 @@ class SGP30
141141
//SGP30's I2C address
142142
const byte _SGP30Address = 0x58;
143143

144-
//private versions of public vars so only valid data is user accessible
145-
uint16_t _CO2;
146-
uint16_t _TVOC;
147-
uint16_t _baselineCO2;
148-
uint16_t _baselineTVOC;
149-
uint16_t _featureSetVersion;
150-
uint16_t _H2;
151-
uint16_t _ethanol;
152-
uint16_t _serialID1;
153-
uint16_t _serialID2;
154-
uint16_t _serialID3;
155-
156144
//Generates CRC8 for SGP30 from lookup table
157145
uint8_t SGP30::_CRC8(uint16_t twoBytes);
158146

147+
#ifdef LOOKUP_TABLE
159148
//lookup table for CRC8 http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
160149
const uint8_t _CRC8LookupTable[16][16] = {
161150
{0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97, 0xB9, 0x88, 0xDB, 0xEA, 0x7D, 0x4C, 0x1F, 0x2E},
@@ -175,6 +164,7 @@ class SGP30
175164
{0xC1, 0xF0, 0xA3, 0x92, 0x05, 0x34, 0x67, 0x56, 0x78, 0x49, 0x1A, 0x2B, 0xBC, 0x8D, 0xDE, 0xEF},
176165
{0x82, 0xB3, 0xE0, 0xD1, 0x46, 0x77, 0x24, 0x15, 0x3B, 0x0A, 0x59, 0x68, 0xFF, 0xCE, 0x9D, 0xAC}
177166
};
167+
#endif
178168

179169
};
180170

0 commit comments

Comments
 (0)