Как создать постоянный цикл с событием, которое происходит только один раз?

В настоящее время я работаю в void loop() и установил измеритель расстояния, который постоянно проверяет расстояние.

Как только порог расстояния достигнут, вызывается функция. Теперь мне нужно, чтобы эта функция была вызвана только ОДИН РАЗ. Но поскольку дальномер постоянно сканирует (что мне и нужно), эта функция также многократно вызывается. Я пытался сделать что-то вроде таймера, но никак не мог понять, что это такое. Кто-нибудь может взглянуть на это?

if (distance <= 150){
    personPresent();
    }


  if(distance > 150){
    personAbsent();
      }

Мне нужно, чтобы определенные события в операторе if происходили только один раз, например, я хочу зарегистрироваться, когда присутствует человек, и чтобы это событие не срабатывало повторно.

В этом случае personPresent() присоединяется к контакту GPIO, который вызывает звуковой сигнал. Как и сейчас, зуммер продолжает звонить до тех пор, пока расстояние меньше 150. Мне нужно, чтобы зуммер издал звук только ОДИН РАЗ, а затем не жужжал по крайней мере 5 минут.

, 👍1

Обсуждение

используйте переменную "флаг", чтобы запомнить, что функция была вызвана, @jsotola


3 ответа


0
static boolean didItAlready = false;

if(distance > 50 && !didItAlready){
     doIt();
     didItAlready = true;
}

Вам просто нужна переменная, чтобы отслеживать, было ли это сделано или нет. Если и когда вы захотите выполнить действие снова, верните своей переменной значение false.

,

3

То, что вы хотите, - это не проверить расстояние, а проверить, изменилось ли условие расстояния.

static boolean present = false;

Внутренний цикл:

if (present == false && distance <= 150){
    personPresent();
    present = true;
} else if(present == true && distance > 150) {
    personAbsent();
    present = false;
}
,

0

Вам просто нужна глобальная переменная, чтобы отслеживать, делается это или нет...

// другие коды...

bool State=0;

void setup(){

// другие коды...

}

void loop(){

if(distance <= 150 && State==0){


personPresent(); // Эта функция должна выполняться только один раз
State=1;


}else if(distance>150 && State==1){

personAbsent(); // Это также должно быть выполнено один раз
State=0;


}

}

Глобальная булева переменная "Состояние" будет отслеживать, как и когда функции должны быть выполнены один раз, когда выполняются условия. И логическая переменная изменяется каждый раз (расстояние И Насыщение), когда выполняются условия, запускающие эти функции один раз за обновление bool.

,