Open Bolukan opened 6 years ago
Fell free to make a change and submit and pull request! I am not sure this is functionality the library should support, but, it never hurts to have it out there.
Thanks!
On Oct 28, 2018, at 12:56 PM, Bollie notifications@github.com wrote:
Expected behavior
I would like to fingerprint each BME280 using the hash of the individual trimming parameters. I need a function that returns a copy of uint8_t m_dig[32].
Actual behavior
Individual trimming parameter are not public.
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.
Took right a shot: Changes
The receiving array has to be supplied by reference. The function returns the reference to this array (so not void, see below an example). Alternative was to return a struct. The advantage would be the parameters (dig_T1 - dig_T3, dig_P1 - dig_P9 and dig_H1 - dig_H6) could be added. But I don't need them now, so I prefer keeping it simple.
Please comment, I am not proud on the long function name, but thought it should be descriptive.
Example use:
uint8_t parameters[32];
CRC32 crc;
uint32_t checksum = CRC32::calculate(bme.compensationParameters(parameters), 32);
Serial.printf("SensorID: 0x%08X\nHash(CRC32) of ", checksum);
for (int i=0; i<32; i++) Serial.printf("%02X ", parameters[i]);
Serial.print("\n");
Output:
SensorID: 0x27F4DEF5
Hash(CRC32) of CF 6C AF 65 32 00 54 91 5F D6 D0 0B 66 1D BC FF F9 FF 0C 30 20 D1 88 13 4B 47 01 00 1A 20 03 1E
Little bump as your first reaction was so quick.
I believe that the simplest way is to add this in the library. If I have understand first you have to call the ReadTrim private function and then you have all data in m_dig private array. Then you can have a pointer to this array (so I believe it should be public) and calculate the CRC or calculate the CRC inside the library.
Hello Bolukan,
in the past i discovered this and it really works as suggested by Bosch. https://community.bosch-sensortec.com/t5/MEMS-sensors-forum/Unique-IDs-in-Bosch-Sensors/td-p/6012
This is how you read the unique ID in any BME sensor. As suggested it should work same way for BMP and also the 680 sensor.
Edit: I added example screen for two BME280 sensors. Here is my code for grabbing and building the ID.
uid_regs0[0] = BME0.readRegister(0x83); uid_regs0[1] = BME0.readRegister(0x84); uid_regs0[2] = BME0.readRegister(0x85); uid_regs0[3] = BME0.readRegister(0x86); unique_id0 = ((((uint32_t)uid_regs0[3] + ((uint32_t)uid_regs0[2] << 8)) & 0x7fff) << 16) + (((uint32_t)uid_regs0[1]) << 8)+ (uint32_t)uid_regs0[0]; Serial.print("BME0 ID: "); Serial.println(unique_id0, HEX); Serial.println("");
Fantastic. Let’s have this implemented !
Implementation: https://github.com/Bolukan/BME280/ Example for use is added
Example show an error here (IDE 1.8.10 and AVR core 1.8.2) Serial.printf("Unique ID: 0x%08X\n", uniqueID); 'class HardwareSerial' has no member named 'printf'; print doesn't work too no matching function for call to 'print(const char [19], uint32_t&)'
this compile but not tested
uint32_t uniqueID = bme.UniqueId();
char buffer[19];
sprintf("Unique ID: 0x%08X\n", uniqueID);
Serial.print(buffer);
You are right: printf is not available for all Arduino family members. I will use your code to adapt the example. Thanks for testing! For me (using esp8266) it worked: I got different numbers for different BME280's
I thought it was ESP8266 code, that's the reason I specified the AVR core. Thank you for your unique ID add, it is very useful when you calibrate this sensor so you can easily associate calibration data with sensor as one can do with DS18B20.
Example updated (Btw, 19 would be too small)
Has a pull request been created for this?
Expected behavior
I would like to fingerprint each BME280 using the hash of the individual trimming parameters. I need a function that returns a copy of uint8_t m_dig[32].
Actual behavior
Individual trimming parameters are not public.