diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index 3dcef24..705e75f 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -39,40 +39,45 @@ int32_t setupError = 0; int32_t presValError = 0; int32_t detectorError = 0; +// Presence range in mm used +#define MY_XM125_RANGE_START 200 +#define MY_XM125_RANGE_END 1000 void setup() { // Start serial Serial.begin(115200); + + Serial.println(""); + Serial.println("-------------------------------------------------------"); Serial.println("XM125 Example 1: Basic Presence Readings"); + Serial.println("-------------------------------------------------------"); Serial.println(""); Wire.begin(); // If begin is successful (1), then start example - int startErr = radarSensor.begin(i2cAddress, Wire); - if (startErr == 1) + bool success = radarSensor.begin(i2cAddress, Wire); + if (success == false) { - Serial.println("Begin"); - } - else // Otherwise, infinite loop - { - Serial.print("Start Error Code: "); - Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); while (1) ; // Runs forever } // Start the sensor with default register values - int32_t setupError = radarSensor.presenceDetectorStart(); + int32_t setupError = radarSensor.presenceDetectorStart(MY_XM125_RANGE_START, MY_XM125_RANGE_END); if (setupError != 0) { Serial.print("Presence Detection Start Setup Error: "); Serial.println(setupError); } - - // New line and delay for easier reading + Serial.print("Presense Detection Started - range: "); + Serial.print(MY_XM125_RANGE_START); + Serial.print("mm to "); + Serial.print(MY_XM125_RANGE_END); + Serial.println("mm"); Serial.println(); + delay(500); } @@ -81,28 +86,32 @@ void loop() // Busy wait loop until data is ready radarSensor.presenceBusyWait(); - // Get the presence distance value and print out if no errors + // Get the presence distance value and print out if no errors. + // Note - this returns if Presense is detected now, or since last check (sticky) presValError = radarSensor.getPresenceDistanceValuemm(distance); if (presValError == 0) { Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); - // Serial.print(distance * .1); - // Serial.println("cm"); - // Serial.print(distance * .001); - // Serial.println("m"); - // Serial.print(distance * .001); - // Serial.println("m"); - // Serial.print(distance * .03937008); - // Serial.println("In"); + // if distance is > 0, presence is detected, else it is not + if (distance > 0) + { + Serial.print("YES - Distance: "); + Serial.print(distance); + Serial.print("mm, "); + Serial.print(distance * .1); + Serial.print("cm, "); + Serial.print(distance * .001); + Serial.print("m, "); + Serial.print(distance * .03937008); + Serial.println("In"); + } + else + Serial.println("NO"); } else - { Serial.println("Error returning presence distance value"); - } - // Delay 0.5 seconds between readings - delay(500); + // Delay 2.5 seconds between readings + delay(2500); } diff --git a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino index c938f4f..5e217ce 100644 --- a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino +++ b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino @@ -29,67 +29,46 @@ SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Setup Variables -uint32_t startVal = 0; -uint32_t endVal = 0; -uint32_t numDistances = 9; -uint32_t calibrateNeeded = 0; -uint32_t measDistErr = 0; - -// Error statuses -uint32_t errorStatus = 0; -uint32_t distanceSetupError = 0; - -// Distance Variables -int32_t distancePeakStrength0 = 0; -uint32_t distancePeak0 = 0; -int32_t distancePeakStrength1 = 0; -uint32_t distancePeak1 = 0; -int32_t distancePeakStrength2 = 0; -uint32_t distancePeak2 = 0; -int32_t distancePeakStrength3 = 0; -uint32_t distancePeak3 = 0; -int32_t distancePeakStrength4 = 0; -uint32_t distancePeak4 = 0; -int32_t distancePeakStrength5 = 0; -uint32_t distancePeak5 = 0; -int32_t distancePeakStrength6 = 0; -uint32_t distancePeak6 = 0; -int32_t distancePeakStrength7 = 0; -uint32_t distancePeak7 = 0; -int32_t distancePeakStrength8 = 0; -uint32_t distancePeak8 = 0; -int32_t distancePeakStrength9 = 0; -uint32_t distancePeak9 = 0; +// Presence range in mm used +#define MY_XM125_RANGE_START 200 +#define MY_XM125_RANGE_END 2000 void setup() { // Start serial Serial.begin(115200); + + Serial.println(""); + Serial.println("-------------------------------------------------------"); Serial.println("XM125 Example 6: Basic Distance Readings"); + Serial.println("-------------------------------------------------------"); Serial.println(""); Wire.begin(); // If begin is successful (0), then start example - if (radarSensor.begin(i2cAddress, Wire) == 1) - { - Serial.println("Begin"); - } - else // Otherwise, infinite loop + if (radarSensor.begin(i2cAddress, Wire) == false) { Serial.println("Device failed to setup - Freezing code."); while (1) ; // Runs forever } - - int32_t setupError = radarSensor.distanceBegin(); + Serial.println("Starting Sensor..."); + Serial.println(); + // Start the sensor with the specified range values + int32_t setupError = radarSensor.distanceBegin(MY_XM125_RANGE_START, MY_XM125_RANGE_END); if (setupError != 0) { Serial.print("Distance Detection Start Setup Error: "); Serial.println(setupError); } - + Serial.println(); + Serial.print("Distance Detection Started - range: "); + Serial.print(MY_XM125_RANGE_START); + Serial.print("mm to "); + Serial.print(MY_XM125_RANGE_END); + Serial.println("mm"); + Serial.println(); // New-line and 0.5 second delay for easier reading Serial.println(); delay(500); @@ -97,117 +76,69 @@ void setup() void loop() { - distanceSetupError = radarSensor.distanceDetectorReadingSetup(); - if (distanceSetupError != 0) + uint32_t retCode = radarSensor.distanceDetectorReadingSetup(); + if (retCode != 0) { Serial.print("Distance Reading Setup Error: "); - Serial.println(distanceSetupError); + Serial.println(retCode); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected - radarSensor.getDistancePeak0Distance(distancePeak0); - radarSensor.getDistancePeak0Strength(distancePeakStrength0); - radarSensor.getDistancePeak1Distance(distancePeak1); - radarSensor.getDistancePeak1Strength(distancePeakStrength1); - radarSensor.getDistancePeak2Distance(distancePeak2); - radarSensor.getDistancePeak2Strength(distancePeakStrength2); - radarSensor.getDistancePeak3Distance(distancePeak3); - radarSensor.getDistancePeak3Strength(distancePeakStrength3); - radarSensor.getDistancePeak4Distance(distancePeak4); - radarSensor.getDistancePeak4Strength(distancePeakStrength4); - radarSensor.getDistancePeak5Distance(distancePeak5); - radarSensor.getDistancePeak5Strength(distancePeakStrength5); - radarSensor.getDistancePeak6Distance(distancePeak6); - radarSensor.getDistancePeak6Strength(distancePeakStrength6); - radarSensor.getDistancePeak7Distance(distancePeak7); - radarSensor.getDistancePeak7Strength(distancePeakStrength7); - radarSensor.getDistancePeak8Distance(distancePeak8); - radarSensor.getDistancePeak8Strength(distancePeakStrength8); - radarSensor.getDistancePeak9Distance(distancePeak9); - radarSensor.getDistancePeak9Strength(distancePeakStrength9); - - // If a peak distance was detected, then read out the distance and strength - if (distancePeak0 != 0) - { - Serial.print("Peak0 Distance, Strength: "); - Serial.print(distancePeak0); - Serial.print("mm, "); - Serial.println(distancePeakStrength0); - Serial.println(); - } - if (distancePeak1 != 0) - { - Serial.print("Peak1 Distance, Strength: "); - Serial.print(distancePeak1); - Serial.print("mm, "); - Serial.println(distancePeakStrength1); - Serial.println(); - } - if (distancePeak2 != 0) - { - Serial.print("Peak2 Distance, Strength: "); - Serial.print(distancePeak2); - Serial.print("mm, "); - Serial.println(distancePeakStrength2); - Serial.println(); - } - if (distancePeak3 != 0) - { - Serial.print("Peak3 Distance, Strength: "); - Serial.print(distancePeak3); - Serial.print("mm, "); - Serial.println(distancePeakStrength3); - Serial.println(); - } - if (distancePeak4 != 0) - { - Serial.print("Peak4 Distance, Strength: "); - Serial.print(distancePeak4); - Serial.print("mm, "); - Serial.println(distancePeakStrength4); - Serial.println(); - } - if (distancePeak5 != 0) - { - Serial.print("Peak5 Distance, Strength: "); - Serial.print(distancePeak5); - Serial.print("mm, "); - Serial.println(distancePeakStrength5); - Serial.println(); - } - if (distancePeak6 != 0) - { - Serial.print("Peak6 Distance, Strength: "); - Serial.print(distancePeak6); - Serial.print("mm, "); - Serial.println(distancePeakStrength6); - Serial.println(); - } - if (distancePeak7 != 0) - { - Serial.print("Peak7 Distance, Strength: "); - Serial.print(distancePeak7); - Serial.print("mm, "); - Serial.println(distancePeakStrength7); - Serial.println(); - } - if (distancePeak8 != 0) + // How many distance values were detected? (0-9) + uint32_t numDistances = 0; + radarSensor.getDistanceNumberDistances(numDistances); + + if (numDistances == 0) + Serial.print("."); + else { - Serial.print("Peak8 Distance, Strength: "); - Serial.print(distancePeak8); - Serial.print("mm, "); - Serial.println(distancePeakStrength8); Serial.println(); + Serial.print("Number of Values Detected: "); + Serial.println(numDistances); } - if (distancePeak9 != 0) + + uint32_t distance = 0; + int32_t distanceStrength = 0; + for (uint32_t i = 0; i < numDistances; i++) { - Serial.print("Peak9 Distance, Strength: "); - Serial.print(distancePeak9); - Serial.print("mm, "); - Serial.println(distancePeakStrength9); - Serial.println(); + if (radarSensor.getDistancePeakDistance(i, distance) != ksfTkErrOk) + { + Serial.print("Error retrieving Distance Peak "); + Serial.print(i); + Serial.println(); + continue; + } + Serial.print(" Distance Peak "); + Serial.print(i); + Serial.print(": "); + if (distance < 100) + { + Serial.print(distance); + Serial.print("mm"); + } + else if (distance < 1000) + { + Serial.print(distance * 0.1); + Serial.print("cm"); + } + else + { + Serial.print(distance * 0.001); + Serial.print("m"); + } + + if (radarSensor.getDistancePeakStrength(i, distanceStrength) != ksfTkErrOk) + { + Serial.print("Error retrieving Distance Peak Strength"); + Serial.print(i); + Serial.println(); + continue; + } + Serial.print(" Distance Peak Strength "); + Serial.print(i); + Serial.print(": "); + Serial.println(distanceStrength); } - // Half a second delay for easier readings - delay(500); + // delay before next reading + delay(2500); } diff --git a/src/sfTk/sfDevXM125Distance.cpp b/src/sfTk/sfDevXM125Distance.cpp index b804f1b..17be1d6 100644 --- a/src/sfTk/sfDevXM125Distance.cpp +++ b/src/sfTk/sfDevXM125Distance.cpp @@ -41,7 +41,7 @@ sfTkError_t sfDevXM125Distance::begin(sfTkII2C *theBus) return ksfTkErrOk; } //------------------------------------------------------------------ -int32_t sfDevXM125Distance::distanceBegin() +int32_t sfDevXM125Distance::distanceBegin(uint32_t startRange, uint32_t endRange) { uint32_t errorStatus = 0; @@ -64,20 +64,20 @@ int32_t sfDevXM125Distance::distanceBegin() } // Set Start register - if (setDistanceStart(sfe_xm125_distance_start_default) != 0) + if (setDistanceStart(startRange) != 0) { return 3; } sftk_delay_ms(100); // give time for command to set // Set End register - if (setDistanceEnd(sfe_xm125_distance_end_default) != 0) + if (setDistanceEnd(endRange) != 0) { return 4; } sftk_delay_ms(100); // give time for command to set - // Apply configuration + // Apply configuration and calibrate. if (setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) { // Check for errors @@ -363,6 +363,49 @@ sfTkError_t sfDevXM125Distance::getDistanceTemperature(int16_t &temperature) return retVal; } +//-------------------------------------------------------------------------------- +// Generic distance peak distance method +sfTkError_t sfDevXM125Distance::getDistancePeakDistance(uint8_t num, uint32_t &peak) +{ + + switch (num) + { + case 0: + return getDistancePeak0Distance(peak); + break; + + case 1: + return getDistancePeak1Distance(peak); + break; + case 2: + return getDistancePeak2Distance(peak); + break; + case 3: + return getDistancePeak3Distance(peak); + break; + case 4: + return getDistancePeak4Distance(peak); + break; + case 5: + return getDistancePeak5Distance(peak); + break; + case 6: + return getDistancePeak6Distance(peak); + break; + case 7: + return getDistancePeak7Distance(peak); + break; + case 8: + return getDistancePeak8Distance(peak); + break; + case 9: + return getDistancePeak9Distance(peak); + break; + default: + return ksfTkErrFail; + break; + } +} //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistancePeak0Distance(uint32_t &peak) { @@ -462,7 +505,49 @@ sfTkError_t sfDevXM125Distance::getDistancePeak9Distance(uint32_t &peak) peak = sftk_byte_swap(peak); return retVal; } +//-------------------------------------------------------------------------------- +// Generic distance peak strength method +sfTkError_t sfDevXM125Distance::getDistancePeakStrength(uint8_t num, int32_t &peak) +{ + switch (num) + { + case 0: + return getDistancePeak0Strength(peak); + break; + + case 1: + return getDistancePeak1Strength(peak); + break; + case 2: + return getDistancePeak2Strength(peak); + break; + case 3: + return getDistancePeak3Strength(peak); + break; + case 4: + return getDistancePeak4Strength(peak); + break; + case 5: + return getDistancePeak5Strength(peak); + break; + case 6: + return getDistancePeak6Strength(peak); + break; + case 7: + return getDistancePeak7Strength(peak); + break; + case 8: + return getDistancePeak8Strength(peak); + break; + case 9: + return getDistancePeak9Strength(peak); + break; + default: + return ksfTkErrFail; + break; + } +} //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistancePeak0Strength(int32_t &peak) { diff --git a/src/sfTk/sfDevXM125Distance.h b/src/sfTk/sfDevXM125Distance.h index a7e9c7f..487888f 100644 --- a/src/sfTk/sfDevXM125Distance.h +++ b/src/sfTk/sfDevXM125Distance.h @@ -163,11 +163,11 @@ const uint16_t SFE_XM125_DISTANCE_PEAK7_STRENGTH = 0x22; const uint16_t SFE_XM125_DISTANCE_PEAK8_STRENGTH = 0x23; const uint16_t SFE_XM125_DISTANCE_PEAK9_STRENGTH = 0x24; -// Default Value: 250 +// Default Value: 250mm const uint16_t SFE_XM125_DISTANCE_START = 0x40; const uint16_t sfe_xm125_distance_start_default = 250; -// Default Value: 3000 +// Default Value: 3000mm const uint16_t SFE_XM125_DISTANCE_END = 0x41; const uint16_t sfe_xm125_distance_end_default = 3000; @@ -283,7 +283,8 @@ class sfDevXM125Distance : public sfDevXM125Core /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceBegin(); + sfTkError_t distanceBegin(uint32_t start = sfe_xm125_distance_start_default, + uint32_t end = sfe_xm125_distance_end_default); /// @brief This function does all the required checks and busy waits to /// make sure the device is ready for distance readings. @@ -344,6 +345,15 @@ class sfDevXM125Distance : public sfDevXM125Core /// @return ksfTkErrOk on success, or error code (value < -1) sfTkError_t getDistanceTemperature(int16_t &temperature); + //-------------------------------------------------------------------------------- + // Generic distance peak distance method + /// @brief This function returns the distance to peak num + /// Note: This value is a factor 1000 larger than the RSS value + /// @param num Peak number to get distance (0-9) + /// @param peak Distance to peak num + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakDistance(uint8_t num, uint32_t &peak); + /// @brief This function returns the distance to peak 0 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) @@ -394,6 +404,15 @@ class sfDevXM125Distance : public sfDevXM125Core /// @return ksfTkErrOk on success, or error code (value < -1) sfTkError_t getDistancePeak9Distance(uint32_t &peak); + //-------------------------------------------------------------------------------- + // Generic distance peak strength method + /// @brief This function returns the strength to peak num + /// Note: This value is a factor 1000 larger than the RSS value + /// @param num Peak number to get strength (0-9) + /// @param peak strength to peak num + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakStrength(uint8_t num, int32_t &peak); + /// @brief This function returns the strength of peak 0 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 56db165..7092457 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -32,7 +32,7 @@ sfTkError_t sfDevXM125Presence::begin(sfTkII2C *theBus) return ksfTkErrOk; } //------------------------------------------------------------------------- -sfTkError_t sfDevXM125Presence::presenceDetectorStart() +sfTkError_t sfDevXM125Presence::presenceDetectorStart(uint32_t startValue, uint32_t endValue) { // *** Presence Sensor Setup *** uint32_t errorStatus = 0; @@ -51,13 +51,13 @@ sfTkError_t sfDevXM125Presence::presenceDetectorStart() return 3; // Set Presence Start register - if (setPresenceStart(300) != ksfTkErrOk) + if (setPresenceStart(startValue) != ksfTkErrOk) return 4; sftk_delay_ms(100); // give time for command to set // Set End register - if (setPresenceEnd(2500) != ksfTkErrOk) + if (setPresenceEnd(endValue) != ksfTkErrOk) return 5; sftk_delay_ms(100); // give time for command to set @@ -90,38 +90,41 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal { // Check error bits uint32_t errorStatus = 0; - uint32_t presenceDetected = 0; - uint32_t presenceDetectedSticky = 0; + uint32_t presenceStatus = 0; sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return 1; + return ksfTkErrFail; // Start detector if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) - return 2; + return ksfTkErrFail; sftk_delay_ms(100); - // Poll detector status until busy bit is cleared - CHECK ON THIS! + // Poll detector status until busy bit is cleared if (presenceBusyWait() != ksfTkErrOk) - return 3; + return ksfTkErrFail; // Verify that no error bits are set in the detector status register retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return 4; + return ksfTkErrFail; - // Read detector result register and determine detection status - if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) - return 5; + // Read from 16-Bit Register to get the presence detection status + if (_theBus->readRegister(SFE_XM125_PRESENCE_RESULT, presenceStatus) != ksfTkErrOk) + return ksfTkErrFail; - if (getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) - return 6; + // Presence detected NOW or since last check (sticky) + bool bPresenceDetected = ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_MASK) != 0) || + ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) != 0); - if (presenceDetected == 1 || presenceDetectedSticky == 1) + // If presence or a sticky presence is detected, get the distance and return + if (bPresenceDetected) return getPresenceDistance(presenceVal); + // If no presence detected, return 0 + presenceVal = 0; return ksfTkErrOk; } @@ -316,7 +319,6 @@ sfTkError_t sfDevXM125Presence::setPresenceInterPhaseBoostEnabled(bool en) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionEnabled(bool &en) { - size_t readBytes = 0; uint8_t value; sfTkError_t retVal = _theBus->readRegisterUInt8(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, value); diff --git a/src/sfTk/sfDevXM125Presence.h b/src/sfTk/sfDevXM125Presence.h index 48c814d..41fa9a0 100644 --- a/src/sfTk/sfDevXM125Presence.h +++ b/src/sfTk/sfDevXM125Presence.h @@ -246,8 +246,10 @@ class sfDevXM125Presence : public sfDevXM125Core sfTkError_t begin(sfTkII2C *theBus = nullptr) override; /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. + /// @param start Start value for presence sensing in mm - default value is 1000 + /// @param end End value for presence sensing in mm - default value is 5000 /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t presenceDetectorStart(); + sfTkError_t presenceDetectorStart(uint32_t start = 1000, uint32_t end = 5000); /// @brief This function returns the presence value of the register /// with all the checks in place as per the I2C Datasheet.