[英]Raspberry Pi java button pressed program showing 2 button pushes for some pushes
我正在為樹莓派制作一個基本的Java程序,該樹程序會在按下按鈕,按鈕編號及其按下時進行打印。 我的2個代碼類在下面,但是從輸出中可以看到,有時它顯示按鈕被按下兩次一次按下。
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
public class Button {
private GpioPinDigitalInput buttonPin;
boolean pressed = false;
public Button(GpioController gpio, Pin pin) {
// Provision the pin
buttonPin = gpio.provisionDigitalInputPin(pin, PinPullResistance.PULL_UP);
// Add a listener to the button
buttonPin.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
if(event.getState().isLow()) {
pressed = true;
// When Button is not pressed
GPIOTest.print(event.getPin() + ", pressed");
}
}
});
}
}
2級
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.util.Console;
public class GPIOTest {
private final static Console console = new Console();
private final static GpioController gpio = GpioFactory.getInstance();
private static Pin[] pinList = { RaspiPin.GPIO_00,
RaspiPin.GPIO_01,
RaspiPin.GPIO_02,
RaspiPin.GPIO_03,
RaspiPin.GPIO_04};
public static void main(String args[]) throws InterruptedException {
console.title("Test GPIO");
console.promptForExit();
for (Pin pin : pinList) {
new Button(gpio, pin);
}
console.waitForExit();
}
public static void print(String message) {
console.println(message);
}
}
可能是一個防抖動問題。 在開關穩定到接地狀態之前,如果按下按鈕,則按鈕按下可能會接地,拉高並重新接地幾次。
有幾種常見的去抖動算法。 您可以在第一次更改后多次讀取狀態,並且僅在很短的延遲后連續報告多個“ 0”時才報告“按下”。 如果您四處搜索Google,則還有更復雜的算法。
祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.