Бесконечный цикл serial.readString()
Хорошо, это мой код:
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()...
@tommy, 👍-1
2 ответа
Я точно не знаю, чего вы хотите, но если вы ожидаете, что после одной команды on
она будет повторяться 100 раз, вам нужно вызвать функцию redToBlue
в каждом цикле (внутри wait_command
, который проверяет наличие логического значения, была ли запрошена команда on
, и в этом случае вызывает функцию redToBlue
. Когда установлена команда off
, вы сбрасываете логическое значение.
Кроме того, wait_command
— не очень удачное название, поскольку оно не ожидает команды, а обрабатывает ее.
Функция loop()
— это та, которая будет вызываться при запуске программы и будет продолжать цикл, пока вы ее не остановите. Итак, на данный момент у вас есть loop()
, делающий следующее:
- Чтение строки из последовательного соединения
- Отображение сообщения при последовательном соединении
- Разбор прочитанной строки и выполнение действий с ней.
Итак, когда ваш код запускается, вы видите, что он печатает сообщение и, возможно, что-то делает со светом, а затем он останавливается/зависает. На самом деле он не заморожен, он ждет, пока вы введете ответ.
Итак, если вы действительно хотите, чтобы он спросил, что делать, а затем выполнил цикл 100 раз, вам нужно сделать следующее:
- Отобразить сообщение.
- Прочитайте данные.
- Вызовите
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. Сейчас нет, если бы это было лучше для процессора, оно бы выглядело лучше :)
- Мигните светодиодом 5 раз с помощью цикла for
- Как повторить другое действие внутри цикла?
- Как Arduino может выполнять несколько действий параллельно, не мешая друг другу?
- Выход из цикла while с помощью ИК-пульта для neopixel
- Сделать световые вспышки, пока шаговый двигатель постоянно движется.
- Arduino включение/затухание 5 светодиодов, схема действия
- Выполнить функцию цикла из основного цикла()
- Застрял в цикле While
да, я бы хотел, чтобы если я набираю цикл «вкл» 100 раз, и если я набираю «выкл», ничего не происходит, а светодиод rgb выключен., @tommy
Он также остановится до 100, если вы наберете «off», когда 100 циклов еще не достигнуты., @Michel Keijzers