Pi4j & Wiringpi
Raspberry for Java 的Pi4j寫法, 皆以com.pi4j.io.* 為主, 一開始需使用
GpioController gpio=GpioFactory.getInstance(); 然後再由gpio.provisionDigitalOutputPin()取得每支針腳的物件, 再進行控制
wiringpi SDK的寫法, 顯個更為精簡, 而且是更加的精確了
1. Gpio.wiringPiSetup()
初始化所有的GPIO針腳
if (Gpio.wiringPiSetup() == -1) { System.out.println(" ==>> GPIO SETUP FAILED"); return; }
2. Gpio.pinMode(Pin, Gpio.OUTPUT)
設定針腳的輸入/輸出 模式
Gpio.pinMode(5, Gpio.INPUT); Gpio.pinMode(6, Gpio.OUTPUT);
3. GpioInterrupt.enablePinStateChangeCallback(PIN_NUMBER);
允許某支針腳觸發後, 進行回調作業
4. GpioInterrupt.disablePinStateChangeCallback(PIN_NUMBER)
禁止針腳的回調作業,
5. GpioInterrupt.addListener 設定回調作業
上述 enablePinStateChangeCallback後, 需產生GpioInterruptListener物件, 再將要運作的任務寫在裏面即可.
GpioInterrupt.addListener(new GpioInterruptListener() { @Override public void pinStateChange(GpioInterruptEvent event) { System.out.println("Raspberry Pi PIN [" + event.getPin() +"] is in STATE [" + event.getState() + "]"); switch(event.getPin()){ case 7: Gpio.digitalWrite(6, event.getStateValue()); break; case 0: Gpio.digitalWrite(5, event.getStateValue()); break; } });
GpioInterruptListener 為一介面, 而且是SAM(Single Abstract Method), 裏面只有
abstract public void pinStateChange(GpioInterruptEvent event) 抽象方法
所以可以改成Lambda的語法
GpioInterrupt.addListener((event)->{ System.out.printf("PIN %s is in State %s",event.getPin(), event.getState()); switch(event.getPin()){ case 0: closeFlag=true; System.out.println("Game over"); break; case 1: break; } });
速度
使用不同的語言, 執行的速度也不同, 網路上有人寫了一個無窮迴圈, 迴圈只進行LED的點亮與關閉, 測得的數據如下
語言 | 速度 |
C | 13.9MHZ |
wiringpi Java | 2.4MHZ |
Pi4j Java | 1.65MHZ |
Python | 321.6KHZ |
Shell | 192.2HZ |
由上表即可知, 使用Python是件很白痴的事