2013-01-03 101 views
1

我正在研究Arduino的閃爍/衰落燈程序。我試圖建立一些基於LED狀態和某些開關組合的交互性。考慮:按下某個按鈕時,如果指示燈亮起,我想將其關閉,如果指示燈熄滅,我想將其打開。Arduino如何檢測LED的狀態?

但是,我一直未能找到有關確定LED狀態的任何信息。最近的是關於Android的this question,但我試圖找出我是否可以從Arduino平臺上做到這一點。有沒有人有任何實際經驗或建議?

回答

4

您有幾種選擇:

一,你可以存儲LED狀態布爾值,並按下按鈕,否定這一點,把它寫在LED端口:

void loop() 
{ 
    static int ledState = 0; // off 
    while (digitalRead(BUTTON_PIN) == 0) 
     ; // wait for button press 

    ledState = !ledState; 
    digitalWrite(LED_PORT, ledState); 
} 

二,如果您不介意直接訪問AVR的端口:

void init() 
{ 
    DDRD = 0x01; // for example: LED on port B pin 0, button on port B pin 1 
    PORTB = 0x00; 
} 

void loop() 
{ 
    while (PINB & 0x02 == 0) 
     ; // loop until the button is pressed 

    PORTB ^= 0x01; // flip the bit where the LED is connected 
} 
+0

到AVR端口直接訪問是更加希望的。關於代碼的問題,儘管 - 仍然是一個編碼新手。 :) DDRD&PORTB ...是那些Arduino常量?任意變量名稱?十六進制值是否代表引腳號?例如,引腳8上的LED將被表示爲「PORTB = 0x08」?如何確定引腳是否在「B端口」?謝謝! – dwwilson66

+0

@ dwwilson66這些是在''中聲明的常量。十六進制值表示作爲位掩碼的引腳號。即引腳X是'1 << x',所以引腳8(呃,引腳7)是'1 << 7 = 128 = 0x80'。確定哪個引腳在哪個端口上? AVR數據表。 – 2013-01-03 13:27:43

+0

硬件常量...明白了。今天晚些時候我會更深入地研究數據表!非常感謝幫助我理解它! – dwwilson66

3

讀取輸出端口是絕對可以的。那就是

digitalWrite(LED_PORT, !digitalRead(LED_PORT)); 

會切換引腳。

您也可能要考慮切換庫:http://playground.arduino.cc/Code/DigitalToggle

+2

謝謝!簡單而優雅。我將在稍後閱讀切換庫。 Avesome頭像。 :) – dwwilson66

+0

簡單,優雅,沒有upvotes ... :( –