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);