Датчик вибрации акселерометра с использованием порога - PullRequest
0 голосов
/ 03 июля 2018

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

1 Ответ

0 голосов
/ 03 июля 2018

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

Всегда используйте вычитание между отметкой времени и текущим временем & ndash; счетчик времени может переполниться, результат вычитания не изменится, и вы в безопасности ...

Вы можете просто пропустить переменную isDelay, если вы достаточно уверены, что соответствующее событие всегда происходит по крайней мере один раз между периодами переполнения (около 50 дней):

static unsigned long timestamp = millis() - 1000;

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

Оба варианта: статические переменные, если предположить, что у вас есть этот код в функции loop Ардуино (или тот, который вызывается из loop). Все же предпочитаете заменять магическое число 1000 на макрос, и у вас все хорошо ...

...