Мигают 2 светодиода, имеющих вход от последовательного монитора.

Сэр, при вводе значений на последовательном мониторе я прошу пользователя ввести значение напряжения красного светодиода (0-255), затем снова запрашиваю желтый цвет при красном напряжении, запрашивая, чтобы пользователь ввел значение, после что он запрашивает ввод желтого светодиода, но время для ввода значения для ввода желтого светодиода очень меньше, поэтому оно не вводится и запускается дальнейшая программа. Таким образом, работает только красный светодиод, а желтый нет.

int REDledpin=9;        //КРАСНЫЙ светодиод на контакте 9 платы uno.
int YELledpin=7;        //ЖЕЛТЫЙ светодиод на контакте 8 платы uno.
int REDonleddelay=500;  //Красный светодиод будет гореть 500 мс.
int REDoffleddelay=500; //Красный светодиод погаснет на 500 мс.
int YELonleddelay=600;  //ЖЕЛТЫЙ светодиод будет гореть 600 мс.
int YELoffleddelay=600; //ЖЕЛТЫЙ светодиод погаснет на 600 мс.
int countredled=5;        //Переменная счетчика RED LED
int countyellowled=5;     //Переменная счетчика ЖЕЛТОГО светодиода
String red="Red led is blinking";
String Yellow="Yellow led is blinking";
int redintensity;
int yellowintensity;

void setup() {
  Serial.begin(9600);
  pinMode(REDledpin,OUTPUT);
  pinMode(YELledpin,OUTPUT);

  Serial.println("How much voltage you want to apply to the red LED (0-255)?");
  while(Serial.available()==0){}
  redintensity= Serial.parseInt();


  Serial.println("How much voltage you want to apply to the yellow LED (0-255)?");
  while(Serial.available()==0){}
  yellowintensity = Serial.parseInt(); 

}

void loop() {
Serial.println(red);  
for(int j=1;j<=countredled;j=j+1)
  {
    Serial.print("The red LED blink star: ");
    Serial.println(j);
    analogWrite(REDledpin,redintensity);
    delay(REDonleddelay);
    analogWrite(REDledpin,0);
    delay(REDonleddelay);
  }

Serial.println(" ");
Serial.println(Yellow);
  for(int j=1;j<=countyellowled;j=j+1)
  {
   Serial.print("The yellow LED blink stars");
   Serial.println(j);
   digitalWrite(YELledpin,yellowintensity); 
   delay(YELonleddelay);
   digitalWrite(YELledpin,0);
   delay(YELoffleddelay);
  }
 Serial.println(" ");
}

, 👍0

Обсуждение

добавьте while (Serial.read() != -1); после parseInt(), чтобы прочитать символы завершения строки, @Juraj


1 ответ


Лучший ответ:

1

@Juraj был на правильном пути, однако, например, символы конца строки могут не буферизоваться, и проблема может продолжаться.

Правильный подход — это ожидание именно символа конца строки. Давайте пойдем простым путем и воспользуемся Serial.readStringUntil

#define EOL_CHAR '\n'

void setup() {
  Serial.begin(9600);
  pinMode(REDledpin,OUTPUT);
  pinMode(YELledpin,OUTPUT);

  Serial.println("How much voltage you want to apply to the red LED (0-255)?");
  while(Serial.available()==0){}
  redintensity= Serial.parseInt();

  Serial.readStringUntil(EOL_CHAR); // очищаем последовательный буфер до символа конца строки

  Serial.println("How much voltage you want to apply to the yellow LED (0-255)?");
  while(Serial.available()==0){}
  yellowintensity = Serial.parseInt(); 

}

Все зависит от того, что Serial Monitor отправляет в качестве новой строки; это может быть CR (\r), LF (\n) или CRLF (\r\n), поэтому измените значение EOL_CHAR соответствующим образом в зависимости от настроек последовательного монитора.

,