使用Java在树莓派上监听GPIO引脚会导致一系列的动作事件。

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) {
}
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) {

    }

我尝试了你的示例代码,但仍然有大量的突发情况。只要电路关闭,就没有问题。但是一旦我打开它,就会一直出现状态变化(LOW / HIGH)。我使用最新的Raspbian和提供的(旧)Oracle java 1.8.0_65以及pi4j 1.0在Pi3上运行。 - yglodt

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 毫秒发生一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接