2013-01-24 39 views
0

我尝试了arduino并编程了一些按钮与状态切换。如果它是“开”,那么它会变成“关”,反之亦然。Arduino Serial.println奇怪的错误

#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);,但它不工作,然后!

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

非常感谢!

+0

我怀疑'Serial.println'是一个延迟。尝试用'delay'替换'Serial.println',例如'延迟(100);'。 – mttrb

回答

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)而不是按钮。

+0

令人难以置信!但是将代码简化为'int x = push1.read();'修复了整个事情!大同志! – 45RPM

1

mttrb是正确在于

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

是问题的根源。人们可以看到Arduino's web page of the library,它的例子可能最初错过领先。

digitalWrite(LED, bouncer.read()); 

值得注意尽管

int x = push1.read(); 

作为每库代码简单地是digitalread(buttonPin)的周期性读出;没有多少真正的好处。其中它通常是

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

注意到下降/ risingEdge()函数是有状态的,并且这些成员函数清除statechange更有益。所以新的边缘相应地标记为阅读。