Как перезапустить void loop(), если условие выполнено

Это должен быть короткий вопрос.

Я пытаюсь понять, как я могу перезапустить void loop(), если выполнено определенное условие. В этом случае, если (s>10), я хочу, чтобы цикл был перезапущен. Любая помощь будет оценена по достоинству.

 void loop() {

  if (getDistance(0) == true)                   //if the car passed the first sensor
  {
    while (getDistance(0) == true && getDistance(1) == false); 
    unsigned long currentMillis = millis(); //time when the passed the first sensor

    while (getDistance(1) == true && getDistance(0) == true); //wating car to pass the second sensor

    unsigned long endMillis = millis(); //time at which the car passed the second sensor

    unsigned long timeMillis = endMillis - currentMillis; //get duration in ms
    float timeSeconds = timeMillis / 1000.0; //because 1000ms = 1s

    float s = sensorDistance / timeSeconds; //speed = distance / time

    if(s>=7 && s<=10) // for red to turn on
    {
    Serial.print(s); // printing the speed magnitude
    Serial.print(" m/s");// printing the units of speed
    Serial.println(); // new line in printing

    char msg[2] = {'h','#'}; // sending some random message to indicate that speed is greater than 10
    digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, 2); // sending a message
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(led_pin, LOW); // again bringing the flash light to low

    }
    else if (s<7)
    {
    Serial.print(s); // printing the speed magnitude
    Serial.print(" m/s");// printing the units of speed
    Serial.println(); // new line in printing

    char msg[4] = {'h','e','l','#'}; // sending some random message to indicate that speed is greater than 10
    digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, 4); // sending a message
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(led_pin, LOW); // again bringing the flash light to low
    }

    delay(2000);
  }
}

, 👍0

Обсуждение

loop() просто вызывается в... цикле. Следовательно, если вы просто "вернетесь" из него, он будет вызван снова., @jfpoilpret

Конечно, вы можете иметь в виду, что хотите перезапустить loop() на полпути кода в цикле, и в этом случае вам следует использовать оператор return;, который приведет к немедленному завершению текущего вызова функции и возвращению управления вызывающей функции. В случае loop() это приведет к его перезапуску., @Code Gorilla


3 ответа


1

Чтобы подробнее рассказать о том, что сказал jfpoilpret, setup() и loop() вызываются кодом, который вы не можете видеть в каждой программе. Функция setup() вызывается один раз, а функция loop() вызывается в цикле while(true) до тех пор, пока программа не завершит работу или вселенная не закончится.

Чтобы вызвать код при выполнении условия, вы можете либо обернуть его в цикл, либо в if в функции loop (), так что что-то вроде этого:

void loop ()
{
    if (s > 10)
    {
        // Your stuff....
    }
}

Это вызовет ваш код только в том случае, если s > 10>. То, за чем вам нужно следить, - это убедиться, что существует какой-то код, который может привести к тому, что s будет больше 10.

Вы также можете переместить "// Ваши вещи..." в отдельную функцию

void MyCode ()
{
    // Your stuff ...
}

а затем вызовите эту функцию изнутри оператора if. Это облегчает чтение кода и его исправление.

Если этот ответ не был тем, что вы имели в виду, то не стесняйтесь комментировать, и я посмотрю, смогу ли я придумать лучший ответ.

,

4

При программировании с помощью arduino IDE вы объявляете 2 функции: setup() и loop().

Перед компиляцией среда разработки arduino IDE в основном расширяется до :

int main(void)
{
    /* запустить настройку Arduino */
    setup();
    /* и цикл событий */
    while (1) {
        loop();
    }
    /* никогда не достигнет */
    return 0;
}

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

,

0

Мне неприятно поднимать эту тему, но я занимаюсь программированием уже 58 лет. Одной любопытной и часто упускаемой из виду особенностью языков C & C++ является ключевое слово GOTO. Это может быть очень полезно. Моим вторым языком был ФОРТРАН I. Я знаю, теперь я низведен до 9-го круга он|| где негодяи вмерзли в ледники головой вниз с торчащими ногами?

,

Что касается последнего момента, то, возможно, не от рук arduino.cc люди, с тех пор как потрудились упомянуть "гото" в [официальной документации](https://www.arduino.cc/reference/en/language/structure/control-structure/goto/)., @timemage

гото [имеет законные uses](https://www.kernel.org/doc/html/v4.10/process/coding-style.html#centralized-exiting-of-functions), но нет смысла использовать его, если вместо этого вы можете просто "вернуть": “ _ Если очистка не требуется”просто вернитесь напрямую"., @Edgar Bonet

"вмерзнуть в ледники с головой" ... это один из способов сохранить хладнокровие, @jsotola