2014-02-05 47 views
0

我有Raspberry Pi rev。 2(512MB RAM版本)。我有一些通過Pi4J控制的LED。除了我連接/連接到引腳21/27的LED之外,每個LED都工作。我已經改變了LED,看看有沒有損壞,但沒有損壞。 我在google上做過一些調查,發現this。不幸的是,我找不到將Pin21更改爲27的方法,因爲Pi4j使用另一種編號方案。 (對於編號參見herePin 21/27不適用於Pi4j

在我的代碼我無法找到一個錯誤,但它看起來像這樣:

包GPIO;

import com.pi4j.io.gpio.GpioController; 
import com.pi4j.io.gpio.GpioFactory; 
import com.pi4j.io.gpio.GpioPinDigitalOutput; 
import com.pi4j.io.gpio.RaspiPin; 

public class GPIOController { 

    final long second = 1000L; 

    final GpioController gpio = GpioFactory.getInstance(); 

    final GpioPinDigitalOutput red_1 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_03); 
    final GpioPinDigitalOutput red_2 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_02); 

    final GpioPinDigitalOutput yellow_1 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_00); 
    final GpioPinDigitalOutput yellow_2 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_07); 

    final GpioPinDigitalOutput green_1 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_06); 
    final GpioPinDigitalOutput green_2 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_05); 
    final GpioPinDigitalOutput green_3 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_04); 
    final GpioPinDigitalOutput green_4 = gpio 
     .provisionDigitalOutputPin(RaspiPin.GPIO_01); 

    public GPIOController() { 
     gpio.shutdown(); 
    } 

    // level 1 = red_1, level 8 = green_4 
    public void pulse(int level) { 
     allLow(); 
     switch(level) { 
     case 1: 
      red_1.pulse(second); 
      break; 
     case 2: 
      red_2.pulse(second); 
      break; 
     case 3: 
      yellow_1.pulse(second); 
      break; 
     case 4: 
      yellow_2.pulse(second); 
      break; 
     case 5: 
      green_1.pulse(second); 
      break; 
     case 6: 
      green_2.pulse(second); 
      break; 
     case 7: 
      green_3.pulse(second); 
      break; 
     case 8: 
      green_4.pulse(second); 
      break; 
     } 
    } 

    public void high(int level) { 
     allLow(); 
     switch(level) { 
     case 1: 
      red_1.high(); 
      break; 
     case 2: 
      red_2.high(); 
      break; 
     case 3: 
      yellow_1.high(); 
      break; 
     case 4: 
      yellow_2.high(); 
      break; 
     case 5: 
      green_1.high(); 
      break; 
     case 6: 
      green_2.high(); 
      break; 
     case 7: 
      green_3.high(); 
      break; 
     case 8: 
      green_4.high(); 
      break; 
     } 
    } 

    public void allLow() { 
     gpio.shutdown(); 
    } 

} 

我呼籲通過這個類中的方法:

package connection; 

import gpio.GPIOController; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Receiver { 

    private ServerSocket server; 
    private Socket client; 
    private DataInputStream clientIn; 
    private DataOutputStream clientOut; 

    private GPIOController gpioController = new GPIOController(); 

    public Receiver(int port) throws IOException { 
     server = new ServerSocket(port); 
     listenForClient(); 
    } 

    // client listener in a new thread 
    public void listenForClient() { 
     Runnable listener = new Runnable() { 
      public void run() { 
       while (true) 
        try { 
         // only the most recently connected client 
         // can control the LEDs 
         client = server.accept(); 
        } catch (IOException e) { 
         e.printStackTrace(System.out); 
        } 

      } 
     }; 
     Thread listenerThread = new Thread(listener); 
     listenerThread.setName("Client Listener"); 
     listenerThread.start(); 
    } 

    // command listener in a new thread 
    public void listenForCommands() { 
     final Runnable listener = new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         if (client != null) { 
          DataInputStream clientIn = new DataInputStream(
           client.getInputStream()); 
          String msg = clientIn.readUTF(); 
          handleMessage(msg); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(System.out); 
        } 
       } 
      } 
     }; 
     Thread listenerThread = new Thread(listener); 
     listenerThread.setName("Command Listener"); 
     listenerThread.start(); 
    } 

    public void handleMessage(String msg) { 
     String[] command = msg.split(" "); 
     String commandType = command[0]; // "pulse" or "permanent" 
     for (int i = 1; i < command.length; i++) { 
      try { 
       if (commandType.equals("pulse")) 
        gpioController.pulse(Integer.parseInt(command[i])); 
       else 
        gpioController.high(Integer.parseInt(command[i])); 
      } catch (Exception e) { 
       try { 
        clientOut = new DataOutputStream(client.getOutputStream()); 
        clientOut.writeUTF(e.getMessage()); 
       } catch (IOException ioe) { 
        ioe.printStackTrace(System.out); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     try { 
      new Receiver(8374).listenForCommands(); 
     } catch (IOException e) { 
      e.printStackTrace(System.out); 
     } 
    } 

} 

有什麼我可以做的就是該引腳工作(包括快速&骯髒的解決方案)?順便一提;我不想使用P5引腳,因爲我使用了PiCobbler。我也想爲此使用Java。 在此先感謝。

Selim

+1

你可以試試http://raspberrypi.stackexchange.com/ – Andrew

+0

@安德魯謝謝!我甚至不知道有一個特別的樹莓網站 – Selim

回答

0

所以,這是一個與我猜想的發行版有關的bug。 sudo apt-get dist-upgrade修復了它。

相關問題