簡體   English   中英

Raspberry Pi Java按鈕按下的程序顯示了2次按鈕按下以進行某些按下

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM