Можно ли перепрыгнуть задержку в цикле?

#include <Servo.h>
    
Servo myservo;
int pos = 0;
int servo_pin = 3;
int led_pin = 4;

void setup() {
  myservo.attach(servo_pin);
  Serial.begin(9600);
  pinMode(led_pin,OUTPUT);
}
    
void loop() {
  if (Serial.available()) {
    char serial = Serial.read();
    if (serial == '2') {
      servo();
    }
    if (serial == '1') {
      digitalWrite(led_pin,HIGH);
    } else if (serial == '0') {
      digitalWrite(led_pin,LOW);
    }       
  }
  delay(100);
}
    
void servo() {
  for (pos = 0; pos <= 180; pos += 1) { 
    myservo.write(pos);             
    delay(5);                       
  }
  delay(5000);  // problem is here
  for (pos = 180; pos >= 0; pos -= 1) 
    myservo.write(pos);             
  delay(5);                       
}

Когда я запускаю этот код и отправляю 2 следящие функции, запускаются, но есть функция задержки. Теперь я хочу отправить 2, а затем отправить 1. Когда я это делаю, запускается первый сервопривод, но индикатор запускается после функции сервопривода. Я тоже хочу начать это одновременно.

, 👍1

Обсуждение

затем отправьте "3"..., @jsotola

Вы также должны проверить, есть ли новая инструкция в функции сервопривода, например, до и после " задержки(5000)", и разделить ее на цикл времени, выполняемый тысячу раз " задержка(5)", и проверить, есть ли новая инструкция. , @Python Schlange


2 ответа


1

Сделайте небольшую задачу, используя функцию millis.

// ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ
uint32_t taskMillis = 0;

....

// В ЦИКЛЕ
if (taskMillis && millis() - taskMillis >= 5000)
{ /* SWITCHES DIRECTION */ }

С помощью этого кода вы можете выполнить две задачи(одна для переключения направления, вторая для перемещения сервопривода на X град). Вот видео на эту тему.

https://www.youtube.com/watch?v=v5SpPXMmHJE

Я надеюсь, что этот анусер поможет вам.

,

1

Короткий ответ-нет. Задержка приводит к тому, что ваш Arduino останавливается как вкопанный и БОЛЬШЕ НИЧЕГО НЕ делает, пока не пройдет указанное время. (Вы все еще можете выполнять процедуры прерывания обслуживания, но игнорируйте это.)

Ответ заключается в том, чтобы переписать свой код, чтобы использовать millis() вместо задержки. Вы записываете текущее значение millis() и сравниваете новое время с millis (), чтобы узнать, прошло ли достаточно времени.

По большей части вы должны прекратить использовать функцию delay() и забыть о существовании. Это навлечет на тебя неприятности.

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

,