Как управлять сервоприводом с последовательным входом в сочетании с потенциометром

Я хочу управлять сервоприводом с последовательным входом в сочетании с потенциометром. Сервопривод может управляться отдельно. Если я прокомментирую часть кода, например последовательный ввод, то смогу управлять сервоприводом через потенциометр. Если я прокомментирую часть кода потенциометра, то смогу управлять сервоприводом с помощью последовательного ввода. Но я хочу контролировать в сочетании.

Я уже пробовал следующее: я сделал целое число, чтобы сохранить старое значение, и сделал оператор if, чтобы проверить, было ли изменено старое значение. Конечно, оно изменено, потому что программа всегда считывает измененное значение, которое является значением потенциометра.

Код:

void loop()
{
  controlMeter();
}

void controlMeter()
{
  int potValue = map(analogRead(aiPot), 0, 1023, 0, 180);
  int keyValue = 0;

  if(Serial.available())
  {
    String SkeyValue = Serial.readStringUntil('\n');
    keyValue = SkeyValue.toInt();
    Serial.println("There is something in serial!");
    if (oldValue != keyValue)
    {
      oldValue = keyValue;
      Serial.print("keyValue: ");
      Serial.println(keyValue);
      servo.write(oldValue);
      delay(2000);
    }
  }
  else
  {
    if (oldValue != potValue)
    {
      oldValue = potValue;
      Serial.print("potValue: ");
      Serial.println(potValue);
      servo.write(oldValue);
      delay(2000);
    }
  }
}

Я ожидаю, что если я введу 150, то сервопривод перейдет на 150 и останется на 150, но если я изменю это значение с помощью потенциометра на 30, то сервопривод должен перейти на 30 и остаться там.

Любая помощь будет оценена по достоинству.


person Haffoo    schedule 07.10.2019    source источник


Ответы (1)


Сохраните старое значение потенциометра и серийного номера в отдельных переменных.

Аналоговый вход содержит некоторый шум. Вы должны использовать потенциометр только в том случае, если изменение превышает некоторый порог:

void loop()
{
  controlMeter();
}

int oldValue_Pot = -1;
int oldValue_Ser = -1;

int treshold = 5;

void controlMeter()
{
  int potValue = map(analogRead(aiPot), 0, 1023, 0, 180);
  int keyValue = 0;

  if(Serial.available())
  {
    String SkeyValue = Serial.readStringUntil('\n');
    keyValue = SkeyValue.toInt();
    Serial.println("There is something in serial!");
    if (oldValue_Ser != keyValue)
    {
      oldValue_Ser = keyValue;
      Serial.print("keyValue: ");
      Serial.println(keyValue);
      servo.write(oldValue_Ser);
      delay(2000);
    }
  }
  else
  {
    if (abs(oldValue_Pot - potValue) > treshold)
    {
      oldValue_Pot = potValue;
      Serial.print("potValue: ");
      Serial.println(potValue);
      servo.write(oldValue_Pot);
      delay(2000);
    }
  }
}
person GvS    schedule 07.10.2019
comment
Этот код работал для меня большое спасибо! Можете ли вы проголосовать за мой вопрос :) - person Haffoo; 07.10.2019