Как приостановить цикл только один раз?

Я пытаюсь сделать паузу в цикле, но только в первый раз. В следующих циклах я хотел бы, чтобы программа НЕ делала паузу. Только один раз, каждый раз, когда кнопка нажата. Кто-нибудь знает, как это сделать? Спасибо! Это код, который я хочу приостановить только один раз:

void loop() {
  if(digitalRead(switch_pin) == LOW){
    digitalWrite(led_green_pin,LOW);
    digitalWrite(led_red_pin,HIGH);
    lastMotionState    = currentMotionState;            
    currentMotionState = digitalRead(MOTION_SENSOR_PIN); //
      if (currentMotionState == LOW && lastMotionState == HIGH) { 
      servo.write(90);
      }
      else
      if (currentMotionState == HIGH && lastMotionState == LOW) { // изменение состояния pin: HIGH -> LOW
      servo.write(0);
      }
  }

, 👍1

Обсуждение

"Кто-нибудь знает, как это сделать?"это не вопрос, который спрашивает, как это сделать ... это не вопрос об arduino, @jsotola

что вы подразумеваете под "паузой"? ... это означает, что код каким-то образом запустится снова, но вы ничего не сказали о том, что остановит его, что начнет его снова и где он должен "приостановиться", @jsotola

Хуан, https://stackoverflow.com/help/merging-accounts, @Juraj


2 ответа


4

Следующий код будет делать паузу (давать некоторую задержку) при первом запуске, а также при нажатии кнопки.


void loop() {
  static int status = true;
  if(status){
    //Pause
    delay(15);
    status=false;
    return;
  }
  
  if(digitalRead(switch_pin) == LOW){
    digitalWrite(led_green_pin,LOW);
    digitalWrite(led_red_pin,HIGH);
    lastMotionState    = currentMotionState;            
    currentMotionState = digitalRead(MOTION_SENSOR_PIN); //
      if (currentMotionState == LOW && lastMotionState == HIGH) { 
        servo.write(90);
      }
      else if (currentMotionState == HIGH && lastMotionState == LOW) { // pin state change: HIGH -> LOW
        servo.write(0);
      }
  }
  else{
    status = true;
  }
}

Дайте отсрочку в соответствии с вашими потребностями.

,

Я не знаю, что делает эта строка "продолжить", когда нет цикла "вперед/назад/сделать"., @Gerben

Лучше было бы иметь " void loop() { статический int статус = true; ... } сохраняя область статус внутри " цикла() вместо глобального., @lurker

@Гербен и луркер спасибо, что указали на это. Я внес соответствующие изменения. Вместо продолжения я добавил возврат, который будет работать по желанию., @HARSH MITTAL


0

Это довольно просто, хотя вы не должны видеть никакой разницы, потому что loop() работает много раз за одну секунду. Но:

bool firstrun = true;
void loop() {
  if(firstrun == true){};
  else{
    if(digitalRead(switch_pin) == LOW){
      digitalWrite(led_green_pin,LOW);
      digitalWrite(led_red_pin,HIGH);
      lastMotionState    = currentMotionState;            
      currentMotionState = digitalRead(MOTION_SENSOR_PIN); //
        if (currentMotionState == LOW && lastMotionState == HIGH) { 
          servo.write(90);
        }
        else if (currentMotionState == HIGH && lastMotionState == LOW) { // pin state change: HIGH -> LOW
          servo.write(0);
        }
    }
  }
  firstrun = false;
}
,