Получение постоянного значения PWM на основе пользовательского ввода с последовательного монитора

Я пытаюсь получить постоянное значение ШИМ от ШИМ-вывода на основе пользовательского ввода. Например: пользователь нажимает 1, выходное значение PWM равно 100, если оно равно 2, выход будет 200. Это будет продолжаться до тех пор, пока пользователь не введет новый номер. Проблема, с которой у меня возникает с моим кодом, заключается в том, что когда я ввожу число, вывод ШИМ достигает этого значения примерно на секунду, а затем возвращается к 0. Не могли бы вы, пожалуйста, сообщить мне, чего мне не хватает?

// Скетч: Мигание двух светодиодов пользователем
int test_pin=2; // объявить pin10 как значение ledpin
int PWMvalue; // переменная для хранения количества миганий
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.println("What is the new speed?"); //Запрашивать пользователя для ввода
 while (Serial.available() == 0) {
    // Wait for User to Input Data
  }
  PWMvalue = Serial.parseInt(); //Считать данные, введенные пользователем
 
  if (PWMvalue==0)
  {
    analogWrite(test_pin,0);
    }
    else if (PWMvalue==1)
    {
      analogWrite(test_pin,100);
      }
      else if (PWMvalue==2)
    {
      analogWrite(test_pin,200);
      }
      else if (PWMvalue==3)
    {
      analogWrite(test_pin,300);
      }
      else if (PWMvalue==4)
    {
      analogWrite(test_pin,400);
      }
      else if (PWMvalue==5)
    {
      analogWrite(test_pin,500);
      }
      else if (PWMvalue==6)
    {
      analogWrite(test_pin,600);
      }
      else if (PWMvalue==7)
    {
      analogWrite(test_pin,700);
      }
      else if (PWMvalue==8)
    {
      analogWrite(test_pin,800);
      }
      else if (PWMvalue==9)
    {
      analogWrite(test_pin,900);
      }
      else 
    {
      analogWrite(test_pin,1023);
      }
      
  Serial.print("Пользователь выбрал номер:");
  Serial.println(PWMvalue);
  Serial.println(" ");
}
```

, 👍2

Обсуждение

Я использую Arduino MKR NB 1500. Я использую ШИМ-вывод 2, @Dave

установите концы строк равными нулю на последовательном мониторе. окончание строки засчитывается в значение доступно(). readInt ожидает одну секунду для числа, затем возвращает 0., @Juraj

установка концов строки на " нет " не сработала. Спасибо, Юрай!, @Dave

почему вы не включили распечатку последовательной консоли?, @jsotola


1 ответ


3

Вы некоторое время ждете ввода пользователя (Serial.available() == 0), затем считываете ввод с помощью Serial.parseInt(). parseInt подождет секунду для цифр. Он закончится на нецифровом символе или таймауте и вернет число, соответствующее полученным цифрам. Если цифры не были получены, возвращается 0.

Последовательный монитор имеет настройку конца строки. Если выбран какой-либо конец строки, он отправит символ(ы) окончания строки.

Ваш цикл ожидания в то время как (Serial.available() == 0) закончится на символе окончания строки, который следовал за номером, обработанным в предыдущем цикле. parseInt не найдет цифру, поэтому время ожидания истекает через секунду и возвращает 0, что приводит к установке ШИМ на 0.

,