2013-01-24 44 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更有益。所以新的邊緣相應地標記爲閱讀。