在这个程序中,我可以读取 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) {
}
答案 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毫秒。