使用java的PI中的GPIO引脚监听器会导致一连串的动作事件

时间:2015-01-06 02:24:31

标签: java raspberry-pi gpio pi4j

在这个程序中,我可以读取 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 个答案:

答案 0 :(得分:1)

似乎API正在工作,因为它应该工作,例如,当您按下按钮时,电流将开始流向读取引脚,返回引脚将保持亮起,直到您释放按钮。你必须做的是拥有一个状态并控制按下并释放。

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

    }

答案 1 :(得分:0)

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

myButton.setDebounce(1000); // 1000 ms

我会试一试并报告我的发现。

完整的解释示例如下:

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

修改

debounce(1000)调用本身似乎有效。我的状态更改频率不会超过ms中的值。

然而,我的初始问题是,一旦我打开联系人,状态从LOW变为HIGH,反之亦然(爆发)一直没有解决。它们现在只发生在1000毫秒。