使用阈值的加速度计振动检测

Accelerometer vibration detection using a threshold

我对加速度计进行了编程,通过沿所有 3 轴的原始数据设置合理的 min/max 阈值来检测振动。我需要它只计算它检测到振动的次数,但是,由于它用阈值编程的方式,我使用了大约 1 秒的延迟以防止多次错误计数,这有效但会干扰超声波模块(HC -SR04) 当需要读取距离值时与加速度计同步。想就此获得一些反馈。

据我了解,您使用的是 Arduino 的 delay() 功能。阻止应用程序的所有其余部分是个坏主意,好吧,您已经注意到了...

更好的方法只是检查是否经过了一段时间,例如。 G。使用 millis 函数:

static bool isDelay = false;
static unsigned long timestamp;

if(detect())
{
    isDelay = true;
    timestamp = millis();
}

if(isDelay && millis() - timestamp > 1000)
{
    isDelay = false;
}
if(!isDelay)
{
    // actions to be taken...
}

总是在时间戳和当前时间之间使用减法——时间计数器可能会溢出,但是减法结果不受影响,而且你是安全的...

如果您确信相关事件总是在溢出期(大约 50 天)之间至少发生一次,则可以简单地跳过 isDelay 变量:

static unsigned long timestamp = millis() - 1000;

if(detect())
{
    timestamp = millis();
}
if(millis() - timestamp > 1000)
{
    // actions to be taken...
}

两种变体:假设您在 Arduino 的 loop 函数(或从 loop 调用的函数)中有此代码的静态变量。然而,更喜欢用宏替换神奇的数字 1000,你没问题...