Как перезапустить 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);
}
}
@flyer3110, 👍0
Обсуждение3 ответа
Чтобы подробнее рассказать о том, что сказал 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. Это облегчает чтение кода и его исправление.
Если этот ответ не был тем, что вы имели в виду, то не стесняйтесь комментировать, и я посмотрю, смогу ли я придумать лучший ответ.
При программировании с помощью arduino IDE вы объявляете 2 функции: setup() и loop().
Перед компиляцией среда разработки arduino IDE в основном расширяется до :
int main(void)
{
/* запустить настройку Arduino */
setup();
/* и цикл событий */
while (1) {
loop();
}
/* никогда не достигнет */
return 0;
}
Итак, отсюда вы можете видеть, что setup() вызывается один раз при запуске, а затем loop() вызывается в бесконечном цикле. Если вы вернетесь из своей функции цикла, она будет вызвана снова.
Мне неприятно поднимать эту тему, но я занимаюсь программированием уже 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
loop()
просто вызывается в... цикле. Следовательно, если вы просто "вернетесь" из него, он будет вызван снова., @jfpoilpretКонечно, вы можете иметь в виду, что хотите перезапустить loop() на полпути кода в цикле, и в этом случае вам следует использовать оператор
return;
, который приведет к немедленному завершению текущего вызова функции и возвращению управления вызывающей функции. В случае loop() это приведет к его перезапуску., @Code Gorilla