Skip to content

Commit

Permalink
read out serial as 64 bit integer
Browse files Browse the repository at this point in the history
instead of raw uint16 array
  • Loading branch information
LeonieFierz committed Jan 30, 2025
1 parent 493c467 commit 81cbe0a
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 24 deletions.
16 changes: 7 additions & 9 deletions examples/exampleScd41SingleShot/exampleScd41SingleShot.ino
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,10 @@ SensirionI2cScd4x sensor;
static char errorMessage[64];
static int16_t error;

void print_ushort_array(uint16_t* array, uint16_t len) {
uint16_t i = 0;
void PrintUint64(uint64_t& value) {
Serial.print("0x");
for (; i < len; i++) {
Serial.print(array[i], HEX);
}
Serial.print((uint32_t)(value >> 32), HEX);
Serial.print((uint32_t)(value & 0xFFFFFFFF), HEX);
}

void setup() {
Expand All @@ -68,7 +66,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 +88,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");
PrintUint64(serialNumber);
Serial.println();
//
// If temperature offset and/or sensor altitude compensation
Expand Down
14 changes: 6 additions & 8 deletions examples/exampleUsage/exampleUsage.ino
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,10 @@ SensirionI2cScd4x sensor;
static char errorMessage[64];
static int16_t error;

void print_ushort_array(uint16_t* array, uint16_t len) {
uint16_t i = 0;
void PrintUint64(uint64_t& value) {
Serial.print("0x");
for (; i < len; i++) {
Serial.print(array[i], HEX);
}
Serial.print((uint32_t)(value >> 32), HEX);
Serial.print((uint32_t)(value & 0xFFFFFFFF), HEX);
}

void setup() {
Expand All @@ -68,7 +66,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 +88,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);
PrintUint64(serialNumber);
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((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 81cbe0a

Please sign in to comment.