Arduino запускает сервопривод в течение N секунд с возможностью прерывания - PullRequest
0 голосов
/ 08 июня 2018

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

Я пытаюсь сделать это:

  • контакты 8 и 9 соприкасаются, и сервопривод переходит из положения A в положение B
  • после задержки в 5000 мс, сервопривод возвращается в положение A

Это отлично работает.Однако я пытаюсь ввести еще одно условие для сервопривода.Я хочу постоянно читать val (analogueRead из potpin) и, если он ниже 500, я хочу, чтобы сервопривод возвращался из положения B в положение A, но только временно, пока val не вернется к>499 (все в интервале 5000 мс).

Я легко могу достичь того или другого, но у меня возникают трудности с совместным использованием этих двух функций.В приведенном ниже коде все отлично работает для интервала.Я подключаю контакты, сервопривод переходит в положение B, но когда меняется val (я знаю, что он изменился, потому что я пытался распечатать значения на мониторе), этого не происходит.После первой переоценки loop она начинает работать, и сервопривод реагирует на изменение val, но затем это портит интервал в 5000 мс, и сервопривод не возвращается в положение A. В конце.

Это мой код:

#include <Servo.h>     
Servo myservo;
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup()
{
  Serial.begin(9600);
  pinMode(8, INPUT_PULLUP);      //pin 8 forced to HIGH when there is no external input
  myservo.attach(9);           //attaches the servo on pin 9 to the     servo object
  myservo.write(60);           //tells servo to go to 60 degree position
}

void loop()
{
  while(digitalRead(8) == HIGH)
  {
    val = analogRead(potpin);

    if (val > 499) {
      myservo.write(60);
    } else {
      myservo.write(150);
    }
  }

  myservo.write(150);
  delay(5000);
}

Я предполагаю, что мой подход просто неверен, но, как я уже сказал, это моя первая встреча с Arduino.

1 Ответ

0 голосов
/ 08 июня 2018

Ваша проблема в том, что вы хотите сделать что-то внутри 5-секундного окна, но вы использовали:

delay(5000);

, который говорит Arduino ничего не делать в течение 5 секунд.В то время, когда он ничего не делает, он не читает булавки или двигает сервоприводы.Вместо этого вы должны использовать таймер millis (), чтобы не отставать от того, сколько времени прошло с тех пор, как вы начали свою процедуру.Таким образом, функция цикла может продолжать работать и читать контакты и движущиеся сервоприводы.Посмотрите пример «Blink Without Delay» и любое из сотен учебных пособий о том, как это работает, чтобы узнать, как это сделать с неблокирующим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...