Получение постоянного значения 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(" ");
}
```
@Dave, 👍2
Обсуждение1 ответ
Вы некоторое время ждете ввода пользователя (Serial.available() == 0)
, затем считываете ввод с помощью Serial.parseInt()
. parseInt подождет секунду для цифр. Он закончится на нецифровом символе или таймауте и вернет число, соответствующее полученным цифрам. Если цифры не были получены, возвращается 0.
Последовательный монитор имеет настройку конца строки. Если выбран какой-либо конец строки, он отправит символ(ы) окончания строки.
Ваш цикл ожидания в то время как (Serial.available() == 0)
закончится на символе окончания строки, который следовал за номером, обработанным в предыдущем цикле. parseInt
не найдет цифру, поэтому время ожидания истекает через секунду и возвращает 0, что приводит к установке ШИМ на 0.
- Почему нужно использовать latin-1 вместо utf-8 при использовании python с arduino?
- Запись нескольких входов в последовательный порт с использованием цикла while
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
Я использую Arduino MKR NB 1500. Я использую ШИМ-вывод 2, @Dave
установите концы строк равными нулю на последовательном мониторе. окончание строки засчитывается в значение доступно(). readInt ожидает одну секунду для числа, затем возвращает 0., @Juraj
установка концов строки на " нет " не сработала. Спасибо, Юрай!, @Dave
почему вы не включили распечатку последовательной консоли?, @jsotola