Бесконечный цикл serial.readString()

led loop

Хорошо, это мой код:

int rosso = 13;
int verde = 12;
int blu = 11;
int count = 0;
String command_on, command_off;
String s;
String enough = "stop";

void setup(){
  pinMode(rosso, OUTPUT);
  pinMode(verde, OUTPUT);
  pinMode(blu, OUTPUT);
  Serial.begin(9600);
  command_on = String("on");
  command_off = String("off");
}

void redToBlue(){
  if(count < 100) {   
  rgb(0,255,0);
  delay(100);
  rgb(0,0,0);
  delay(100);
  rgb(255,0,0);
  delay(100);
  rgb(0,0,0);
  count = count+1;  
  }
}

void switchOff(){
  rgb(0,0,0);
  delay(100);
}

boolean wait_command(){
  if(s == command_on){
    redToBlue();
  }
  if(s == command_off){
  switchOff();
  }
}

void accendi(){
  if(s == command_on){
  redToBlue();
  }

  if(s == command_off){
  switchOff();
  }
}

void rgb(int r, int g, int b){
  analogWrite(rosso, r);
  analogWrite(blu, b);
  analogWrite(verde, g);
}

void loop(){
 s = Serial.readString();
 Serial.println("What I have to do? ");
 wait_command();
}

На последовательном мониторе, когда я набираю "on", функция redToblue() должна иметь цикл 100 раз, все, что я получил, это то, что цикл останавливается только тогда. Я думаю, что мне нужно что-то изменить внутри функции loop() и в redToBlue()...

, 👍-1


2 ответа


0

Я точно не знаю, чего вы хотите, но если вы ожидаете, что после одной команды on она будет повторяться 100 раз, вам нужно вызвать функцию redToBlue в каждом цикле (внутри wait_command, который проверяет наличие логического значения, была ли запрошена команда on, и в этом случае вызывает функцию redToBlue. Когда установлена команда off, вы сбрасываете логическое значение.

Кроме того, wait_command — не очень удачное название, поскольку оно не ожидает команды, а обрабатывает ее.

,

да, я бы хотел, чтобы если я набираю цикл «вкл» 100 раз, и если я набираю «выкл», ничего не происходит, а светодиод rgb выключен., @tommy

Он также остановится до 100, если вы наберете «off», когда 100 циклов еще не достигнуты., @Michel Keijzers


1

Функция loop() — это та, которая будет вызываться при запуске программы и будет продолжать цикл, пока вы ее не остановите. Итак, на данный момент у вас есть loop(), делающий следующее:

  1. Чтение строки из последовательного соединения
  2. Отображение сообщения при последовательном соединении
  3. Разбор прочитанной строки и выполнение действий с ней.

Итак, когда ваш код запускается, вы видите, что он печатает сообщение и, возможно, что-то делает со светом, а затем он останавливается/зависает. На самом деле он не заморожен, он ждет, пока вы введете ответ.

Итак, если вы действительно хотите, чтобы он спросил, что делать, а затем выполнил цикл 100 раз, вам нужно сделать следующее:

  1. Отобразить сообщение.
  2. Прочитайте данные.
  3. Вызовите wait_command() (после его изменения)

void redToBlue(){ for (int count = 0; count < 100; ++count) { RGB (0,255,0); задержка(100); RGB (0,0,0); задержка(100); RGB(255,0,0); задержка(100); RGB(0,0,0);
} } // Извините, я не могу отформатировать код.

Я думаю, вы могли бы также провести рефакторинг функции для перебора массива из 4 значений RGB. Сейчас нет, если бы это было лучше для процессора, оно бы выглядело лучше :)

,