Можно ли перепрыгнуть задержку в цикле?
#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. Когда я это делаю, запускается первый сервопривод, но индикатор запускается после функции сервопривода. Я тоже хочу начать это одновременно.
2 ответа
Сделайте небольшую задачу, используя функцию millis.
// ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ
uint32_t taskMillis = 0;
....
// В ЦИКЛЕ
if (taskMillis && millis() - taskMillis >= 5000)
{ /* SWITCHES DIRECTION */ }
С помощью этого кода вы можете выполнить две задачи(одна для переключения направления, вторая для перемещения сервопривода на X град). Вот видео на эту тему.
https://www.youtube.com/watch?v=v5SpPXMmHJE
Я надеюсь, что этот анусер поможет вам.
Короткий ответ-нет. Задержка приводит к тому, что ваш Arduino останавливается как вкопанный и БОЛЬШЕ НИЧЕГО НЕ делает, пока не пройдет указанное время. (Вы все еще можете выполнять процедуры прерывания обслуживания, но игнорируйте это.)
Ответ заключается в том, чтобы переписать свой код, чтобы использовать millis()
вместо задержки. Вы записываете текущее значение millis()
и сравниваете новое время с millis ()
, чтобы узнать, прошло ли достаточно времени.
По большей части вы должны прекратить использовать функцию delay()
и забыть о существовании. Это навлечет на тебя неприятности.
Выполните поиск в Google по ссылке "Arduino мигает без задержки" и изучите проект, который подходит для изучения этого подхода.
- Использовать timer0, не влияя на millis() и micros().
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Аппаратное прерывание срабатывает случайным образом
- _delay_ms() работает намного медленнее, чем ожидалось (в 6 раз) на tinyAVR 0/1 (ATTiny1604)
- Как рандомизировать задержку в коде шагового двигателя Arduino?
- Запуск двигателя постоянного тока в течение заданного промежутка времени
- Как заставить ЖК-экран прокручивать текст , позволяя вводить кнопки?
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
затем отправьте "3"..., @jsotola
Вы также должны проверить, есть ли новая инструкция в функции сервопривода, например, до и после " задержки(5000)", и разделить ее на цикл времени, выполняемый тысячу раз " задержка(5)", и проверить, есть ли новая инструкция. , @Python Schlange