0

我正在尝试 arduino 并编写了一些带有状态开关的按钮。如果它是“开”的,那么它会变成“关”,反之亦然。

#include <Bounce.h>

const int buttonPin = 2;     
const int ledPin =  6;      

int ledState = HIGH;     
int a = LOW;            
int b = LOW;  
Bounce push1 = Bounce( buttonPin,5 );

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  push1.update ( );
  int x = digitalRead(push1.read());
  if (x != b) {
    if (x == HIGH) {
      if (a == HIGH) {
        a = LOW;
        }
        else {
          a = HIGH;
        }
  }
  else {
    }
  }

digitalWrite(ledPin, a);
Serial.println(a);  // Weird thing
b = x;
}

它工作得很好,但奇怪的是,当我编程时,我添加了一些串行打印来监视通过 COM 的输出。然后在一切正常之后我想消除Serial.println(a);但它不起作用!

循环根本不响应我的按钮按下。我错过了什么吗?什么可能导致这种事情?也许我错过了什么,所以新鲜的眼睛会很棒:)

非常感谢!

4

2 回答 2

2

您正在通过调用 读取按钮的状态digitalRead(push1.read())

这几乎肯定是不正确的(但我没有使用 Bounce 库)。push1.read()正在读取按钮的状态,大概是 HIGH (0x1) 或 LOW (0x0)。然后,此按钮状态值被用作在对 的调用中读取的引脚digitalRead。因此,在我看来,您正在读取引脚 0 或 1 的状态,而不是按钮所在的引脚 2。如果我没记错引脚 0 和 1 是硬件串行端口。

改变:

int x = digitalRead(push1.read());

到:

int x = push1.read();

看看是否效果更好。

我怀疑这Serial.println(a)是一个红鲱鱼,它肯定会起到延迟的作用。串行端口和您的代码之间可能会发生奇怪的交互,因为我相信您正在x从串行端口而不是按钮读取“按钮状态”()。

于 2013-01-24T08:50:18.270 回答
1

mttrb 是正确的

int x = digitalRead(push1.read());

是问题的根源。可以在Arduino 的图书馆网页上看到,它的示例最初可能是错误的。

digitalWrite(LED, bouncer.read());

值得注意的是,虽然

int x = push1.read();

根据图书馆代码,只是定期读取 digitalread(buttonPin); 没有多少真正的好处。通常对哪些地方更有利

if (push1.fallingEdge()) {
...

注意falling/risingEdge() 函数是有状态的,并且这些成员函数清除状态变化。以便相应地标记新边缘以供读取。

于 2013-01-24T14:22:36.570 回答