Pi4j Анемометр - счетчик за интервал

Я пытаюсь использовать цифровой анемометр для работы с моим малиновым PI с pi4j.

Моя идея была добавить GpioPinListenerDigital контролировать, когда булавка становится высокой (означает 1 полное вращение анемометра), но у меня не может быть, чтобы это работало... Я хотел бы установить интервал для отслеживания прерываний, но безуспешно...

Это мой основной класс

public class Main {

public static void main(String[] args) throws InterruptedException {

    Anemometer anemometer;

    int rotations = 0;
    System.out.println("Start");
    while(true){
        rotations = Anemometer.countPulse();

        System.out.println("Rotations "+ rotations);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


}

}

Это просто называют Анемометр, который

public class Anemometer {

final static int short_interval = 3;
static int final_counter = 0;

public static int countPulse() {
    GpioController gpio = GpioFactory.getInstance();
    GpioPinDigitalInput input = gpio.provisionDigitalInputPin(RaspiPin.GPIO_01, PinPullResistance.PULL_DOWN);
    input.addListener(new GpioPinListenerDigital() {

        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
            long start = System.currentTimeMillis();
            long end = 0L;
            int counter = 0;
            while (end < short_interval * 1000) {
                System.out.println("Inizio while");
                if (event.getState().isHigh()) {
                    System.out.println("Pin state: " + event.getState());
                    counter++;

                }
                end = (new Date()).getTime() - start;
            }
            final_counter = counter;
            System.out.println("final counter: "+final_counter);
        }

    });

    gpio.unprovisionPin(input);
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return final_counter;
}

}

Похоже, что он никогда не входит в цикл while... Есть идеи?

1 ответ

Я не знаком с этим API, но очевидно, что вы не даете слушателю достаточно времени для увольнения. Вот код для GpioControllerImpl.unprovisionPin:

public void unprovisionPin(GpioPin... pin) {
    if (pin == null || pin.length == 0) {
        throw new IllegalArgumentException("Missing pin argument.");
    }
    for (int index = (pin.length-1); index >= 0; index--) {
        GpioPin p  = pin[index];

        // ensure the requested pin has been provisioned
        if (!pins.contains(p)) {
            throw new GpioPinNotProvisionedException(p.getPin());
        }
        // remove all listeners and triggers
        if (p instanceof GpioPinInput) {
            ((GpioPinInput)p).removeAllListeners();
            ((GpioPinInput)p).removeAllTriggers();
        }

        // remove this pin instance from the managed collection
        pins.remove(p);
    }        
}

Обратите внимание removeAllListeners вызов. По сути, вы добавляете слушателя, а затем немедленно удаляете его в своем коде. Попробуйте позвонить gpio.unprovisionPin(input); после ожидания 200мс.

try {
    Thread.sleep(200);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
gpio.unprovisionPin(input);
Другие вопросы по тегам