Прослушиватель выводов GPIO в PI с использованием Java вызывает событие всплеска действия

В этой программе я могу прочитать вывод 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 ответа

Решение

Похоже, что API работает так, как и должно работать. Например, когда вы нажимаете кнопку, ток начинает течь к считывающему выводу взамен, и вывод будет продолжать получать HIGH, пока вы не отпустите кнопку. То, что вы должны сделать, это иметь состояние и контролировать прессу и выпуск.

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 можно установить продолжительность отката:

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 мс.

Другие вопросы по тегам