4

在这个程序中,我可以读取GPIO 引脚但是为单个事件按下硬件按钮(与按钮连接的GPIO引脚)会导致状态变化的爆发并导致动作事件的爆发......那么我怎样才能消除在一定时间段内同时发生的GPIO状态变化来消除这种情况爆裂。

final GpioController gpio = GpioFactory.getInstance();
GpioPinDigitalInput myButton = null;
try {
    myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02,PinPullResistance.PULL_DOWN);
} catch(GpioPinExistsException e) {
}

try {
    myButton.addListener(new GpioPinListenerDigital() {
        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
            if(event.getState().toString().equalsIgnoreCase("HIGH") || event.getState().toString().equalsIgnoreCase("LOW")) {
                System.out.println("Pressed");
            }
        }
    });
} catch(NullPointerException e2) {
}
4

2 回答 2

1

似乎 API 正在按应有的方式工作,例如,当您按下按钮时,电流将开始流向读取引脚作为返回,该引脚将继续获得 HIGH 事件,直到您释放按钮。你必须做的是有一个状态和控制新闻和发布。

try {
    myButton.addListener(new GpioPinListenerDigital() {

        private boolean pressed = false;
        private boolean released = false;

        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                String state = event.getState().toString();
                if (state.equalsIgnoreCase("HIGH")) {
                       pressed = true;
                       released = !pressed;
                } else {
                       released = true;
                       pressed = !released;
                }

                // Do what you want with it.
            }
        });
    } catch(NullPointerException e2) {

    }
于 2015-01-06T02:38:06.817 回答
0

我刚刚意识到可以在 GPIO 上设置去抖动持续时间:

myButton.setDebounce(1000); // 1000 ms

我会试试这个并报告我的发现。

带有解释的完整示例在这里:

https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/DebounceGpioExample.java

编辑

debounce(1000)调用本身似乎有效。我得到状态变化的频率不比ms.

然而,我最初的问题是,一旦我打开联系人,我的状态就会LOWHIGH它们现在仅每 1000 毫秒发生一次。

于 2017-01-17T08:21:23.127 回答