Skip to content

Commit

Permalink
read out serial as 64bit integer
Browse files Browse the repository at this point in the history
instead of a ushort array just printed out with one word after the other, which gives a "wrong" serial number in the printout resp the user would need to convert it appropriately
  • Loading branch information
LeonieFierz committed Jan 30, 2025
1 parent 493c467 commit 1e9686a
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 31 deletions.
16 changes: 4 additions & 12 deletions examples/exampleScd41SingleShot/exampleScd41SingleShot.ino
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,6 @@ SensirionI2cScd4x sensor;
static char errorMessage[64];
static int16_t error;

void print_ushort_array(uint16_t* array, uint16_t len) {
uint16_t i = 0;
Serial.print("0x");
for (; i < len; i++) {
Serial.print(array[i], HEX);
}
}

void setup() {

Serial.begin(115200);
Expand All @@ -68,7 +60,7 @@ void setup() {
Wire.begin();
sensor.begin(Wire, SCD41_I2C_ADDR_62);

uint16_t serialNumber[3] = {0};
uint64_t serialNumber = 0;
delay(30);
// Ensure sensor is in clean state
error = sensor.wakeUp();
Expand All @@ -90,15 +82,15 @@ void setup() {
Serial.println(errorMessage);
}
// Read out information about the sensor
error = sensor.getSerialNumber(serialNumber, 3);
error = sensor.getSerialNumber(serialNumber);
if (error != NO_ERROR) {
Serial.print("Error trying to execute getSerialNumber(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
Serial.print("serial number: ");
print_ushort_array(serialNumber, 3);
Serial.print("serial number: 0x");
Serial.print(serialNumber, HEX);
Serial.println();
//
// If temperature offset and/or sensor altitude compensation
Expand Down
16 changes: 4 additions & 12 deletions examples/exampleUsage/exampleUsage.ino
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,6 @@ SensirionI2cScd4x sensor;
static char errorMessage[64];
static int16_t error;

void print_ushort_array(uint16_t* array, uint16_t len) {
uint16_t i = 0;
Serial.print("0x");
for (; i < len; i++) {
Serial.print(array[i], HEX);
}
}

void setup() {

Serial.begin(115200);
Expand All @@ -68,7 +60,7 @@ void setup() {
Wire.begin();
sensor.begin(Wire, SCD41_I2C_ADDR_62);

uint16_t serialNumber[3] = {0};
uint64_t serialNumber = 0;
delay(30);
// Ensure sensor is in clean state
error = sensor.wakeUp();
Expand All @@ -90,15 +82,15 @@ void setup() {
Serial.println(errorMessage);
}
// Read out information about the sensor
error = sensor.getSerialNumber(serialNumber, 3);
error = sensor.getSerialNumber(serialNumber);
if (error != NO_ERROR) {
Serial.print("Error trying to execute getSerialNumber(): ");
errorToString(error, errorMessage, sizeof errorMessage);
Serial.println(errorMessage);
return;
}
Serial.print("serial number: ");
print_ushort_array(serialNumber, 3);
Serial.print("serial number: 0x");
Serial.print(serialNumber, HEX);
Serial.println();
//
// If temperature offset and/or sensor altitude compensation
Expand Down
6 changes: 2 additions & 4 deletions src/SensirionI2cScd4x.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -538,8 +538,7 @@ int16_t SensirionI2cScd4x::persistSettings() {
return localError;
}

int16_t SensirionI2cScd4x::getSerialNumber(uint16_t serialNumber[],
uint16_t serialNumberSize) {
int16_t SensirionI2cScd4x::getSerialNumber(uint64_t& serialNumber) {
int16_t localError = NO_ERROR;
uint8_t* buffer_ptr = communication_buffer;
SensirionI2CTxFrame txFrame =
Expand All @@ -556,8 +555,7 @@ int16_t SensirionI2cScd4x::getSerialNumber(uint16_t serialNumber[],
if (localError != NO_ERROR) {
return localError;
}
localError |=
rxFrame.getBytes((uint8_t*)serialNumber, (serialNumberSize * 2));
localError |= rxFrame.getInteger(static_cast<uint8_t*>(&serialNumber), LongInteger, 6);
return localError;
}

Expand Down
7 changes: 4 additions & 3 deletions src/SensirionI2cScd4x.h
Original file line number Diff line number Diff line change
Expand Up @@ -595,15 +595,16 @@ class SensirionI2cScd4x {
* verify the presence of the sensor. The get_serial_number command returns
* 3 words, and every word is followed by an 8-bit CRC checksum. Together,
* the 3 words constitute a unique serial number with a length of 48 bits
* (in big endian format).
* (in big endian format). This method takes care of converting the serial
* number from the 3 words to an 64 bit unsigned integer.
*
* @param[out] serialNumber 48-bit unique serial number of the sensor.
* @param[out] serialNumber of the sensor as integer.
*
* @note This command is only available in idle mode.
*
* @return error_code 0 on success, an error code otherwise.
*/
int16_t getSerialNumber(uint16_t serialNumber[], uint16_t serialNumberSize);
int16_t getSerialNumber(uint64_t& serialNumber);

/**
* @brief Perform self test to assess sensor functionality and power supply.
Expand Down

0 comments on commit 1e9686a

Please sign in to comment.