我正在尝试得到一个rgb颜色的LED来改变每一个按钮按下每种颜色。因为arduino的处理速度太快了,所以我遇到了很大的困难。我想让它在改变变量"state“之前等待按钮被释放。它现在所做的是,当按钮被按下时,它会立即将状态从1变为2再变为3。我希望只有当我松开按钮时它才会改变。谢谢你的尝试。
int pushButton = 7;
int r = 2;
int g = 3;
int b = 4;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
}
void loop() {
int state = digitalRead(pushButton);
if (state == 1) {
digitalWrite(r, HIGH);
state = state + 1;
}
if (state == 2) {
digitalWrite(b, HIGH);
digitalWrite(r, LOW);
state = state + 2;
}
if (state == 3) {
digitalWrite(b, LOW);
digitalWrite(r, LOW);
digitalWrite(g, HIGH);
}
if (state == 0) {
digitalWrite(r, LOW);
digitalWrite(b, LOW);
digitalWrite(g, LOW);
}
Serial.println(state);
delay(1);
}发布于 2015-03-18 15:15:29
首先,你必须正确地识别按钮状态的变化。您可以使用ClickButton之类的库,也可以编写自己的库。看看按钮更改状态的Arduino Example。
一旦你有了正确的按钮状态识别,你就可以很容易地使用条件(开关,if-else等)来实现你的LED行为。
发布于 2015-03-20 23:00:16
最简单的方法就是抓取按钮的当前状态,并将其与按钮的前一状态进行比较。如果它们不同,则按钮状态已更改,您可以做出相应的响应。
类似于:
int prevButtonState = 0;
void loop()
{
int buttonState = digitalRead(pushButton);
if (buttonState != prevButtonState)
{
// Button state has changed - do something useful
// ...
prevButtonState = buttonState;
}
}发布于 2015-03-21 02:22:19
在Arduino中,loop是应该持续运行的东西。此外,digitalRead(int)的输出是常量值LOW和HIGH,它们恰好被定义为0和1。
在您的循环中有两种情况:state = LOW = 0或state = HIGH = 1
第一个案例state = 0
在这种情况下,只有最后的if语句与state的值匹配,并且是唯一运行的if语句,这将关闭灯光。然后,loop()的其余部分运行打印0。
第二个案例state = 1
在这种情况下,将运行第一个if语句。指示灯变为红色,state由1增加,因此state = 2。没有什么可以阻止代码继续执行,所以它会立即转到下一个if语句。
第二个if语句匹配,因为state为2。if语句运行。灯变蓝了。此外,state变为4。代码继续运行。
第三个和第四个if语句不应运行,因为state为4。指示灯应保持为蓝色,并且应输出4。
在这两种情况下,循环都会持续运行。
建议:-变量state应该是全局的-应该有一个初始化为LOW的全局变量lastButtonState
代码:
loop () {
int buttonState = digitalRead(pushButton);
if (buttonState != lastButtonState) { // a change
if (buttonState == LOW) { // button realeased
state = state + 1;
if (state >= 4) state = 0;
}
}
lastButtonState = buttonState;
...您可以保留其余代码,但删除state = state + <number>;行。
这只是一个开始。
https://stackoverflow.com/questions/29114329
复制相似问题