我创建了这个项目,这样当我按下按钮时,它会使我的面包板上的三个LED闪烁。问题是,只要我将其按下一次,即使我松开按钮,LED也不会停止闪烁。我很确定问题是程序只读取按钮状态一次然后继续执行程序的其余部分。有没有办法每十分之一秒更新一次按钮?或者,如果有其他方法来解决它,请随时回复。这是我的代码(不是我知道的最漂亮):
//Assigns button to digital pin 4
int buttonPin = 4;
void setup() {
//sets pins 1-3 as output pins
for (int ledPin= 1; ledPin <= 3; ledPin++) {
pinMode(ledPin, OUTPUT);
}
//sets the button pin as a button
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
//puts button state into variable "button"
int button = digitalRead(buttonPin);
//while button is pushed, blink leds in order
while (button == LOW) {
for (int ledPin = 1; ledPin <= 3; ledPin++) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
}
//while button is not pushed, turn off leds
while (button == HIGH) {
for (int ledPin = 1; ledPin <= 3; ledPin++) {
digitalWrite(ledPin, LOW);
}
}
}
答案 0 :(得分:0)
问题就像你说的那样,你只是在循环开始时读取按钮状态,然后输入一段时间不能退出,因为button
永远不会再次更新。由于loop()
函数在Arduino运行时运行(当然在setup()
之后),因此您可以将代码更新为:
void loop() {
//puts button state into variable "button"
int button = digitalRead(buttonPin);
//if button is pushed, blink leds in order
if (button == LOW) {
for (int ledPin = 1; ledPin <= 3; ledPin++) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
}else if (button == HIGH) { //if button is not pushed, turn off leds
for (int ledPin = 1; ledPin <= 3; ledPin++) {
digitalWrite(ledPin, LOW);
}
}
}
这样做是检查按钮的状态,然后按下它是否会闪烁LED,否则将它们全部关闭。您不需要while循环,因为loop()
会在完成后再次运行,因此您将获得对您的操作的持续响应。或者,如果你想让它在闪光周期中释放按钮使它停止,你可以在第一个for循环中添加这样的东西:
button = digitalRead(buttonPin);
if(button == HIGH) break;
当LED指示灯闪烁时,再次检查按钮,如果按钮被释放,它将退出for循环。话虽这么说,因为你有延迟,它可能会错过你释放然后重新按下按钮,如果这发生在500毫秒延迟。
希望对你有帮助!