Compare commits
10 commits
836a63d339
...
e2fd901a66
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2fd901a66 | ||
|
|
a6aba7192f | ||
|
|
45bfd32b12 | ||
|
|
2df7d9b529 | ||
|
|
22362184f8 | ||
|
|
8bd0781af7 | ||
|
|
01d2459424 | ||
|
|
cef5e156ec | ||
|
|
354bb82d86 | ||
|
|
41f1a29cae |
14 changed files with 1493 additions and 5433 deletions
|
|
@ -10,4 +10,4 @@ BinPackParameters: true
|
|||
BreakBeforeBraces: Attach
|
||||
DerivePointerAlignment: false
|
||||
PointerAlignment: Left
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesBeforeTrailingComments: 1
|
||||
|
|
|
|||
8
.github/workflows/githubci.yml
vendored
8
.github/workflows/githubci.yml
vendored
|
|
@ -7,11 +7,11 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-python@v1
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: adafruit/ci-arduino
|
||||
path: ci
|
||||
|
|
@ -25,7 +25,7 @@ jobs:
|
|||
- name: test platforms
|
||||
run: python3 ci/build_platform.py main_platforms
|
||||
|
||||
- name: doxygen
|
||||
- name: doxy
|
||||
env:
|
||||
GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }}
|
||||
PRETTYNAME : "Adafruit STHS34PF80 Arduino Library"
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ Adafruit_STHS34PF80::~Adafruit_STHS34PF80() {
|
|||
* @param wire The Wire object to be used for I2C connections
|
||||
* @return True if initialization was successful, otherwise false
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::begin(uint8_t i2c_addr, TwoWire *wire) {
|
||||
bool Adafruit_STHS34PF80::begin(uint8_t i2c_addr, TwoWire* wire) {
|
||||
if (i2c_dev) {
|
||||
delete i2c_dev;
|
||||
}
|
||||
|
|
@ -59,10 +59,64 @@ bool Adafruit_STHS34PF80::begin(uint8_t i2c_addr, TwoWire *wire) {
|
|||
return false;
|
||||
}
|
||||
|
||||
Adafruit_BusIO_Register chip_id = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_WHO_AM_I, 1);
|
||||
if (!isConnected()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (chip_id.read() != 0xD3) {
|
||||
if (!reset()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Apply recommended default settings
|
||||
if (!setObjAveraging(STHS34PF80_AVG_TMOS_32)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!setAmbTempAveraging(STHS34PF80_AVG_T_8)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!setBlockDataUpdate(true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!setOutputDataRate(STHS34PF80_ODR_1_HZ)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Check if the sensor is connected by reading device ID
|
||||
* @return True if device ID matches expected value (0xD3), false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::isConnected() {
|
||||
if (!i2c_dev) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Adafruit_BusIO_Register chip_id =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_WHO_AM_I, 1);
|
||||
|
||||
return chip_id.read() == 0xD3;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reset the sensor completely
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::reset() {
|
||||
// Reboot OTP memory
|
||||
if (!rebootOTPmemory()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Wait for sensor reset to complete
|
||||
delay(5);
|
||||
|
||||
// Reset the internal algorithm
|
||||
if (!algorithmReset()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -74,13 +128,14 @@ bool Adafruit_STHS34PF80::begin(uint8_t i2c_addr, TwoWire *wire) {
|
|||
* @param config The LPF configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setMotionLowPassFilter(sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf1_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_m_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf1_reg, 3, 0);
|
||||
|
||||
bool Adafruit_STHS34PF80::setMotionLowPassFilter(
|
||||
sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_m_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 0);
|
||||
|
||||
return lpf_m_bits.write(config);
|
||||
}
|
||||
|
||||
|
|
@ -89,12 +144,12 @@ bool Adafruit_STHS34PF80::setMotionLowPassFilter(sths34pf80_lpf_config_t config)
|
|||
* @return The current LPF configuration value
|
||||
*/
|
||||
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionLowPassFilter() {
|
||||
Adafruit_BusIO_Register lpf1_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_m_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf1_reg, 3, 0);
|
||||
|
||||
Adafruit_BusIO_Register lpf1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_m_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 0);
|
||||
|
||||
return (sths34pf80_lpf_config_t)lpf_m_bits.read();
|
||||
}
|
||||
|
||||
|
|
@ -103,13 +158,14 @@ sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionLowPassFilter() {
|
|||
* @param config The LPF configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setMotionPresenceLowPassFilter(sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf1_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_m_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf1_reg, 3, 3);
|
||||
|
||||
bool Adafruit_STHS34PF80::setMotionPresenceLowPassFilter(
|
||||
sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_m_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 3);
|
||||
|
||||
return lpf_p_m_bits.write(config);
|
||||
}
|
||||
|
||||
|
|
@ -118,12 +174,12 @@ bool Adafruit_STHS34PF80::setMotionPresenceLowPassFilter(sths34pf80_lpf_config_t
|
|||
* @return The current LPF configuration value
|
||||
*/
|
||||
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionPresenceLowPassFilter() {
|
||||
Adafruit_BusIO_Register lpf1_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_m_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf1_reg, 3, 3);
|
||||
|
||||
Adafruit_BusIO_Register lpf1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_m_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf1_reg, 3, 3);
|
||||
|
||||
return (sths34pf80_lpf_config_t)lpf_p_m_bits.read();
|
||||
}
|
||||
|
||||
|
|
@ -132,13 +188,14 @@ sths34pf80_lpf_config_t Adafruit_STHS34PF80::getMotionPresenceLowPassFilter() {
|
|||
* @param config The LPF configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setPresenceLowPassFilter(sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf2_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf2_reg, 3, 3);
|
||||
|
||||
bool Adafruit_STHS34PF80::setPresenceLowPassFilter(
|
||||
sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 3);
|
||||
|
||||
return lpf_p_bits.write(config);
|
||||
}
|
||||
|
||||
|
|
@ -147,40 +204,761 @@ bool Adafruit_STHS34PF80::setPresenceLowPassFilter(sths34pf80_lpf_config_t confi
|
|||
* @return The current LPF configuration value
|
||||
*/
|
||||
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getPresenceLowPassFilter() {
|
||||
Adafruit_BusIO_Register lpf2_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf2_reg, 3, 3);
|
||||
|
||||
Adafruit_BusIO_Register lpf2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_p_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 3);
|
||||
|
||||
return (sths34pf80_lpf_config_t)lpf_p_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set the ambient temperature shock detection low-pass filter configuration
|
||||
* @brief Set the ambient temperature shock detection low-pass filter
|
||||
* configuration
|
||||
* @param config The LPF configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setTemperatureLowPassFilter(sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf2_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_a_t_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf2_reg, 3, 0);
|
||||
|
||||
bool Adafruit_STHS34PF80::setTemperatureLowPassFilter(
|
||||
sths34pf80_lpf_config_t config) {
|
||||
Adafruit_BusIO_Register lpf2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_a_t_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 0);
|
||||
|
||||
return lpf_a_t_bits.write(config);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get the ambient temperature shock detection low-pass filter configuration
|
||||
* @brief Get the ambient temperature shock detection low-pass filter
|
||||
* configuration
|
||||
* @return The current LPF configuration value
|
||||
*/
|
||||
sths34pf80_lpf_config_t Adafruit_STHS34PF80::getTemperatureLowPassFilter() {
|
||||
Adafruit_BusIO_Register lpf2_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_a_t_bits = Adafruit_BusIO_RegisterBits(
|
||||
&lpf2_reg, 3, 0);
|
||||
|
||||
Adafruit_BusIO_Register lpf2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_LPF2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits lpf_a_t_bits =
|
||||
Adafruit_BusIO_RegisterBits(&lpf2_reg, 3, 0);
|
||||
|
||||
return (sths34pf80_lpf_config_t)lpf_a_t_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set ambient temperature averaging configuration
|
||||
* @param config The averaging configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setAmbTempAveraging(sths34pf80_avg_t_t config) {
|
||||
Adafruit_BusIO_Register avg_trim_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits avg_t_bits =
|
||||
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 2, 4);
|
||||
|
||||
return avg_t_bits.write(config);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get ambient temperature averaging configuration
|
||||
* @return The current averaging configuration value
|
||||
*/
|
||||
sths34pf80_avg_t_t Adafruit_STHS34PF80::getAmbTempAveraging() {
|
||||
Adafruit_BusIO_Register avg_trim_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits avg_t_bits =
|
||||
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 2, 4);
|
||||
|
||||
return (sths34pf80_avg_t_t)avg_t_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set object temperature averaging configuration
|
||||
* @param config The averaging configuration value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setObjAveraging(sths34pf80_avg_tmos_t config) {
|
||||
Adafruit_BusIO_Register avg_trim_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits avg_tmos_bits =
|
||||
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 3, 0);
|
||||
|
||||
return avg_tmos_bits.write(config);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get object temperature averaging configuration
|
||||
* @return The current averaging configuration value
|
||||
*/
|
||||
sths34pf80_avg_tmos_t Adafruit_STHS34PF80::getObjAveraging() {
|
||||
Adafruit_BusIO_Register avg_trim_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_AVG_TRIM, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits avg_tmos_bits =
|
||||
Adafruit_BusIO_RegisterBits(&avg_trim_reg, 3, 0);
|
||||
|
||||
return (sths34pf80_avg_tmos_t)avg_tmos_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set wide gain mode configuration
|
||||
* @param wide_mode True for wide mode, false for default gain mode
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setWideGainMode(bool wide_mode) {
|
||||
Adafruit_BusIO_Register ctrl0_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL0, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits gain_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl0_reg, 3, 4);
|
||||
|
||||
return gain_bits.write(wide_mode ? 0x00 : 0x07);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get wide gain mode configuration
|
||||
* @return True if in wide mode, false if in default gain mode
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::getWideGainMode() {
|
||||
Adafruit_BusIO_Register ctrl0_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL0, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits gain_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl0_reg, 3, 4);
|
||||
|
||||
return gain_bits.read() == 0x00;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set sensitivity value for ambient temperature compensation
|
||||
* @param sensitivity Signed 8-bit sensitivity value (two's complement)
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setSensitivity(int8_t sensitivity) {
|
||||
Adafruit_BusIO_Register sens_data_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_SENS_DATA, 1);
|
||||
|
||||
return sens_data_reg.write((uint8_t)sensitivity);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get sensitivity value for ambient temperature compensation
|
||||
* @return Signed 8-bit sensitivity value (two's complement)
|
||||
*/
|
||||
int8_t Adafruit_STHS34PF80::getSensitivity() {
|
||||
Adafruit_BusIO_Register sens_data_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_SENS_DATA, 1);
|
||||
|
||||
return (int8_t)sens_data_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set block data update configuration
|
||||
* @param enable True to enable block data update, false to disable
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setBlockDataUpdate(bool enable) {
|
||||
Adafruit_BusIO_Register ctrl1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits bdu_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 1, 4);
|
||||
|
||||
return bdu_bit.write(enable ? 1 : 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get block data update configuration
|
||||
* @return True if block data update is enabled, false if disabled
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::getBlockDataUpdate() {
|
||||
Adafruit_BusIO_Register ctrl1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits bdu_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 1, 4);
|
||||
|
||||
return bdu_bit.read() == 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set output data rate configuration with validation
|
||||
* Ported from: sths34pf80_tmos_odr_set
|
||||
* @param odr The output data rate value
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setOutputDataRate(sths34pf80_odr_t odr) {
|
||||
// sths34pf80_ctrl1_t ctrl1;
|
||||
// sths34pf80_avg_trim_t avg_trim;
|
||||
// sths34pf80_tmos_odr_t max_odr = STHS34PF80_TMOS_ODR_AT_30Hz;
|
||||
// int32_t ret;
|
||||
if (!i2c_dev) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sths34pf80_odr_t max_odr = STHS34PF80_ODR_30_HZ;
|
||||
sths34pf80_odr_t current_odr = getOutputDataRate();
|
||||
|
||||
// ret = sths34pf80_read_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
||||
// if (ret == 0)
|
||||
// {
|
||||
// ret = sths34pf80_read_reg(ctx, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim,
|
||||
// 1);
|
||||
sths34pf80_avg_tmos_t avg_tmos = getObjAveraging();
|
||||
|
||||
// switch(avg_trim.avg_tmos)
|
||||
// {
|
||||
switch (avg_tmos) {
|
||||
// default:
|
||||
// case STHS34PF80_AVG_TMOS_2:
|
||||
// case STHS34PF80_AVG_TMOS_8:
|
||||
// case STHS34PF80_AVG_TMOS_32:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_30Hz;
|
||||
// break;
|
||||
default:
|
||||
case STHS34PF80_AVG_TMOS_2:
|
||||
case STHS34PF80_AVG_TMOS_8:
|
||||
case STHS34PF80_AVG_TMOS_32:
|
||||
max_odr = STHS34PF80_ODR_30_HZ;
|
||||
break;
|
||||
// case STHS34PF80_AVG_TMOS_128:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_8Hz;
|
||||
// break;
|
||||
case STHS34PF80_AVG_TMOS_128:
|
||||
max_odr = STHS34PF80_ODR_8_HZ;
|
||||
break;
|
||||
// case STHS34PF80_AVG_TMOS_256:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_4Hz;
|
||||
// break;
|
||||
case STHS34PF80_AVG_TMOS_256:
|
||||
max_odr = STHS34PF80_ODR_4_HZ;
|
||||
break;
|
||||
// case STHS34PF80_AVG_TMOS_512:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_2Hz;
|
||||
// break;
|
||||
case STHS34PF80_AVG_TMOS_512:
|
||||
max_odr = STHS34PF80_ODR_2_HZ;
|
||||
break;
|
||||
// case STHS34PF80_AVG_TMOS_1024:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_1Hz;
|
||||
// break;
|
||||
case STHS34PF80_AVG_TMOS_1024:
|
||||
max_odr = STHS34PF80_ODR_1_HZ;
|
||||
break;
|
||||
// case STHS34PF80_AVG_TMOS_2048:
|
||||
// max_odr = STHS34PF80_TMOS_ODR_AT_0Hz50;
|
||||
// break;
|
||||
case STHS34PF80_AVG_TMOS_2048:
|
||||
max_odr = STHS34PF80_ODR_0_5_HZ;
|
||||
break;
|
||||
}
|
||||
|
||||
// if (ret == 0)
|
||||
// {
|
||||
// if (val > max_odr)
|
||||
// {
|
||||
// return -1;
|
||||
// }
|
||||
if (odr > max_odr) {
|
||||
return false; // Requested ODR exceeds maximum for current averaging setting
|
||||
}
|
||||
|
||||
// ret = sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, (uint8_t)val);
|
||||
// }
|
||||
return safeSetOutputDataRate(current_odr, odr);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get output data rate configuration
|
||||
* @return The current output data rate value
|
||||
*/
|
||||
sths34pf80_odr_t Adafruit_STHS34PF80::getOutputDataRate() {
|
||||
Adafruit_BusIO_Register ctrl1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits odr_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 4, 0);
|
||||
|
||||
return (sths34pf80_odr_t)odr_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Reboot OTP memory
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::rebootOTPmemory() {
|
||||
Adafruit_BusIO_Register ctrl2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits boot_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 7);
|
||||
|
||||
return boot_bit.write(1);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Enable or disable embedded function page access
|
||||
* @param enable True to enable embedded function page, false to disable
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::enableEmbeddedFuncPage(bool enable) {
|
||||
Adafruit_BusIO_Register ctrl2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits func_cfg_access_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 4);
|
||||
|
||||
return func_cfg_access_bit.write(enable ? 1 : 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Trigger one-shot measurement
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::triggerOneshot() {
|
||||
Adafruit_BusIO_Register ctrl2_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL2, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits oneshot_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl2_reg, 1, 0);
|
||||
|
||||
return oneshot_bit.write(1);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set interrupt polarity
|
||||
* @param active_low True for active low (default), false for active high
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setIntPolarity(bool active_low) {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits int_h_l_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 7);
|
||||
|
||||
return int_h_l_bit.write(active_low ? 1 : 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set interrupt output type
|
||||
* @param open_drain True for open drain, false for push-pull (default)
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setIntOpenDrain(bool open_drain) {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits pp_od_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 6);
|
||||
|
||||
return pp_od_bit.write(open_drain ? 1 : 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set interrupt latched mode
|
||||
* @param latched True for latched mode, false for pulsed mode (default)
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setIntLatched(bool latched) {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits int_latched_bit =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 1, 2);
|
||||
|
||||
return int_latched_bit.write(latched ? 1 : 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set interrupt mask for function status flags
|
||||
* @param mask Interrupt mask (bits 2:0 for PRES_FLAG, MOT_FLAG,
|
||||
* TAMB_SHOCK_FLAG)
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setIntMask(uint8_t mask) {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits int_mask_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 3, 3);
|
||||
|
||||
return int_mask_bits.write(mask & 0x07);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get interrupt mask for function status flags
|
||||
* @return Current interrupt mask value (bits 2:0 for PRES_FLAG, MOT_FLAG,
|
||||
* TAMB_SHOCK_FLAG)
|
||||
*/
|
||||
uint8_t Adafruit_STHS34PF80::getIntMask() {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits int_mask_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 3, 3);
|
||||
|
||||
return int_mask_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Set interrupt signal type
|
||||
* @param signal Interrupt signal type (HIGH_Z, DRDY, or INT_OR)
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::setIntSignal(sths34pf80_int_signal_t signal) {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits ien_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 2, 0);
|
||||
|
||||
return ien_bits.write(signal);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Get interrupt signal type
|
||||
* @return Current interrupt signal type
|
||||
*/
|
||||
sths34pf80_int_signal_t Adafruit_STHS34PF80::getIntSignal() {
|
||||
Adafruit_BusIO_Register ctrl3_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL3, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits ien_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl3_reg, 2, 0);
|
||||
|
||||
return (sths34pf80_int_signal_t)ien_bits.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Check if new data is ready
|
||||
* @return True if new data is available, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::isDataReady() {
|
||||
Adafruit_BusIO_Register status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_STATUS, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits drdy_bit =
|
||||
Adafruit_BusIO_RegisterBits(&status_reg, 1, 2);
|
||||
|
||||
return drdy_bit.read() == 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Check if presence detection flag is set
|
||||
* @return True if presence is detected, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::isPresence() {
|
||||
Adafruit_BusIO_Register func_status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits pres_flag_bit =
|
||||
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 2);
|
||||
|
||||
return pres_flag_bit.read() == 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Check if motion detection flag is set
|
||||
* @return True if motion is detected, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::isMotion() {
|
||||
Adafruit_BusIO_Register func_status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits mot_flag_bit =
|
||||
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 1);
|
||||
|
||||
return mot_flag_bit.read() == 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Check if ambient temperature shock flag is set
|
||||
* @return True if temperature shock is detected, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::isTempShock() {
|
||||
Adafruit_BusIO_Register func_status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits tamb_shock_flag_bit =
|
||||
Adafruit_BusIO_RegisterBits(&func_status_reg, 1, 0);
|
||||
|
||||
return tamb_shock_flag_bit.read() == 1;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read object temperature raw value
|
||||
* @return 16-bit signed object temperature value
|
||||
*/
|
||||
int16_t Adafruit_STHS34PF80::readObjectTemperature() {
|
||||
Adafruit_BusIO_Register tobj_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TOBJECT_L, 2, LSBFIRST);
|
||||
|
||||
return (int16_t)tobj_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read ambient temperature in degrees Celsius
|
||||
* @return Ambient temperature in degrees Celsius
|
||||
*/
|
||||
float Adafruit_STHS34PF80::readAmbientTemperature() {
|
||||
Adafruit_BusIO_Register tamb_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TAMBIENT_L, 2, LSBFIRST);
|
||||
|
||||
int16_t raw_temp = (int16_t)tamb_reg.read();
|
||||
return raw_temp / 100.0f;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read compensated object temperature raw value
|
||||
* @return 16-bit signed compensated object temperature value
|
||||
*/
|
||||
int16_t Adafruit_STHS34PF80::readCompensatedObjectTemperature() {
|
||||
Adafruit_BusIO_Register tobj_comp_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TOBJ_COMP_L, 2, LSBFIRST);
|
||||
|
||||
return (int16_t)tobj_comp_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read presence detection raw value
|
||||
* @return 16-bit signed presence detection value
|
||||
*/
|
||||
int16_t Adafruit_STHS34PF80::readPresence() {
|
||||
Adafruit_BusIO_Register tpres_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TPRESENCE_L, 2, LSBFIRST);
|
||||
|
||||
return (int16_t)tpres_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read motion detection raw value
|
||||
* @return 16-bit signed motion detection value
|
||||
*/
|
||||
int16_t Adafruit_STHS34PF80::readMotion() {
|
||||
Adafruit_BusIO_Register tmot_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_TMOTION_L, 2, LSBFIRST);
|
||||
|
||||
return (int16_t)tmot_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read ambient temperature shock detection raw value
|
||||
* @return 16-bit signed ambient temperature shock detection value
|
||||
*/
|
||||
int16_t Adafruit_STHS34PF80::readTempShock() {
|
||||
Adafruit_BusIO_Register tamb_shock_reg = Adafruit_BusIO_Register(
|
||||
i2c_dev, STHS34PF80_REG_TAMB_SHOCK_L, 2, LSBFIRST);
|
||||
|
||||
return (int16_t)tamb_shock_reg.read();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Write data to embedded function registers
|
||||
* Ported from: sths34pf80_func_cfg_write
|
||||
* @param addr Embedded function register address
|
||||
* @param data Pointer to data to write
|
||||
* @param len Number of bytes to write
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::writeEmbeddedFunction(uint8_t addr, uint8_t* data,
|
||||
uint8_t len) {
|
||||
// sths34pf80_ctrl1_t ctrl1;
|
||||
// uint8_t odr;
|
||||
// sths34pf80_page_rw_t page_rw = {0};
|
||||
// int32_t ret;
|
||||
// uint8_t i;
|
||||
if (!i2c_dev) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Save current odr and enter PD mode */
|
||||
// ret = sths34pf80_read_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
||||
// odr = ctrl1.odr;
|
||||
// ret += sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, 0);
|
||||
sths34pf80_odr_t current_odr = getOutputDataRate();
|
||||
if (!safeSetOutputDataRate(current_odr, STHS34PF80_ODR_POWER_DOWN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Enable access to embedded functions register */
|
||||
// ret += sths34pf80_mem_bank_set(ctx, STHS34PF80_EMBED_FUNC_MEM_BANK);
|
||||
if (!enableEmbeddedFuncPage(true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Enable write mode */
|
||||
// page_rw.func_cfg_write = 1;
|
||||
// ret += sths34pf80_write_reg(ctx, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw,
|
||||
// 1);
|
||||
Adafruit_BusIO_Register page_rw_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_PAGE_RW, 1);
|
||||
Adafruit_BusIO_RegisterBits func_cfg_write_bit =
|
||||
Adafruit_BusIO_RegisterBits(&page_rw_reg, 1, 6);
|
||||
if (!func_cfg_write_bit.write(1)) {
|
||||
enableEmbeddedFuncPage(false);
|
||||
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Select register address (it will autoincrement after each write) */
|
||||
// ret += sths34pf80_write_reg(ctx, STHS34PF80_FUNC_CFG_ADDR, &addr, 1);
|
||||
Adafruit_BusIO_Register func_cfg_addr_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_CFG_ADDR, 1);
|
||||
if (!func_cfg_addr_reg.write(addr)) {
|
||||
func_cfg_write_bit.write(0);
|
||||
enableEmbeddedFuncPage(false);
|
||||
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Write data */
|
||||
// for (i = 0; i < len; i++) {
|
||||
// ret += sths34pf80_write_reg(ctx, STHS34PF80_FUNC_CFG_DATA, &data[i], 1);
|
||||
// }
|
||||
Adafruit_BusIO_Register func_cfg_data_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_CFG_DATA, 1);
|
||||
for (uint8_t i = 0; i < len; i++) {
|
||||
if (!func_cfg_data_reg.write(data[i])) {
|
||||
func_cfg_write_bit.write(0);
|
||||
enableEmbeddedFuncPage(false);
|
||||
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// /* Disable write mode */
|
||||
// page_rw.func_cfg_write = 0;
|
||||
// ret += sths34pf80_write_reg(ctx, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw,
|
||||
// 1);
|
||||
if (!func_cfg_write_bit.write(0)) {
|
||||
enableEmbeddedFuncPage(false);
|
||||
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Disable access to embedded functions register */
|
||||
// ret += sths34pf80_mem_bank_set(ctx, STHS34PF80_MAIN_MEM_BANK);
|
||||
if (!enableEmbeddedFuncPage(false)) {
|
||||
safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr);
|
||||
return false;
|
||||
}
|
||||
|
||||
// /* Restore odr */
|
||||
// ret += sths34pf80_tmos_odr_check_safe_set(ctx, ctrl1, odr);
|
||||
if (!safeSetOutputDataRate(STHS34PF80_ODR_POWER_DOWN, current_odr)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// return ret;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Algorithm reset procedure
|
||||
* Ported from: sths34pf80_algo_reset
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::algorithmReset() {
|
||||
// tmp = 1;
|
||||
// ret = sths34pf80_func_cfg_write(ctx, STHS34PF80_RESET_ALGO, &tmp, 1);
|
||||
uint8_t reset_value = 1;
|
||||
return writeEmbeddedFunction(STHS34PF80_EMBEDDED_RESET_ALGO, &reset_value, 1);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Safe ODR setting with proper algorithm reset and power-down procedures
|
||||
* Ported from: sths34pf80_tmos_odr_check_safe_set
|
||||
* @param current_odr The current output data rate
|
||||
* @param new_odr The new output data rate to set
|
||||
* @return True if successful, false otherwise
|
||||
*/
|
||||
bool Adafruit_STHS34PF80::safeSetOutputDataRate(sths34pf80_odr_t current_odr,
|
||||
sths34pf80_odr_t new_odr) {
|
||||
// sths34pf80_func_status_t func_status;
|
||||
// sths34pf80_tmos_drdy_status_t status;
|
||||
// int32_t ret = 0;
|
||||
if (!i2c_dev) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Adafruit_BusIO_Register ctrl1_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_CTRL1, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits odr_bits =
|
||||
Adafruit_BusIO_RegisterBits(&ctrl1_reg, 4, 0);
|
||||
|
||||
// if (odr_new > 0U) {
|
||||
if (new_odr > STHS34PF80_ODR_POWER_DOWN) {
|
||||
/*
|
||||
* Do a clean reset algo procedure everytime odr is changed to an
|
||||
* operative state.
|
||||
*/
|
||||
// ctrl1.odr = 0;
|
||||
// ret = sths34pf80_write_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
|
||||
if (!odr_bits.write(STHS34PF80_ODR_POWER_DOWN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// ret += sths34pf80_algo_reset(ctx);
|
||||
if (!algorithmReset()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* if we need to go to power-down from an operative state
|
||||
* perform the safe power-down.
|
||||
*/
|
||||
// if ((uint8_t)ctrl1.odr > 0U) {
|
||||
if (current_odr > STHS34PF80_ODR_POWER_DOWN) {
|
||||
/* reset the DRDY bit */
|
||||
// ret = sths34pf80_read_reg(ctx, STHS34PF80_FUNC_STATUS, (uint8_t
|
||||
// *)&func_status, 1);
|
||||
Adafruit_BusIO_Register func_status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_FUNC_STATUS, 1);
|
||||
func_status_reg.read(); // Reading clears the DRDY bit
|
||||
|
||||
/* wait DRDY bit go to '1' */
|
||||
// do {
|
||||
// ret += sths34pf80_tmos_drdy_status_get(ctx, &status);
|
||||
// } while (status.drdy != 0U);
|
||||
Adafruit_BusIO_Register status_reg =
|
||||
Adafruit_BusIO_Register(i2c_dev, STHS34PF80_REG_STATUS, 1);
|
||||
|
||||
Adafruit_BusIO_RegisterBits drdy_bit =
|
||||
Adafruit_BusIO_RegisterBits(&status_reg, 1, 2);
|
||||
|
||||
uint32_t timeout = 1000; // 1 second timeout
|
||||
while (timeout-- > 0) {
|
||||
if (drdy_bit.read() == 1) {
|
||||
break;
|
||||
}
|
||||
delay(1);
|
||||
}
|
||||
|
||||
// Continue even if DRDY timeout occurs
|
||||
// if (timeout == 0) {
|
||||
// return false; // Timeout waiting for DRDY
|
||||
// }
|
||||
|
||||
/* set ODR to 0 */
|
||||
// ctrl1.odr = 0;
|
||||
// ret += sths34pf80_write_reg(ctx, STHS34PF80_CTRL1, (uint8_t *)&ctrl1,
|
||||
// 1);
|
||||
if (!odr_bits.write(STHS34PF80_ODR_POWER_DOWN)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* reset the DRDY bit */
|
||||
// ret += sths34pf80_read_reg(ctx, STHS34PF80_FUNC_STATUS, (uint8_t
|
||||
// *)&func_status, 1);
|
||||
func_status_reg.read(); // Reading clears the DRDY bit again
|
||||
}
|
||||
}
|
||||
|
||||
// Final ODR set (implied from original function usage context)
|
||||
return odr_bits.write(new_odr);
|
||||
}
|
||||
|
|
@ -21,36 +21,56 @@
|
|||
#ifndef __ADAFRUIT_STHS34PF80_H__
|
||||
#define __ADAFRUIT_STHS34PF80_H__
|
||||
|
||||
#include "Arduino.h"
|
||||
#include <Adafruit_BusIO_Register.h>
|
||||
#include <Adafruit_I2CDevice.h>
|
||||
#include <Wire.h>
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#define STHS34PF80_DEFAULT_ADDR 0x5A ///< Default I2C address for the STHS34PF80
|
||||
|
||||
#define STHS34PF80_REG_LPF1 0x0C ///< Low-pass filter configuration 1 register
|
||||
#define STHS34PF80_REG_LPF2 0x0D ///< Low-pass filter configuration 2 register
|
||||
#define STHS34PF80_REG_WHO_AM_I 0x0F ///< Device identification register
|
||||
#define STHS34PF80_REG_AVG_TRIM 0x10 ///< Averaging configuration register
|
||||
#define STHS34PF80_REG_CTRL0 0x17 ///< Control register 0 (gain mode)
|
||||
#define STHS34PF80_REG_WHO_AM_I 0x0F ///< Device identification register
|
||||
#define STHS34PF80_REG_AVG_TRIM 0x10 ///< Averaging configuration register
|
||||
#define STHS34PF80_REG_CTRL0 0x17 ///< Control register 0 (gain mode)
|
||||
#define STHS34PF80_REG_SENS_DATA 0x1D ///< Sensitivity data register
|
||||
#define STHS34PF80_REG_CTRL1 0x20 ///< Control register 1 (ODR configuration)
|
||||
#define STHS34PF80_REG_CTRL2 0x21 ///< Control register 2 (boot, function access, one-shot)
|
||||
#define STHS34PF80_REG_CTRL3 0x22 ///< Control register 3 (interrupt configuration)
|
||||
#define STHS34PF80_REG_STATUS 0x23 ///< Status register
|
||||
#define STHS34PF80_REG_CTRL2 \
|
||||
0x21 ///< Control register 2 (boot, function access, one-shot)
|
||||
#define STHS34PF80_REG_CTRL3 \
|
||||
0x22 ///< Control register 3 (interrupt configuration)
|
||||
#define STHS34PF80_REG_STATUS 0x23 ///< Status register
|
||||
#define STHS34PF80_REG_FUNC_STATUS 0x25 ///< Function status register
|
||||
#define STHS34PF80_REG_TOBJECT_L 0x26 ///< Object temperature LSB register
|
||||
#define STHS34PF80_REG_TOBJECT_H 0x27 ///< Object temperature MSB register
|
||||
#define STHS34PF80_REG_TAMBIENT_L 0x28 ///< Ambient temperature LSB register
|
||||
#define STHS34PF80_REG_TAMBIENT_H 0x29 ///< Ambient temperature MSB register
|
||||
#define STHS34PF80_REG_TOBJ_COMP_L 0x38 ///< Compensated object temperature LSB register
|
||||
#define STHS34PF80_REG_TOBJ_COMP_H 0x39 ///< Compensated object temperature MSB register
|
||||
#define STHS34PF80_REG_TOBJECT_L 0x26 ///< Object temperature LSB register
|
||||
#define STHS34PF80_REG_TOBJECT_H 0x27 ///< Object temperature MSB register
|
||||
#define STHS34PF80_REG_TAMBIENT_L 0x28 ///< Ambient temperature LSB register
|
||||
#define STHS34PF80_REG_TAMBIENT_H 0x29 ///< Ambient temperature MSB register
|
||||
#define STHS34PF80_REG_TOBJ_COMP_L \
|
||||
0x38 ///< Compensated object temperature LSB register
|
||||
#define STHS34PF80_REG_TOBJ_COMP_H \
|
||||
0x39 ///< Compensated object temperature MSB register
|
||||
#define STHS34PF80_REG_TPRESENCE_L 0x3A ///< Presence detection LSB register
|
||||
#define STHS34PF80_REG_TPRESENCE_H 0x3B ///< Presence detection MSB register
|
||||
#define STHS34PF80_REG_TMOTION_L 0x3C ///< Motion detection LSB register
|
||||
#define STHS34PF80_REG_TMOTION_H 0x3D ///< Motion detection MSB register
|
||||
#define STHS34PF80_REG_TAMB_SHOCK_L 0x3E ///< Ambient shock detection LSB register
|
||||
#define STHS34PF80_REG_TAMB_SHOCK_H 0x3F ///< Ambient shock detection MSB register
|
||||
#define STHS34PF80_REG_TMOTION_L 0x3C ///< Motion detection LSB register
|
||||
#define STHS34PF80_REG_TMOTION_H 0x3D ///< Motion detection MSB register
|
||||
#define STHS34PF80_REG_TAMB_SHOCK_L \
|
||||
0x3E ///< Ambient shock detection LSB register
|
||||
#define STHS34PF80_REG_TAMB_SHOCK_H \
|
||||
0x3F ///< Ambient shock detection MSB register
|
||||
|
||||
#define STHS34PF80_REG_FUNC_CFG_ADDR \
|
||||
0x08 ///< Embedded function configuration address register
|
||||
#define STHS34PF80_REG_FUNC_CFG_DATA \
|
||||
0x09 ///< Embedded function configuration data register
|
||||
#define STHS34PF80_REG_PAGE_RW 0x11 ///< Page read/write control register
|
||||
|
||||
#define STHS34PF80_EMBEDDED_RESET_ALGO \
|
||||
0x2A ///< Embedded function RESET_ALGO register address
|
||||
|
||||
#define STHS34PF80_PRES_FLAG 0x04 ///< Presence detection flag
|
||||
#define STHS34PF80_MOT_FLAG 0x02 ///< Motion detection flag
|
||||
#define STHS34PF80_TAMB_SHOCK_FLAG 0x01 ///< Ambient temperature shock flag
|
||||
|
||||
/*!
|
||||
* @brief Low-pass filter configuration options
|
||||
|
|
@ -66,14 +86,65 @@ typedef enum {
|
|||
} sths34pf80_lpf_config_t;
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions for interacting with the STHS34PF80
|
||||
* @brief Ambient temperature averaging options
|
||||
*/
|
||||
typedef enum {
|
||||
STHS34PF80_AVG_T_8 = 0x00, ///< 8 samples (default)
|
||||
STHS34PF80_AVG_T_4 = 0x01, ///< 4 samples
|
||||
STHS34PF80_AVG_T_2 = 0x02, ///< 2 samples
|
||||
STHS34PF80_AVG_T_1 = 0x03, ///< 1 sample
|
||||
} sths34pf80_avg_t_t;
|
||||
|
||||
/*!
|
||||
* @brief Object temperature averaging options
|
||||
*/
|
||||
typedef enum {
|
||||
STHS34PF80_AVG_TMOS_2 = 0x00, ///< 2 samples
|
||||
STHS34PF80_AVG_TMOS_8 = 0x01, ///< 8 samples
|
||||
STHS34PF80_AVG_TMOS_32 = 0x02, ///< 32 samples
|
||||
STHS34PF80_AVG_TMOS_128 = 0x03, ///< 128 samples (default)
|
||||
STHS34PF80_AVG_TMOS_256 = 0x04, ///< 256 samples
|
||||
STHS34PF80_AVG_TMOS_512 = 0x05, ///< 512 samples
|
||||
STHS34PF80_AVG_TMOS_1024 = 0x06, ///< 1024 samples
|
||||
STHS34PF80_AVG_TMOS_2048 = 0x07, ///< 2048 samples
|
||||
} sths34pf80_avg_tmos_t;
|
||||
|
||||
/*!
|
||||
* @brief Output data rate options
|
||||
*/
|
||||
typedef enum {
|
||||
STHS34PF80_ODR_POWER_DOWN = 0x00, ///< Power-down mode
|
||||
STHS34PF80_ODR_0_25_HZ = 0x01, ///< 0.25 Hz
|
||||
STHS34PF80_ODR_0_5_HZ = 0x02, ///< 0.5 Hz
|
||||
STHS34PF80_ODR_1_HZ = 0x03, ///< 1 Hz
|
||||
STHS34PF80_ODR_2_HZ = 0x04, ///< 2 Hz
|
||||
STHS34PF80_ODR_4_HZ = 0x05, ///< 4 Hz
|
||||
STHS34PF80_ODR_8_HZ = 0x06, ///< 8 Hz
|
||||
STHS34PF80_ODR_15_HZ = 0x07, ///< 15 Hz
|
||||
STHS34PF80_ODR_30_HZ = 0x08, ///< 30 Hz (1xxx)
|
||||
} sths34pf80_odr_t;
|
||||
|
||||
/*!
|
||||
* @brief Interrupt enable signal options
|
||||
*/
|
||||
typedef enum {
|
||||
STHS34PF80_INT_HIGH_Z = 0x00, ///< High-Z (disabled)
|
||||
STHS34PF80_INT_DRDY = 0x01, ///< Data ready
|
||||
STHS34PF80_INT_OR = 0x02, ///< INT_OR (function flags)
|
||||
} sths34pf80_int_signal_t;
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions for interacting with the
|
||||
* STHS34PF80
|
||||
*/
|
||||
class Adafruit_STHS34PF80 {
|
||||
public:
|
||||
public:
|
||||
Adafruit_STHS34PF80();
|
||||
~Adafruit_STHS34PF80();
|
||||
|
||||
bool begin(uint8_t i2c_addr = STHS34PF80_DEFAULT_ADDR, TwoWire *wire = &Wire);
|
||||
bool begin(uint8_t i2c_addr = STHS34PF80_DEFAULT_ADDR, TwoWire* wire = &Wire);
|
||||
bool isConnected();
|
||||
bool reset();
|
||||
|
||||
bool setMotionLowPassFilter(sths34pf80_lpf_config_t config);
|
||||
sths34pf80_lpf_config_t getMotionLowPassFilter();
|
||||
|
|
@ -84,8 +155,53 @@ public:
|
|||
bool setTemperatureLowPassFilter(sths34pf80_lpf_config_t config);
|
||||
sths34pf80_lpf_config_t getTemperatureLowPassFilter();
|
||||
|
||||
private:
|
||||
Adafruit_I2CDevice *i2c_dev;
|
||||
bool setAmbTempAveraging(sths34pf80_avg_t_t config);
|
||||
sths34pf80_avg_t_t getAmbTempAveraging();
|
||||
bool setObjAveraging(sths34pf80_avg_tmos_t config);
|
||||
sths34pf80_avg_tmos_t getObjAveraging();
|
||||
|
||||
bool setWideGainMode(bool wide_mode);
|
||||
bool getWideGainMode();
|
||||
|
||||
bool setSensitivity(int8_t sensitivity);
|
||||
int8_t getSensitivity();
|
||||
|
||||
bool setBlockDataUpdate(bool enable);
|
||||
bool getBlockDataUpdate();
|
||||
bool setOutputDataRate(sths34pf80_odr_t odr);
|
||||
sths34pf80_odr_t getOutputDataRate();
|
||||
|
||||
bool rebootOTPmemory();
|
||||
bool enableEmbeddedFuncPage(bool enable);
|
||||
bool triggerOneshot();
|
||||
|
||||
bool writeEmbeddedFunction(uint8_t addr, uint8_t* data, uint8_t len);
|
||||
|
||||
bool setIntPolarity(bool active_low);
|
||||
bool setIntOpenDrain(bool open_drain);
|
||||
bool setIntLatched(bool latched);
|
||||
bool setIntMask(uint8_t mask);
|
||||
uint8_t getIntMask();
|
||||
bool setIntSignal(sths34pf80_int_signal_t signal);
|
||||
sths34pf80_int_signal_t getIntSignal();
|
||||
|
||||
bool isDataReady();
|
||||
bool isPresence();
|
||||
bool isMotion();
|
||||
bool isTempShock();
|
||||
|
||||
int16_t readObjectTemperature();
|
||||
float readAmbientTemperature();
|
||||
int16_t readCompensatedObjectTemperature();
|
||||
int16_t readPresence();
|
||||
int16_t readMotion();
|
||||
int16_t readTempShock();
|
||||
|
||||
private:
|
||||
Adafruit_I2CDevice* i2c_dev;
|
||||
bool safeSetOutputDataRate(sths34pf80_odr_t current_odr,
|
||||
sths34pf80_odr_t new_odr);
|
||||
bool algorithmReset(); // TODO: Implement algorithm reset procedure
|
||||
};
|
||||
|
||||
#endif
|
||||
135
CODE_OF_CONDUCT.md
Normal file
135
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
<!--
|
||||
SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
|
||||
SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
|
||||
SPDX-License-Identifier: CC-BY-4.0
|
||||
-->
|
||||
|
||||
# Adafruit Community Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and leaders pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level or type of
|
||||
experience, education, socio-economic status, nationality, personal appearance,
|
||||
race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
We are committed to providing a friendly, safe and welcoming environment for
|
||||
all.
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Be kind and courteous to others
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Collaborating with other community members
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and sexual attention or advances
|
||||
* The use of inappropriate images, including in a community member's avatar
|
||||
* The use of inappropriate language, including in a community member's nickname
|
||||
* Any spamming, flaming, baiting or other attention-stealing behavior
|
||||
* Excessive or unwelcome helping; answering outside the scope of the question
|
||||
asked
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Promoting or spreading disinformation, lies, or conspiracy theories against
|
||||
a person, group, organisation, project, or community
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate
|
||||
|
||||
The goal of the standards and moderation guidelines outlined here is to build
|
||||
and maintain a respectful community. We ask that you don’t just aim to be
|
||||
"technically unimpeachable", but rather try to be your best self.
|
||||
|
||||
We value many things beyond technical expertise, including collaboration and
|
||||
supporting others within our community. Providing a positive experience for
|
||||
other community members can have a much more significant impact than simply
|
||||
providing the correct answer.
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project leaders are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project leaders have the right and responsibility to remove, edit, or
|
||||
reject messages, comments, commits, code, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any community member for other behaviors that they deem
|
||||
inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Moderation
|
||||
|
||||
Instances of behaviors that violate the Adafruit Community Code of Conduct
|
||||
may be reported by any member of the community. Community members are
|
||||
encouraged to report these situations, including situations they witness
|
||||
involving other community members.
|
||||
|
||||
You may report in the following ways:
|
||||
|
||||
In any situation, you may send an email to <support@adafruit.com>.
|
||||
|
||||
On the Adafruit Discord, you may send an open message from any channel
|
||||
to all Community Moderators by tagging @community moderators. You may
|
||||
also send an open message from any channel, or a direct message to
|
||||
@kattni#1507, @tannewt#4653, @Dan Halbert#1614, @cater#2442,
|
||||
@sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175.
|
||||
|
||||
Email and direct message reports will be kept confidential.
|
||||
|
||||
In situations on Discord where the issue is particularly egregious, possibly
|
||||
illegal, requires immediate action, or violates the Discord terms of service,
|
||||
you should also report the message directly to Discord.
|
||||
|
||||
These are the steps for upholding our community’s standards of conduct.
|
||||
|
||||
1. Any member of the community may report any situation that violates the
|
||||
Adafruit Community Code of Conduct. All reports will be reviewed and
|
||||
investigated.
|
||||
2. If the behavior is an egregious violation, the community member who
|
||||
committed the violation may be banned immediately, without warning.
|
||||
3. Otherwise, moderators will first respond to such behavior with a warning.
|
||||
4. Moderators follow a soft "three strikes" policy - the community member may
|
||||
be given another chance, if they are receptive to the warning and change their
|
||||
behavior.
|
||||
5. If the community member is unreceptive or unreasonable when warned by a
|
||||
moderator, or the warning goes unheeded, they may be banned for a first or
|
||||
second offense. Repeated offenses will result in the community member being
|
||||
banned.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct and the enforcement policies listed above apply to all
|
||||
Adafruit Community venues. This includes but is not limited to any community
|
||||
spaces (both public and private), the entire Adafruit Discord server, and
|
||||
Adafruit GitHub repositories. Examples of Adafruit Community spaces include
|
||||
but are not limited to meet-ups, audio chats on the Adafruit Discord, or
|
||||
interaction at a conference.
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. As a community
|
||||
member, you are representing our community, and are expected to behave
|
||||
accordingly.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 1.4, available at
|
||||
<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
|
||||
and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
|
||||
|
||||
For other projects adopting the Adafruit Community Code of
|
||||
Conduct, please contact the maintainers of those projects for enforcement.
|
||||
If you wish to use this code of conduct for your own project, consider
|
||||
explicitly mentioning your moderation policy or making a copy with your
|
||||
own moderation policy so as to avoid confusion.
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2024 Adafruit Industries
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
286
examples/fulltest_sths34pf80/fulltest_sths34pf80.ino
Normal file
286
examples/fulltest_sths34pf80/fulltest_sths34pf80.ino
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
/*
|
||||
* 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);
|
||||
}
|
||||
62
examples/sths34pf80_simple/sths34pf80_simple.ino
Normal file
62
examples/sths34pf80_simple/sths34pf80_simple.ino
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
// Basic test for STHS34PF80 infrared sensor
|
||||
|
||||
#include "Adafruit_STHS34PF80.h"
|
||||
|
||||
Adafruit_STHS34PF80 sths;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
while (!Serial) delay(10);
|
||||
|
||||
Serial.println("Adafruit STHS34PF80 test!");
|
||||
|
||||
if (!sths.begin()) {
|
||||
Serial.println("Could not find a valid STHS34PF80 sensor, check wiring!");
|
||||
while (1) delay(10);
|
||||
}
|
||||
|
||||
Serial.println("STHS34PF80 Found!");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (!sths.isDataReady()) {
|
||||
delay(10);
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.print("Data ready! ");
|
||||
|
||||
// Read temperature data
|
||||
Serial.print("Amb: ");
|
||||
Serial.print(sths.readAmbientTemperature(), 2);
|
||||
Serial.print("°C");
|
||||
|
||||
// Check for presence and show data if detected
|
||||
if (sths.isPresence()) {
|
||||
Serial.print(" PRESENCE: ");
|
||||
Serial.print(sths.readPresence());
|
||||
}
|
||||
|
||||
// Check for motion and show data if detected
|
||||
if (sths.isMotion()) {
|
||||
Serial.print(" MOTION: ");
|
||||
Serial.print(sths.readMotion());
|
||||
}
|
||||
|
||||
// Check for temperature shock and show data if detected
|
||||
if (sths.isTempShock()) {
|
||||
Serial.print(" TEMP_SHOCK: ");
|
||||
Serial.print(sths.readTempShock());
|
||||
}
|
||||
|
||||
// Show object temperatures only if presence or motion detected
|
||||
if (sths.isPresence() || sths.isMotion()) {
|
||||
Serial.print(" Obj: ");
|
||||
Serial.print(sths.readObjectTemperature());
|
||||
Serial.print(", Comp: ");
|
||||
Serial.print(sths.readCompensatedObjectTemperature());
|
||||
}
|
||||
|
||||
Serial.println();
|
||||
delay(100);
|
||||
}
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
// Basic test for STHS34PF80 infrared sensor
|
||||
|
||||
#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 setup() {
|
||||
Serial.begin(115200);
|
||||
while (!Serial) delay(10);
|
||||
|
||||
Serial.println("Adafruit STHS34PF80 test!");
|
||||
|
||||
if (!sths.begin()) {
|
||||
Serial.println("Could not find a valid STHS34PF80 sensor, check wiring!");
|
||||
while (1) delay(10);
|
||||
}
|
||||
|
||||
Serial.println("STHS34PF80 Found!");
|
||||
|
||||
// Test all low-pass filter configurations
|
||||
Serial.println("\n--- Low-Pass Filter Tests ---");
|
||||
Serial.println("Available options: ODR/9, ODR/20, ODR/50, ODR/100, ODR/200, ODR/400, ODR/800");
|
||||
|
||||
// Test Motion LPF
|
||||
Serial.println("\n1. Motion LPF:");
|
||||
if (sths.setMotionLowPassFilter(STHS34PF80_LPF_ODR_DIV_9)) {
|
||||
Serial.println(" Set to ODR/9 - Success");
|
||||
} else {
|
||||
Serial.println(" Set to ODR/9 - Failed");
|
||||
}
|
||||
Serial.print(" Current setting: ");
|
||||
printLPFSetting(sths.getMotionLowPassFilter());
|
||||
Serial.println();
|
||||
|
||||
// Test Motion+Presence LPF
|
||||
Serial.println("\n2. Motion+Presence LPF:");
|
||||
if (sths.setMotionPresenceLowPassFilter(STHS34PF80_LPF_ODR_DIV_20)) {
|
||||
Serial.println(" Set to ODR/20 - Success");
|
||||
} else {
|
||||
Serial.println(" Set to ODR/20 - Failed");
|
||||
}
|
||||
Serial.print(" Current setting: ");
|
||||
printLPFSetting(sths.getMotionPresenceLowPassFilter());
|
||||
Serial.println();
|
||||
|
||||
// Test Presence LPF
|
||||
Serial.println("\n3. Presence LPF:");
|
||||
if (sths.setPresenceLowPassFilter(STHS34PF80_LPF_ODR_DIV_50)) {
|
||||
Serial.println(" Set to ODR/50 - Success");
|
||||
} else {
|
||||
Serial.println(" Set to ODR/50 - Failed");
|
||||
}
|
||||
Serial.print(" Current setting: ");
|
||||
printLPFSetting(sths.getPresenceLowPassFilter());
|
||||
Serial.println();
|
||||
|
||||
// Test Temperature LPF
|
||||
Serial.println("\n4. Temperature LPF:");
|
||||
if (sths.setTemperatureLowPassFilter(STHS34PF80_LPF_ODR_DIV_100)) {
|
||||
Serial.println(" Set to ODR/100 - Success");
|
||||
} else {
|
||||
Serial.println(" Set to ODR/100 - Failed");
|
||||
}
|
||||
Serial.print(" Current setting: ");
|
||||
printLPFSetting(sths.getTemperatureLowPassFilter());
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
delay(1000);
|
||||
}
|
||||
10
library.properties
Normal file
10
library.properties
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
name=Adafruit STHS34PF80
|
||||
version=1.0.1
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Arduino library for STHS34PF80 infrared sensor for presence and motion detection
|
||||
paragraph=This library provides an interface for the STHS34PF80 uncooled infrared sensor. The STHS34PF80 embeds a TMOS sensitive element and signal conditioning ASIC for presence and motion detection with I2C interface, embedded algorithms, and configurable thresholds.
|
||||
category=Sensors
|
||||
url=https://github.com/adafruit/Adafruit_STHS34PF80
|
||||
architectures=*
|
||||
depends=Adafruit BusIO
|
||||
44
output.txt
44
output.txt
|
|
@ -1,44 +0,0 @@
|
|||
Adafruit STHS34PF80 test!
|
||||
Address 0x5A Detected
|
||||
I2CWRITE @ 0x5A :: 0xF,
|
||||
I2CREAD @ 0x5A :: 0xD3,
|
||||
STHS34PF80 Found!
|
||||
|
||||
--- Low-Pass Filter Tests ---
|
||||
Available options: ODR/9, ODR/20, ODR/50, ODR/100, ODR/200, ODR/400, ODR/800
|
||||
|
||||
1. Motion LPF:
|
||||
I2CWRITE @ 0x5A :: 0xC,
|
||||
I2CREAD @ 0x5A :: 0x8,
|
||||
I2CWRITE @ 0x5A :: 0xC, 0x8, STOP
|
||||
Set to ODR/9 - Success
|
||||
Current setting: I2CWRITE @ 0x5A :: 0xC,
|
||||
I2CREAD @ 0x5A :: 0x8,
|
||||
ODR/9
|
||||
|
||||
2. Motion+Presence LPF:
|
||||
I2CWRITE @ 0x5A :: 0xC,
|
||||
I2CREAD @ 0x5A :: 0x8,
|
||||
I2CWRITE @ 0x5A :: 0xC, 0x8, STOP
|
||||
Set to ODR/20 - Success
|
||||
Current setting: I2CWRITE @ 0x5A :: 0xC,
|
||||
I2CREAD @ 0x5A :: 0x8,
|
||||
ODR/20
|
||||
|
||||
3. Presence LPF:
|
||||
I2CWRITE @ 0x5A :: 0xD,
|
||||
I2CREAD @ 0x5A :: 0x13,
|
||||
I2CWRITE @ 0x5A :: 0xD, 0x13, STOP
|
||||
Set to ODR/50 - Success
|
||||
Current setting: I2CWRITE @ 0x5A :: 0xD,
|
||||
I2CREAD @ 0x5A :: 0x13,
|
||||
ODR/50
|
||||
|
||||
4. Temperature LPF:
|
||||
I2CWRITE @ 0x5A :: 0xD,
|
||||
I2CREAD @ 0x5A :: 0x13,
|
||||
I2CWRITE @ 0x5A :: 0xD, 0x13, STOP
|
||||
Set to ODR/100 - Success
|
||||
Current setting: I2CWRITE @ 0x5A :: 0xD,
|
||||
I2CREAD @ 0x5A :: 0x13,
|
||||
ODR/100
|
||||
BIN
sths34pf80.pdf
BIN
sths34pf80.pdf
Binary file not shown.
|
|
@ -1,4 +0,0 @@
|
|||
[ZoneTransfer]
|
||||
ZoneId=3
|
||||
ReferrerUrl=https://www.st.com/en/mems-and-sensors/sths34pf80.html
|
||||
HostUrl=https://www.st.com/resource/en/datasheet/sths34pf80.pdf
|
||||
5200
sths34pf80.txt
5200
sths34pf80.txt
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue