我阅读我的串行和打印,以确保条目是正确的。当"red"、"green"或"blue" (键入没有引号)时,所有的比较都不起作用。印刷线显示正确的颜色。硬件所有检查与最后一个else闪烁的颜色正确。
我试过if (myColor == "red")和if (myColor.equals("red"),没有一种颜色有效。
我替换了String x="red",然后替换了if (x.equals("red")),它就像预期的那样工作。我知道问题在于对myColor的串行读取。我只是想不出怎么让它起作用。
代码:
int redPin=8;
int greenPin=9;
int bluePin=10;
String myColor;
String msg="What color do you want? ";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
Serial.println(msg);
while (Serial.available()==0){
}
myColor=Serial.readString();
Serial.println(myColor); //check to see that it was entered correctly
if (myColor == "red"){
digitalWrite(redPin, LOW);
digitalWrite(bluePin, HIGH);
digitalWrite(greenPin, LOW);
}
else if (myColor == "green"){
digitalWrite(redPin, LOW);
digitalWrite(bluePin, LOW);
digitalWrite(greenPin, HIGH);
}
else if (myColor == "blue"){
digitalWrite(redPin, LOW);
digitalWrite(bluePin, HIGH);
digitalWrite(greenPin, LOW);
}
else {
for (int x = 0; x < 3; x++){
digitalWrite(redPin, HIGH);
delay (500);
digitalWrite(redPin, LOW);
delay (500);
digitalWrite(bluePin, HIGH);
delay (500);
digitalWrite(bluePin, LOW);
delay (500);
digitalWrite(greenPin, HIGH);
delay (500);
digitalWrite(greenPin, LOW);
delay(500);
}
}
}发布于 2020-08-17 02:27:57
将检查代码更改为如下所示:
String x = String("[") + myColor + String("]");
Serial.println(x);
Serial.println(myColor.length());您的字符串很有可能包含其他内容,例如换行符或空格。如果是这样的话,您将看到如下输出:
[red ]
[ red]
[red
]而不是单行[red]。第二个println也输出用于验证的长度,以确保red匹配3,blue匹配4,等等。
最后两件事:
digitalWrite(redPin,LOW);digitalWrite(greenPin,LOW);digitalWrite(bluePin,HIGH);
red代码块当前与blue相同,您可能应该使用以下内容:digitalWrite(bluePin,LOW);digitalWrite(greenPin,LOW);digitalWrite(redPin,HIGH);
在上面的第一个要点上,您可以通过一些重构来简化代码,比如引入一个函数来选择哪一个引脚:
void offOffOn(int offA, int offB, int on) {
digitalWrite(offA, LOW);
digitalWrite(offB, LOW);
digitalWrite(on, HIGH);
}然后,您的loop()部分变得更短(还有一个“压缩”else子句):
if (myColor == "red") {
offOffOn(greenPin, bluePin, redPin);
} else if (myColor == "green") {
offOffOn(redPin, bluePin, greenPin);
} else if (myColor == "blue") {
offOffOn(redPin, greenPin, bluePin);
} else {
int allPins[] = { redPin, bluePin, greenPin };
size_t pinCount = sizeof(allPins) / sizeof(*allPins);
for (int count = 0; count < pinCount * 3; ++count) {
digitalWrite(allPins[idx % pinCount], HIGH); delay (500);
digitalWrite(allPins[idx % pinCount], LOW); delay (500);
}
}发布于 2020-08-17 20:05:26
readString是一个可怕的函数,不应该使用。
它使代码运行缓慢(响应速度慢),并按时间分隔消息。
默认情况下,在返回之前,它等待1秒才能到达任何数据。在此之后,它将返回发送的所有内容。
如果您一个接一个地发送"red"和"green",则myColor将是"red\ngreen\n",除非您在间隔超过1秒的情况下慢慢来。
即使你收到一条单行,在结尾仍然会有一个新的行字符。
你应该使用readStringUntil
myColor = Serial.readStringUntil('\n');它将使您的代码响应性更强,并返回没有新行字符的行。
只需确保串行监视器只发送一个新行字符("Newline“选项)。
https://stackoverflow.com/questions/63443757
复制相似问题