Я запрограммировал акселерометр для обнаружения вибраций, установив разумный минимальный / максимальный порог по всем 3-осевым необработанным данным. Мне нужно, чтобы он только подсчитывал, сколько раз он обнаруживает вибрацию, однако из-за того, как он запрограммирован с пороговым значением, я использовал задержку около 1 секунды, чтобы предотвратить множественные ошибки, которые работают, но мешают ультразвуковому модулю (HC). -SR04) когда нужно считывать значения расстояний синхронно с акселерометром. Хотел бы получить некоторую обратную связь по этому вопросу.
Насколько я понимаю, вы используете Arduino delay()
функция. Плохая идея, поскольку вы блокируете все остальное в своем приложении, ну, вы уже заметили …
Лучший подход — просто проверить, прошло ли какое-то время, e. г. с помощью 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 на макрос, и ты в порядке …
Других решений пока нет …