Pi4j Event Listener не запускается при изменении статуса GPIO - PullRequest
1 голос
/ 23 января 2020

У меня есть простая Java программа, которая должна прослушивать изменения статуса GPIO.
Я использую кнопку для изменения статуса GPIO, и из терминала я вижу, что она работает: enter image description here


Несмотря на это, прослушиватель событий никогда не запускается. Вот код:

public class GpioHandler
{
    private static final GpioController gpioController = GpioFactory.getInstance();
    public static ButtonsHandler buttons;

    public GpioHandler()
    {
        buttons = new ButtonsHandler(gpioController, RaspiPin.GPIO_05);
        buttons.listener();
    }
}
public class ButtonsHandler
{
    private static HashMap<String, GpioPinDigitalOutput> buttons = new HashMap<String, GpioPinDigitalOutput>();

    public ButtonsHandler(GpioController gpioController, Pin... pins)
    {
        for(int c = 0; c < pins.length; c++)
        {
            Integer index = c + 1;
            buttons.put(index.toString(), gpioController.provisionDigitalOutputPin(pins[c]));
        }
    }

    public void listener()
    {
        for(HashMap.Entry<String, GpioPinDigitalOutput> pin : buttons.entrySet())
        {
            pin.getValue().addListener(new GpioPinListenerDigital() {
                @Override
                public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event)
                {
                    System.out.println(" --> GPIO PIN STATE CHANGE: " + pin.getKey() + " = " + event.getState());
                }
            });
        }
    }
}

Я использую RaspberryPi 4 и последнюю версию Pi4j (1.2).
Есть предложения?

1 Ответ

0 голосов
/ 25 января 2020

Ладно, видимо, это была просто глупость.
Ошибка в том, что я использовал класс GpioPinDigitalOutput вместо GpioPinDigitalInput . Я изменил его, а также изменил эту строку

buttons.put(index.toString(), gpioController.provisionDigitalOutputPin(pins[c]));

на

buttons.put(index.toString(), gpioController.provisionDigitalInputPin(pins[c], PinPullResistance.PULL_DOWN));

, чтобы предотвратить смещение значения.
Теперь все работает просто отлично.

...