Обнаружение вибрации акселерометра с использованием порога

Я запрограммировал акселерометр для обнаружения вибраций, установив разумный минимальный / максимальный порог по всем 3-осевым необработанным данным. Мне нужно, чтобы он только подсчитывал, сколько раз он обнаруживает вибрацию, однако из-за того, как он запрограммирован с пороговым значением, я использовал задержку около 1 секунды, чтобы предотвратить множественные ошибки, которые работают, но мешают ультразвуковому модулю (HC). -SR04) когда нужно считывать значения расстояний синхронно с акселерометром. Хотел бы получить некоторую обратную связь по этому вопросу.

-1

Решение

Насколько я понимаю, вы используете 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 на макрос, и ты в порядке …

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector