2016-08-25 4 views
0

기능 :의 Arduino 버튼의 상태를 토글

사용자가 적색 돔 버튼을 누르면, 따라서 그것은 "제 프레스에 전환한다 (2 상태 버튼 아님) 0 "->"1 "& 다시"1 "->"0 "을 누를 때.

따라서, 누르면 직렬 모니터는 100ms마다 "0"부터 "1"을 인쇄합니다. 동작은 buttonState가 LOW에서 HIGH로 토글됨을 알립니다.

또한 LED 스트라이프도 arduino에 연결됩니다. 따라서 버튼 상태가 직렬 모니터에서 HIGH를 표시하면 LED 상태는 10 초 후에 HIGH로 전환되고 LOW 상태로 전환하기 전에 10 초 동안 HIGH 상태로 유지됩니다.

마지막으로 buttonState는 사용자가 물리적으로 버튼을 누르지 않고 지연 (25 초) 후에 HIGH에서 LOW로 전환해야합니다.

문제 :이 시점에서

는 사용자가 LOW & HIGH 상태 사이를 전환 할 수있는 붉은 돔 버튼을 눌러 있습니다. 따라서 버튼의 초기 상태가 LOW이면 시리얼 모니터에 "0"이 표시되고 버튼을 누르면 HIGH로 전환되고 시리얼 모니터에 "1"이 표시되며 다시 버튼을 누르면 HIGH에서 LOW로, 직렬 모니터에 "0"을 표시합니다.

따라서 단추를 누르지 않고도 buttonstate를 HIGH에서 LOW로 전환하는 방법에 대한 도움을 요청하고 싶습니다.

따라서 correctBehaviour :

초기 상태 "0"이 S 시리얼 모니터에 도시되며, 사용자가 버튼 buttonstate가 "1"직렬 모니터 및 25S의 카운트 후 도시 누르면, buttonstate는 사용자가 버튼을 다시 누르지 않아도 LOW로 전환됩니다.

코드 :

const int buttonPin = 2; //the number of the pushbutton pin 
const int Relay  = 4; //the number of the LED relay pin 

uint8_t stateLED = LOW; 
uint8_t  btnCnt = 1; 

int buttonState = 0; //variable for reading the pushbutton status 
int buttonLastState = 0; 
int outputState = 0; 

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

void loop() { 

    // read the state of the pushbutton value: 
    buttonState = digitalRead(buttonPin); 
    // Check if there is a change from LOW to HIGH 
    if (buttonLastState == LOW && buttonState == HIGH) 
    { 
    outputState = !outputState; // Change outputState 
    } 
    buttonLastState = buttonState; //Set the button's last state 

    // Print the output 
    if (outputState) 
{ 
     switch (btnCnt++) { 
     case 100: 
     stateLED = LOW; 
     digitalWrite(Relay, HIGH); // after 10s turn on 
     break; 

     case 200: 
     digitalWrite(Relay, LOW); // after 20s turn off 
     break; 

     case 202: // small loop at the end, to do not repeat the LED cycle 
     btnCnt--; 
     break;  
     } 

     Serial.println("1"); 
    }else{ 
    Serial.println("0"); 
    if (btnCnt > 0) { 
     // disable all: 
     stateLED = LOW; 
     digitalWrite(Relay, LOW); 
    } 
    btnCnt = 0; 
    } 

    delay(100); 
} 

답변

0

나는 코드가 거의 정확한 것 같다.

경우 200 : 출력 상태를 토글하여 기본 상태로 되돌릴 수 있습니다. BTW

: 당신이 당신의 100 개 밀리 간격이 아닌 버튼을 누르거나 유사한 계산으로 btncnt는 잘못된 이름입니다.

IMO, 지연 (100);는 허용 타협 : 여전히 버튼 누름에 반응하지만하지 않고 제대로 경우 (밀리 세컨드() -> 20000 lastpressed)를 사용하여 당신에 의해 "하지만 제대로 그 일을하는 경우 사용하지 않고 무엇을 의미합니까 { ...

+0

을 (millis() - lastpressed> 20000) {... ", 지연 (100)은 모든 버튼 누름을 확인하는 것입니다. 죄송합니다. 실제로 의미가 없습니다. – Luke

+0

BlinkWithoutDelay 예제를 읽고 연습하고 이해하십시오. https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.그것은 단지 깜빡임에 관한 것이 아니라 모든 비 차단 대기에 관한 것입니다. – datafiddler

관련 문제