我已经对加速度计进行了编程,以通过沿所有 3 轴原始数据设置合理的最小/最大阈值来检测振动。我需要它只计算它检测到振动的次数,但是,由于它使用阈值编程的方式,我使用了大约 1 秒的延迟来防止多次错误计数,这有效但会干扰超声波模块(HC -SR04) 需要读取距离值时与加速度计同步。想就此得到一些反馈。
问问题
149 次
1 回答
0
据我了解,您正在使用 Arduino 的delay()
功能。当您阻止应用程序的所有其余部分时,这是个坏主意,好吧,您已经注意到了...
更好的方法只是检查是否经过了一段时间,例如使用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...
}
始终在时间戳和当前时间之间使用减法 - 时间计数器可能会溢出,但减法结果不受影响,您是安全的......
isDelay
如果您确定相关事件在溢出期间(大约 50 天)之间总是至少发生一次,则可以简单地跳过该变量:
static unsigned long timestamp = millis() - 1000;
if(detect())
{
timestamp = millis();
}
if(millis() - timestamp > 1000)
{
// actions to be taken...
}
两种变体:静态变量,假设您在 Arduino 的loop
函数中有此代码(或从中调用一个loop
)。然而,更喜欢用宏替换幻数 1000,你很好......
于 2018-07-03T06:13:20.050 回答