Нужно двигать сервопривод в течение определенных промежутков времени

#include <Servo.h> //объявить для вставки библиотеки Servo.h
Servo myservo; //создать объект servo для управления сервоприводом
int pos = 0; //переменная pos для длительного хранения положения сервопривода
unsigned long time;
void setup() {
myservo.attach(9); //присоедините сервопривод к цифровому контакту 9.


}

void loop() {
Serial.print("Time: ");
  time = delay();
  //печатает время с момента запуска программы
  Serial.println(time);
  // подождите секунду, чтобы не отправлять огромные объемы данных
  delay(1000);
}
for(pos = 0; pos < 180; pos += 1){ // сервопривод поворачивается от 0 до 180 с шагом 1 градус
myservo.write(pos); // скажите сервоприводу перейти в положение с переменной
delay(15);  // wts 15 мс для сервопривод для достижения нужной позиции
}
void delay(unsigned long ms)
{delay(7,200,000UL)
}

for(pos = 180; pos>=1; pos-=1) { // сервопривод поворачивается от 180 до 0 с шагом 1 градус
myservo.write(pos); // скажите сервоприводу перейти в положение с переменной
delay(15); // ждет 15 мс сервопривод для достижения нужной позиции
}
}

, 👍0

Обсуждение

Это не вопрос. Смотрите [Как задать хороший вопрос для стека Arduino Exchange](https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good-question-for-arduino-stack-exchange). Я исправил форматирование кода для вас. Теперь вам нужно сказать: ** что вы хотите, чтобы произошло ** и ** что происходит на самом деле **., @Nick Gammon


1 ответ


0
void delay(unsigned long ms)
{delay(7,200,000UL)
}

Это потерпит неудачу во многих отношениях. Во-первых, вы не ставите запятые внутри чисел в C ++. Выражение 7,200,000 будет равно 7, а не 7200000.

Во-вторых, ваша функция "delay" вызывает "delay", которая является рекурсивной. Поэтому задержка будет вызывать задержку, которая вызывает задержку и так далее, пока у вас не закончится стековая память.


Из комментария:

7200,000UL фактически оценивается в 0UL. Не то чтобы это имело большое значение... ;-) – Эдгар Боне

Позвольте мне объяснить, почему я это написал. Я не мог вспомнить, будет ли он оцениваться как 7 или 0, поэтому я написал небольшую тестовую программу:

#include <stdio.h>
int main ()
{
  unsigned long a;
  a = 7,200,000;
  printf ("a = %lu\n", a);
  return 0;
}

Это действительно печатает 7, отсюда и мой ответ.

Он также дает предупреждения:

test.cpp: In function ‘int main()’:
test.cpp:5:13: warning: right operand of comma operator has no effect [-Wunused-value]
   a = 7,200,000;
             ^~~
test.cpp:5:16: warning: right operand of comma operator has no effect [-Wunused-value]
   a = 7,200,000;
                ^

Заключение скобок вокруг назначенного выражения изменяет результат:

#include <stdio.h>
int main ()
{
  unsigned long a;
  a = (7,200,000);
  printf ("a = %lu\n", a);
  return 0;
}

Теперь он печатает 0, и я получаю предупреждения:

test.cpp: In function ‘int main()’:
test.cpp:5:10: warning: left operand of comma operator has no effect [-Wunused-value]
   a = (7,200,000);
          ^~~
test.cpp:5:14: warning: right operand of comma operator has no effect [-Wunused-value]
   a = (7,200,000);
              ^~~

Конечно, в том контексте, в котором он действительно использовался:

delay(7,200,000UL)

Вы получите сообщение об ошибке:

too many arguments to function 'void delay(long unsigned int)'

Плюс, конечно, должна быть конечная точка с запятой, поэтому строка должна выглядеть так:

delay(7200000);

UL не нужен, потому что компилятор видит, что эта константа должна быть больше int .

,

7,200,000UL на самом деле оценивается как `0UL'. Не то чтобы это имело большое значение ... ;-), @Edgar Bonet

В контексте, в котором он использовался, он даже не будет компилироваться: * слишком много аргументов для функции 'void delay(long unsigned int)'*, @Nick Gammon

@EdgarBonet Смотрите мой исправленный ответ., @Nick Gammon