PI 中的 GPIO 引脚侦听器使用 java 导致突发动作事件
GPIO pin listener in PI using java cause a burst of action event
在这个程序中,我可以读取 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) {
}
似乎 API 正在正常工作,例如,当您按下按钮时,电流将开始流向 return 中的读取引脚,该引脚将保持打开状态得到一个高事件,直到你释放按钮。你要做的就是有一个状态,控制按下和释放。
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) {
}
我刚刚意识到可以在 GPIO 上设置 debounce-duration:
myButton.setDebounce(1000); // 1000 ms
我会试试这个并报告我的发现。
带解释的完整示例在这里:
https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/DebounceGpioExample.java
编辑
debounce(1000)
调用本身似乎有效。我获得状态变化的频率不超过 ms
.
中的值
然而,我最初的问题是,一旦我打开联系人,我的状态就会从 LOW
更改为 HIGH
和 vice-versa(突发)一直没有解决。它们现在仅每 1000 毫秒发生一次。
在这个程序中,我可以读取 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) {
}
似乎 API 正在正常工作,例如,当您按下按钮时,电流将开始流向 return 中的读取引脚,该引脚将保持打开状态得到一个高事件,直到你释放按钮。你要做的就是有一个状态,控制按下和释放。
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) {
}
我刚刚意识到可以在 GPIO 上设置 debounce-duration:
myButton.setDebounce(1000); // 1000 ms
我会试试这个并报告我的发现。
带解释的完整示例在这里:
https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/DebounceGpioExample.java
编辑
debounce(1000)
调用本身似乎有效。我获得状态变化的频率不超过 ms
.
然而,我最初的问题是,一旦我打开联系人,我的状态就会从 LOW
更改为 HIGH
和 vice-versa(突发)一直没有解决。它们现在仅每 1000 毫秒发生一次。