- Renamed test_sths34pf80 to fulltest_sths34pf80 for clarity - Added detailed header comments explaining the sketch demonstrates all sensor settings - Uses sensor default values to provide stable API demonstration without unexpected register changes - Maintains halt-on-error behavior with F() string memory optimization 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
286 lines
No EOL
9.3 KiB
C++
286 lines
No EOL
9.3 KiB
C++
/*
|
|
* STHS34PF80 Full Test Sketch
|
|
*
|
|
* This sketch demonstrates comprehensive testing of all STHS34PF80 sensor settings
|
|
* and configuration options. It configures each parameter using the sensor's default
|
|
* values to demonstrate the API without changing register states unexpectedly.
|
|
*
|
|
* The sketch will halt with an error message if any configuration fails, and will
|
|
* continuously display real-time sensor readings including temperature, motion,
|
|
* presence detection, and temperature shock detection.
|
|
*
|
|
* Note: All setter functions use the actual sensor default values discovered through
|
|
* testing to provide a stable demonstration of the configuration API.
|
|
*/
|
|
|
|
#include "Adafruit_STHS34PF80.h"
|
|
|
|
Adafruit_STHS34PF80 sths;
|
|
|
|
void printLPFSetting(sths34pf80_lpf_config_t lpf_setting) {
|
|
switch (lpf_setting) {
|
|
case STHS34PF80_LPF_ODR_DIV_9:
|
|
Serial.print("ODR/9");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_20:
|
|
Serial.print("ODR/20");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_50:
|
|
Serial.print("ODR/50");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_100:
|
|
Serial.print("ODR/100");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_200:
|
|
Serial.print("ODR/200");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_400:
|
|
Serial.print("ODR/400");
|
|
break;
|
|
case STHS34PF80_LPF_ODR_DIV_800:
|
|
Serial.print("ODR/800");
|
|
break;
|
|
default:
|
|
Serial.print("Unknown");
|
|
break;
|
|
}
|
|
}
|
|
|
|
void halt(const __FlashStringHelper* message) {
|
|
Serial.println(message);
|
|
while (1) delay(10);
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
while (!Serial) delay(10);
|
|
|
|
Serial.println("Adafruit STHS34PF80 test!");
|
|
|
|
if (!sths.begin()) {
|
|
halt(F("Could not find a valid STHS34PF80 sensor, check wiring!"));
|
|
}
|
|
|
|
Serial.println(F("STHS34PF80 Found!"));
|
|
|
|
// Test all low-pass filter configurations
|
|
Serial.println(F("\n--- Low-Pass Filter Tests ---"));
|
|
|
|
// Test Motion LPF
|
|
Serial.println(F("\nMotion LPF:"));
|
|
if (!sths.setMotionLowPassFilter(STHS34PF80_LPF_ODR_DIV_9)) {
|
|
halt(F("Failed to set Motion LPF"));
|
|
}
|
|
Serial.print(F(" Current setting: "));
|
|
printLPFSetting(sths.getMotionLowPassFilter());
|
|
Serial.println();
|
|
|
|
// Test Motion+Presence LPF
|
|
Serial.println(F("\nMotion+Presence LPF:"));
|
|
if (!sths.setMotionPresenceLowPassFilter(STHS34PF80_LPF_ODR_DIV_20)) {
|
|
halt(F("Failed to set Motion+Presence LPF"));
|
|
}
|
|
Serial.print(F(" Current setting: "));
|
|
printLPFSetting(sths.getMotionPresenceLowPassFilter());
|
|
Serial.println();
|
|
|
|
// Test Presence LPF
|
|
Serial.println(F("\nPresence LPF:"));
|
|
if (!sths.setPresenceLowPassFilter(STHS34PF80_LPF_ODR_DIV_50)) {
|
|
halt(F("Failed to set Presence LPF"));
|
|
}
|
|
Serial.print(F(" Current setting: "));
|
|
printLPFSetting(sths.getPresenceLowPassFilter());
|
|
Serial.println();
|
|
|
|
// Test Temperature LPF
|
|
Serial.println(F("\nTemperature LPF:"));
|
|
if (!sths.setTemperatureLowPassFilter(STHS34PF80_LPF_ODR_DIV_100)) {
|
|
halt(F("Failed to set Temperature LPF"));
|
|
}
|
|
Serial.print(F(" Current setting: "));
|
|
printLPFSetting(sths.getTemperatureLowPassFilter());
|
|
Serial.println();
|
|
|
|
// Test Ambient Temperature Averaging
|
|
Serial.println(F("\nAmbient Temperature Averaging:"));
|
|
if (!sths.setAmbTempAveraging(STHS34PF80_AVG_T_8)) {
|
|
halt(F("Failed to set Ambient Temperature Averaging"));
|
|
}
|
|
Serial.print(F(" Current: "));
|
|
switch (sths.getAmbTempAveraging()) {
|
|
case STHS34PF80_AVG_T_8: Serial.println(F("8 samples")); break;
|
|
case STHS34PF80_AVG_T_4: Serial.println(F("4 samples")); break;
|
|
case STHS34PF80_AVG_T_2: Serial.println(F("2 samples")); break;
|
|
case STHS34PF80_AVG_T_1: Serial.println(F("1 sample")); break;
|
|
default: Serial.println(F("Unknown")); break;
|
|
}
|
|
|
|
// Test Object Temperature Averaging
|
|
Serial.println(F("\nObject Temperature Averaging:"));
|
|
if (!sths.setObjAveraging(STHS34PF80_AVG_TMOS_32)) {
|
|
halt(F("Failed to set Object Temperature Averaging"));
|
|
}
|
|
Serial.print(F(" Current: "));
|
|
switch (sths.getObjAveraging()) {
|
|
case STHS34PF80_AVG_TMOS_2: Serial.println(F("2 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_8: Serial.println(F("8 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_32: Serial.println(F("32 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_128: Serial.println(F("128 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_256: Serial.println(F("256 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_512: Serial.println(F("512 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_1024: Serial.println(F("1024 samples")); break;
|
|
case STHS34PF80_AVG_TMOS_2048: Serial.println(F("2048 samples")); break;
|
|
default: Serial.println(F("Unknown")); break;
|
|
}
|
|
|
|
// Test Wide Gain Mode
|
|
Serial.println(F("\nWide Gain Mode:"));
|
|
if (!sths.setWideGainMode(false)) {
|
|
halt(F("Failed to set Wide Gain Mode"));
|
|
}
|
|
Serial.print(F(" Current: "));
|
|
if (sths.getWideGainMode()) {
|
|
Serial.println(F("Wide mode"));
|
|
} else {
|
|
Serial.println(F("Default gain mode"));
|
|
}
|
|
|
|
// Sensitivity (factory calibrated - read only)
|
|
Serial.println(F("\nSensitivity:"));
|
|
Serial.print(F(" Current: "));
|
|
Serial.println(sths.getSensitivity());
|
|
|
|
// Test Block Data Update
|
|
Serial.println(F("\nBlock Data Update:"));
|
|
if (!sths.setBlockDataUpdate(true)) {
|
|
halt(F("Failed to set Block Data Update"));
|
|
}
|
|
Serial.print(F(" Current: "));
|
|
if (sths.getBlockDataUpdate()) {
|
|
Serial.println(F("Enabled"));
|
|
} else {
|
|
Serial.println(F("Disabled"));
|
|
}
|
|
|
|
// Set Output Data Rate to continuous mode (1 Hz)
|
|
Serial.println(F("\nOutput Data Rate:"));
|
|
if (!sths.setOutputDataRate(STHS34PF80_ODR_1_HZ)) {
|
|
halt(F("Failed to set Output Data Rate"));
|
|
}
|
|
Serial.print(F(" Current: "));
|
|
switch (sths.getOutputDataRate()) {
|
|
case STHS34PF80_ODR_POWER_DOWN: Serial.println(F("Power-down")); break;
|
|
case STHS34PF80_ODR_0_25_HZ: Serial.println(F("0.25 Hz")); break;
|
|
case STHS34PF80_ODR_0_5_HZ: Serial.println(F("0.5 Hz")); break;
|
|
case STHS34PF80_ODR_1_HZ: Serial.println(F("1 Hz")); break;
|
|
case STHS34PF80_ODR_2_HZ: Serial.println(F("2 Hz")); break;
|
|
case STHS34PF80_ODR_4_HZ: Serial.println(F("4 Hz")); break;
|
|
case STHS34PF80_ODR_8_HZ: Serial.println(F("8 Hz")); break;
|
|
case STHS34PF80_ODR_15_HZ: Serial.println(F("15 Hz")); break;
|
|
case STHS34PF80_ODR_30_HZ: Serial.println(F("30 Hz")); break;
|
|
default: Serial.println(F("Unknown")); break;
|
|
}
|
|
|
|
// Test CTRL2 functions
|
|
Serial.println(F("\nEmbedded Function Page:"));
|
|
if (!sths.enableEmbeddedFuncPage(false)) {
|
|
halt(F("Failed to disable Embedded Function Page"));
|
|
}
|
|
|
|
// Only trigger one-shot if in power-down mode
|
|
if (sths.getOutputDataRate() == STHS34PF80_ODR_POWER_DOWN) {
|
|
Serial.println(F("\nTrigger One-shot:"));
|
|
if (!sths.triggerOneshot()) {
|
|
halt(F("Failed to trigger one-shot"));
|
|
}
|
|
} else {
|
|
Serial.println(F("\nContinuous mode - no one-shot trigger needed"));
|
|
}
|
|
|
|
|
|
// Configure interrupts
|
|
Serial.println(F("\nInterrupt Configuration:"));
|
|
if (!sths.setIntPolarity(false)) {
|
|
halt(F("Failed to set interrupt polarity"));
|
|
}
|
|
if (!sths.setIntOpenDrain(false)) {
|
|
halt(F("Failed to set interrupt output type"));
|
|
}
|
|
if (!sths.setIntLatched(true)) {
|
|
halt(F("Failed to set interrupt latched mode"));
|
|
}
|
|
|
|
// Enable interrupts for all three events (matches default)
|
|
uint8_t mask = STHS34PF80_PRES_FLAG | STHS34PF80_MOT_FLAG | STHS34PF80_TAMB_SHOCK_FLAG;
|
|
if (!sths.setIntMask(mask)) {
|
|
halt(F("Failed to set interrupt mask"));
|
|
}
|
|
|
|
// Set interrupt signal to INT_OR (function flags) - matches default
|
|
if (!sths.setIntSignal(STHS34PF80_INT_OR)) {
|
|
halt(F("Failed to set interrupt signal"));
|
|
}
|
|
|
|
// Print current interrupt mask status
|
|
Serial.print(F(" Current interrupt mask: 0x"));
|
|
Serial.print(sths.getIntMask(), HEX);
|
|
Serial.print(F(" ("));
|
|
uint8_t currentMask = sths.getIntMask();
|
|
if (currentMask & STHS34PF80_PRES_FLAG) Serial.print(F("PRES "));
|
|
if (currentMask & STHS34PF80_MOT_FLAG) Serial.print(F("MOT "));
|
|
if (currentMask & STHS34PF80_TAMB_SHOCK_FLAG) Serial.print(F("TAMB_SHOCK "));
|
|
Serial.println(F(")"));
|
|
|
|
// Print current interrupt signal setting
|
|
Serial.print(F(" Current interrupt signal: "));
|
|
switch (sths.getIntSignal()) {
|
|
case STHS34PF80_INT_HIGH_Z:
|
|
Serial.println(F("High-Z (disabled)"));
|
|
break;
|
|
case STHS34PF80_INT_DRDY:
|
|
Serial.println(F("Data ready"));
|
|
break;
|
|
case STHS34PF80_INT_OR:
|
|
Serial.println(F("INT_OR (function flags)"));
|
|
break;
|
|
default:
|
|
Serial.println(F("Unknown"));
|
|
break;
|
|
}
|
|
|
|
Serial.println(F("\nConfiguration complete!"));
|
|
}
|
|
|
|
void loop() {
|
|
if (sths.isDataReady()) {
|
|
Serial.print("Data ready! ");
|
|
|
|
// Check function status flags
|
|
if (sths.isPresence()) {
|
|
Serial.print("PRESENCE ");
|
|
}
|
|
if (sths.isMotion()) {
|
|
Serial.print("MOTION ");
|
|
}
|
|
if (sths.isTempShock()) {
|
|
Serial.print("TEMP_SHOCK ");
|
|
}
|
|
|
|
// Read temperature and detection data
|
|
Serial.print("Amb: ");
|
|
Serial.print(sths.readAmbientTemperature(), 2);
|
|
Serial.print("°C, Obj: ");
|
|
Serial.print(sths.readObjectTemperature());
|
|
Serial.print(", Comp: ");
|
|
Serial.print(sths.readCompensatedObjectTemperature());
|
|
Serial.print(", Pres: ");
|
|
Serial.print(sths.readPresence());
|
|
Serial.print(", Mot: ");
|
|
Serial.print(sths.readMotion());
|
|
Serial.print(", Shock: ");
|
|
Serial.print(sths.readTempShock());
|
|
Serial.println();
|
|
}
|
|
delay(100);
|
|
} |