너무 많은 이벤트가 발생하는 푸시 버튼


12

LCD 디스플레이에 정보를 기록하는 mp3 플레이어를 작성 중입니다. 키보드를 사용하여 푸시 버튼을 사용하도록 변환하고 싶지만 키 누름이 계속 많이 발생합니다. 풀업 및 하강 / 상승 에지를 시도했지만 여전히 동일한 결과를 얻습니다. 이 문제가 알려진 문제인지 아니면 내가 잘못한 것입니까? 아, 나는 이것을 전적으로 C에서 wirePi를 사용하여하고 있습니다.


1
소프트웨어 솔루션에 추가하기 위해 마이크로 컨트롤러에서 친구를 확인하십시오. arduino.cc/en/Tutorial/Debounce
Cammy_the_block

여기에 내가 쓴 글의 발췌 문장이 있습니다. if(digitalRead(data) && millis()-startTime > 10){for 루프에 들어갈 때마다 startTime을 설정하십시오.
Cammy_the_block

그냥 궁금해; startTime을 정확히 무엇으로 설정합니까?
linuxgnuru

일종의 시간 카운터. Arduino에는 시작 이후 시간을 제공하는 함수 millis가 있습니다.
Cammy_the_block

확인 아, 그래서 wiringPi 않습니다 wiringpi.com/reference/timing
linuxgnuru에게

답변:


12

기계식 버튼과 스위치는 스위치 바운스로 인해 몇 밀리 초 동안 열림과 닫힘 사이에서 빠르게 전환됩니다.

소프트웨어 또는 하드웨어에서 버튼 / 스위치를 제거 할 수 있습니다.

아마도 가장 간단한 소프트웨어 일 것입니다.

레벨이 변경되면 (켜짐에서 꺼짐 또는 꺼짐에서 켜짐으로) x 밀리 초 동안 기다렸다가 gpio를 다시 읽습니다. 여전히 새로운 상태 인 경우 실제 전환이라고 가정합니다. x의 값은 20과 같습니다.

하드웨어 솔루션의 경우 이런 종류의 게시물을 찾으십시오.


8

Jack Ganssle의 debouncing guide 를 읽으십시오 . 첫 번째 페이지는 문제를 자세하게 설명하고 두 번째 페이지는 하드웨어 또는 소프트웨어에서 문제를 처리하는 방법을 보여줍니다. '완벽한'디 바운스 방법은 없지만 많은 나쁜 방법이 있습니다!

소프트웨어와 스위치를 연결하면 반복적으로 문제가 발생하므로 이해하는 데 시간이 걸리며 Jack의 기사는 내가 본 가장 간결한 방법입니다.


2

시스템 시세가있는 응용 프로그램에서는 일반적으로 시프트 레지스터를 구현합니다.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

물론, 버튼 누르기 이벤트는 상승 에지에서만 수행해야합니다.


1
흥미로운 방법입니다. 다양한 수의 연속 읽기가 필요하도록 쉽게 사용자 정의 할 수 있습니다 (button_checker의 최상위 비트를 마스킹하여).
joan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.