Выполнять код только один раз

Я пытаюсь создать оператор if, который запускается только один раз, при первом запуске цикла void, и после этого переключается на другой код. Но следующее выполняет только stepper1a(). Любая помощь будет здорово. Спасибо!

int var;
int var2;
bool executed = false;

const int M1dirpin = 4; //Пин шагового направления
const int M1steppin = 5; // Шаговый штифт

void setup() {

pinMode(A2,INPUT);
pinMode(M1dirpin,OUTPUT);
pinMode(M1steppin,OUTPUT);
Serial.begin(9600);

}

void stepper1() { 
  int j;
    delayMicroseconds(10);
    digitalWrite(M1dirpin,HIGH);
  for(j=0;j<=200;j++){
    digitalWrite(M1steppin,LOW);
    delayMicroseconds(10);
    digitalWrite(M1steppin,HIGH);
    delay(2);
  }
}

void stepper1a() {
  int j;
    delayMicroseconds(10);
    digitalWrite(M1dirpin,HIGH);
  for(j=0;j<=1600;j++){
    digitalWrite(M1steppin,LOW);
    delayMicroseconds(10);
    digitalWrite(M1steppin,HIGH);
    delay(2);
  }
}

void loop() {

if (executed == false) {
var = analogRead(A2);
delay(10);
if (var > 500) {
  stepper1a();
  delay(2000);
  executed = true;
  Serial.println("turned 1600");
  Serial.println(executed);
  }
else if (executed == true) {
 var2 = analogRead(A2);
delay(10);
if (var > 500) {
  stepper1();
  delay(2000);
  Serial.println("turned 200");
}
}
}
}

Обновлен цикл пустоты:

void loop() {

    static bool yes_we_did_the_one_time_job = false;

    if (yes_we_did_the_one_time_job) {
        var = analogRead(A2);
        delay(10);
        if (var > 500) {
            stepper2();
            delay(2000);
            Serial.println("turned 1600");
        } 
    }
    else {
        var2 = analogRead(A2);
        delay(10);
        if (var > 500) {
            stepper1();
            delay(2000);
            Serial.println("turned 200");
            yes_we_did_the_one_time_job = true;
        }
    }
}

Теперь это работает, спасибо !!!:

void loop() {
  static bool yeswedid = false;

  if(yeswedid) {
    if(analogRead(A2) > 500) {
    stepper1();
    stepper2();
    }
  }
  else {
    if(analogRead(A2) > 500) {
    stepper1();
    yeswedid = true;
  }

  }
}

, 👍1

Обсуждение

у вас опечатка. else if (executed == true) { else to if (var > 500) {, а не if (executed == false) {. добавьте один } перед else if (executed == true) { и удалите один } в конце, @Juraj

и if (выполнено) {} else {} было бы чище, @Juraj

Ваш обновленный код по-прежнему неверен. У вас есть код, который устанавливает для yes_we_did_the_one_time_job значение true внутри второго оператора if, что означает, что он не будет установлен до тех пор, пока не будет установлено var > 500., @Duncan C

@DuncanC, это цель, насколько я понимаю. Подождите, пока AnalogRead в первый раз не достигнет 500, а затем выполните специальное движение инициализации. потому что без условия его можно было бы выполнить в setup(), @Juraj

@digit — вопрос относительно вашего кода «Обновленный цикл недействительности:». Код if (var > 500) { в операторе else должен быть var или var2?, @VE7JRO


2 ответа


Лучший ответ:

1

Общее решение:

void loop() {
    static bool yes_we_did_the_one_time_job = false;
    if (yes_we_did_the_one_time_job) {
        do_the_other_jobs();
    } else {
        do_the_one_time_job();
        yes_we_did_the_one_time_job = true;
    }
}
,

если это то, что вы предлагаете, это не сработало:, @digit

см. обновленный вопрос. Спасибо за вашу помощь, @digit

@digit: Re «_это не сработало_»: вы не совсем реализовали мое предложение. Внимательно прочитайте свой код, и вы увидите, что он не эквивалентен тому, что я разместил здесь., @Edgar Bonet

отличное решение спасибо чувак!, @digit


2

Если у вас есть код, который вы хотите запустить только один раз в начале вашей программы, вы можете использовать метод setup(). На самом деле он может делать гораздо больше, чем просто настраивать контакты и значения по умолчанию.

Код основной функции Arduino (main.cpp ) выглядит так:

int main(void) { //(...) Я вырезал кое-что отсюда настраивать(); для (;;) { петля(); если (serialEventRun) serialEventRun(); } вернуть 0; }

Как видите, setup() — это просто метод, который может делать почти то же самое, что и loop().

Метод setup() может фактически содержать цикл for(;;), который остановит программу от выполнения loop() метод. Изнутри вы можете проверить значение датчика и разорвать его при выполнении условия.

int main(void)
{
    //(...) I cut some stuff from here

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    return 0;
}

в этом случае loop() очень прост:

void setup()
{
  for (;;)
  {
    var = analogRead(A2);
    delay(10);
    if (var > 500) {
      stepper1();
      delay(2000);
      Serial.println("turned 200");
      break;
    }
  }
}
,

Он должен реагировать на датчик в пустом цикле и не запускаться один раз при запуске. Спасибо., @digit

только один раз, но после выполнения начального условия. код OP можно использовать, отсутствует только {, @Juraj