首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino快速思考

Arduino快速思考
EN

Stack Overflow用户
提问于 2015-03-18 12:47:06
回答 3查看 69关注 0票数 0

我正在尝试得到一个rgb颜色的LED来改变每一个按钮按下每种颜色。因为arduino的处理速度太快了,所以我遇到了很大的困难。我想让它在改变变量"state“之前等待按钮被释放。它现在所做的是,当按钮被按下时,它会立即将状态从1变为2再变为3。我希望只有当我松开按钮时它才会改变。谢谢你的尝试。

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

发布于 2015-03-18 15:15:29

首先,你必须正确地识别按钮状态的变化。您可以使用ClickButton之类的库,也可以编写自己的库。看看按钮更改状态的Arduino Example

一旦你有了正确的按钮状态识别,你就可以很容易地使用条件(开关,if-else等)来实现你的LED行为。

票数 0
EN

Stack Overflow用户

发布于 2015-03-20 23:00:16

最简单的方法就是抓取按钮的当前状态,并将其与按钮的前一状态进行比较。如果它们不同,则按钮状态已更改,您可以做出相应的响应。

类似于:

代码语言:javascript
复制
int prevButtonState = 0;

void loop()
{
    int buttonState = digitalRead(pushButton);
    if (buttonState != prevButtonState)
    {
        // Button state has changed - do something useful
        // ...

        prevButtonState = buttonState;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-21 02:22:19

在Arduino中,loop是应该持续运行的东西。此外,digitalRead(int)的输出是常量值LOWHIGH,它们恰好被定义为01

在您的循环中有两种情况:state = LOW = 0state = HIGH = 1

第一个案例state = 0

在这种情况下,只有最后的if语句与state的值匹配,并且是唯一运行的if语句,这将关闭灯光。然后,loop()的其余部分运行打印0

第二个案例state = 1

在这种情况下,将运行第一个if语句。指示灯变为红色,state1增加,因此state = 2。没有什么可以阻止代码继续执行,所以它会立即转到下一个if语句。

第二个if语句匹配,因为state为2。if语句运行。灯变蓝了。此外,state变为4。代码继续运行。

第三个和第四个if语句不应运行,因为state为4。指示灯应保持为蓝色,并且应输出4

在这两种情况下,循环都会持续运行。

建议:-变量state应该是全局的-应该有一个初始化为LOW的全局变量lastButtonState

代码:

代码语言:javascript
复制
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>;行。

这只是一个开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29114329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档