Skip to content

Commit dae10d1

Browse files
committed
read out serial as 64 bit integer
instead of raw uint16 array
1 parent 493c467 commit dae10d1

File tree

4 files changed

+19
-24
lines changed

4 files changed

+19
-24
lines changed

examples/exampleScd41SingleShot/exampleScd41SingleShot.ino

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,10 @@ SensirionI2cScd4x sensor;
5151
static char errorMessage[64];
5252
static int16_t error;
5353

54-
void print_ushort_array(uint16_t* array, uint16_t len) {
55-
uint16_t i = 0;
54+
void PrintUint64(uint64_t& value) {
5655
Serial.print("0x");
57-
for (; i < len; i++) {
58-
Serial.print(array[i], HEX);
59-
}
56+
Serial.print((uint32_t)(value >> 32), HEX);
57+
Serial.print((uint32_t)(value & 0xFFFFFFFF), HEX);
6058
}
6159

6260
void setup() {
@@ -68,7 +66,7 @@ void setup() {
6866
Wire.begin();
6967
sensor.begin(Wire, SCD41_I2C_ADDR_62);
7068

71-
uint16_t serialNumber[3] = {0};
69+
uint64_t serialNumber = 0;
7270
delay(30);
7371
// Ensure sensor is in clean state
7472
error = sensor.wakeUp();
@@ -90,15 +88,15 @@ void setup() {
9088
Serial.println(errorMessage);
9189
}
9290
// Read out information about the sensor
93-
error = sensor.getSerialNumber(serialNumber, 3);
91+
error = sensor.getSerialNumber(serialNumber);
9492
if (error != NO_ERROR) {
9593
Serial.print("Error trying to execute getSerialNumber(): ");
9694
errorToString(error, errorMessage, sizeof errorMessage);
9795
Serial.println(errorMessage);
9896
return;
9997
}
100-
Serial.print("serial number: ");
101-
print_ushort_array(serialNumber, 3);
98+
Serial.print("serial number: 0x");
99+
PrintUint64(serialNumber);
102100
Serial.println();
103101
//
104102
// If temperature offset and/or sensor altitude compensation

examples/exampleUsage/exampleUsage.ino

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,10 @@ SensirionI2cScd4x sensor;
5151
static char errorMessage[64];
5252
static int16_t error;
5353

54-
void print_ushort_array(uint16_t* array, uint16_t len) {
55-
uint16_t i = 0;
54+
void PrintUint64(uint64_t& value) {
5655
Serial.print("0x");
57-
for (; i < len; i++) {
58-
Serial.print(array[i], HEX);
59-
}
56+
Serial.print((uint32_t)(value >> 32), HEX);
57+
Serial.print((uint32_t)(value & 0xFFFFFFFF), HEX);
6058
}
6159

6260
void setup() {
@@ -68,7 +66,7 @@ void setup() {
6866
Wire.begin();
6967
sensor.begin(Wire, SCD41_I2C_ADDR_62);
7068

71-
uint16_t serialNumber[3] = {0};
69+
uint64_t serialNumber = 0;
7270
delay(30);
7371
// Ensure sensor is in clean state
7472
error = sensor.wakeUp();
@@ -90,15 +88,15 @@ void setup() {
9088
Serial.println(errorMessage);
9189
}
9290
// Read out information about the sensor
93-
error = sensor.getSerialNumber(serialNumber, 3);
91+
error = sensor.getSerialNumber(serialNumber);
9492
if (error != NO_ERROR) {
9593
Serial.print("Error trying to execute getSerialNumber(): ");
9694
errorToString(error, errorMessage, sizeof errorMessage);
9795
Serial.println(errorMessage);
9896
return;
9997
}
10098
Serial.print("serial number: ");
101-
print_ushort_array(serialNumber, 3);
99+
PrintUint64(serialNumber);
102100
Serial.println();
103101
//
104102
// If temperature offset and/or sensor altitude compensation

src/SensirionI2cScd4x.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,7 @@ int16_t SensirionI2cScd4x::persistSettings() {
538538
return localError;
539539
}
540540

541-
int16_t SensirionI2cScd4x::getSerialNumber(uint16_t serialNumber[],
542-
uint16_t serialNumberSize) {
541+
int16_t SensirionI2cScd4x::getSerialNumber(uint64_t& serialNumber) {
543542
int16_t localError = NO_ERROR;
544543
uint8_t* buffer_ptr = communication_buffer;
545544
SensirionI2CTxFrame txFrame =
@@ -556,8 +555,7 @@ int16_t SensirionI2cScd4x::getSerialNumber(uint16_t serialNumber[],
556555
if (localError != NO_ERROR) {
557556
return localError;
558557
}
559-
localError |=
560-
rxFrame.getBytes((uint8_t*)serialNumber, (serialNumberSize * 2));
558+
localError |= rxFrame.getInteger(reinterpret_cast<uint8_t*>(&serialNumber), LongInteger, 6);
561559
return localError;
562560
}
563561

src/SensirionI2cScd4x.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,15 +595,16 @@ class SensirionI2cScd4x {
595595
* verify the presence of the sensor. The get_serial_number command returns
596596
* 3 words, and every word is followed by an 8-bit CRC checksum. Together,
597597
* the 3 words constitute a unique serial number with a length of 48 bits
598-
* (in big endian format).
598+
* (in big endian format). This method takes care of converting the serial
599+
* number from the 3 words to an 64 bit unsigned integer.
599600
*
600-
* @param[out] serialNumber 48-bit unique serial number of the sensor.
601+
* @param[out] serialNumber of the sensor as integer.
601602
*
602603
* @note This command is only available in idle mode.
603604
*
604605
* @return error_code 0 on success, an error code otherwise.
605606
*/
606-
int16_t getSerialNumber(uint16_t serialNumber[], uint16_t serialNumberSize);
607+
int16_t getSerialNumber(uint64_t& serialNumber);
607608

608609
/**
609610
* @brief Perform self test to assess sensor functionality and power supply.

0 commit comments

Comments
 (0)