Arduino button logic

아두이노는, 특성상 digitalinput을 지속적으로 받기에 - 실시간으로 HIGH, LOW가 변하므로.... 버튼을 누를 때마다 상태가 보존되도록 하려면 별도의 flag를 부여하여 이 상태를 보존해줘야 해요.

인터넷에 잘못된 예제, 작동 안되는 예제가 많아, 한번 올려 보네요 ㅎㅎ


int ButtonPin = #;  // arduino button connect with pin number #
int Bflag = 0; // Bflag for button press
int buttonState = 0;  // check buttonstate

void setup() {
  pinMode(ButtonPin, INPUT); //set pin input
  Serial.begin(9600);// serial monitor with flag change
}


void loop() {
  photocellReading = analogRead(photocellPin);
  buttonState = digitalRead(ButtonPin);

  if (buttonState == HIGH && Bflag == 0) { // when no button pressed, make button on
    Bflag = 1;// Bflag 1 for first button press
    Serial.print(Bflag);

    while ( buttonState == HIGH) {
      buttonState = digitalRead(ButtonPin); //delay 0.2 sec to check button again
      delay(200);
    }
  }
   else if (buttonState == HIGH && Bflag == 1) { // when button pressed, make button off
    Bflag = 0;// Bflag 1 for first button press
    Serial.print(Bflag);

    while ( buttonState == HIGH) {
      buttonState = digitalRead(ButtonPin); //delay 0.2 sec to check button again
      delay(200);
    }
  }


  if (Bflag == 1) {
  // when button pressed, do a task
  }


}
위 소스를 보면 delay(200)을 넣은 것을 볼 수가 있는데요.
사람이 버튼을 누르고 떼는 데에는 약간의 시간이 걸리기에, Arduino로 들어가는 지속적인 버튼상태값을 일정 시간 동안 무시해야 할 필요가 있거든요.

보통 이 부분에서 실수를 많이 하는데, 주의하셔야 할 것입니다.

댓글 없음:

댓글 쓰기

글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.

모든 댓글은 검토 후 게시됩니다.

Translate