# **GPIO**
**通用輸入/輸出(GPIO)** 引腳提供了可編程的接口,來讀取二進制輸入設備的狀態(如開關按鈕)或者控制二進制輸出設備的開關狀態(例如LED等);
你可以配置GPIO引腳為具有高低狀態的輸入或者輸出。作為輸入,外部源決定這個狀態,你的app可以讀取當前的值或者對狀態的變化做出反應。作為輸出,你的app配置引腳的狀態;
> 注意:為了避免損壞GPIO引腳,在連線導線之前閱讀你的硬件的輸入和輸出限制;
## 管理連接
為了打開GPIO端口的連接,你需要知道端口的唯一名稱。在開發的初期或者應用程序移植到新的硬件時,通過PeripheralManagerService使用getGpioList()獲取所有可用端口的名字是非常有用的;
~~~
PeripheralManagerService manager = new PeripheralManagerService();
List<String> portList = manager.getGpioList();
if (portList.isEmpty()) {
Log.i(TAG, "No GPIO port available on this device.");
} else {
Log.i(TAG, "List of available ports: " + portList);
}
~~~
一旦你知道了端口名字,使用PeripheralManagerService來連接這個端口。當你完成GPIO端口通信,關閉連接并釋放資源。此外,在現有端口關閉之前,你不能打開相同端口的新連接。要想關閉連接,使用端口的close()方法;
~~~
public class HomeActivity extends Activity {
// GPIO Pin Name
private static final String GPIO_NAME = ...;
private Gpio mGpio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the GPIO
try {
PeripheralManagerService manager = new PeripheralManagerService();
mGpio = manager.openGpio(GPIO_NAME);
} catch (IOException e) {
Log.w(TAG, "Unable to access GPIO", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mGpio != null) {
try {
mGpio.close();
mGpio = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close GPIO", e);
}
}
}
}
~~~
## **讀取輸入**
讀取輸入GPIO端口:
1. 使用DIRECTION_IN模式調用setDirection()方法配置端口為輸入;
1. 使用ACTIVE_HIGHT或者ACTIVE_LOW調用setActiveType()方法,配置高(接近LOREF)或者低(接近zero)電壓狀態作為true(活動的)返回;
1. 使用getValue()方法返回當前狀態;
下面的代碼展示了你如何設置一個輸入高電壓為活動狀態:
~~~
public void configureInput(Gpio gpio) throws IOException {
// Initialize the pin as an input
gpio.setDirection(Gpio.DIRECTION_IN);
// High voltage is considered active
gpio.setActiveType(Gpio.ACTIVE_HIGH);
...
// Read the active high pin state
if (gpio.getValue()) {
// Pin is HIGH
} else {
// Pin is LOW
}
}
~~~
#### **監聽輸入狀態變化**
GPIO端口被配置為輸入后,當它的狀態在高和低之間改變時會通知你的app。注冊這些改變事件:
1. 在活動的端口連接添加一個GpioCallback;
1. 使用setEdgeTriggerType()方法聲明觸發中斷事件的狀態變化。邊緣觸發器支持下面的四個類型:
* EDGE_NONE:沒有中斷事件,這個是默認的值;
* EDGE_RISING:從低到高過渡中斷;
* EDGE_FALLING:從高到底過渡中斷;
* EDGE_BOTH:在所有狀態轉換中斷;
1. onGpioEdge()方法返回true意味著這個監聽器會持續獲取端口的每個狀態改變事件;
下面的代碼在一個給定的輸入端口上注冊了一個所有狀態改變的中斷監聽器;
~~~
public void configureInput(Gpio gpio) throws IOException {
// Initialize the pin as an input
gpio.setDirection(Gpio.DIRECTION_IN);
// Low voltage is considered active
gpio.setActiveType(Gpio.ACTIVE_LOW);
// Register for all state changes
gpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
gpio.registerGpioCallback(mGpioCallback);
}
private GpioCallback mGpioCallback = new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
// Read the active low pin state
if (mDevice.getValue()) {
// Pin is LOW
} else {
// Pin is HIGH
}
// Continue listening for more interrupts
return true;
}
@Override
public void onGpioError(Gpio gpio, int error) {
Log.w(TAG, gpio + ": Error event " + error);
}
};
4.當你的app不在監聽輸入事件的時候,注銷所有中斷Handler:
public class HomeActivity extends Activity {
private Gpio mGpio;
...
@Override
protected void onStart() {
super.onStart();
// Begin listening for interrupt events
mGpio.registerGpioCallback(mGpioCallback);
}
@Override
protected void onStop() {
super.onStop();
// Interrupt events no longer necessary
mGpio.unregisterGpioCallback(mGpioCallback);
}
}
~~~
## **寫入輸出**
以編程的方式控制GPIO端口的狀態:
1. 使用DIRECTIOIN_OUT_INITIALLY_HIGHT或者DIRECTION_OUT_INITIALLY_LOW模式調用setDirection()方法配置它為輸出。這些模式確保了端口的初始化狀態在配置時間正確設置;
1. 配置高 (接近IOREF)或者低(接近zero)電壓信號作為true(活動)返回,使用ACTIVE_HIGHT或者ACTIVE_LOW調用setActiveType()方法;
1. 使用setValue方法來設置當前狀態;
下面的代碼顯示了你如何設置一個輸出端口的初始為高,然后使用setValue方法設置它的狀態為低;
~~~
public void configureOutput(Gpio gpio) throws IOException {
// Initialize the pin as a high output
gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
// Low voltage is considered active
gpio.setActiveType(Gpio.ACTIVE_LOW);
...
// Toggle the value to be LOW
gpio.setValue(true);
}
~~~
* * * *
*1.拋棄各種找元器件的煩惱,來“1024工場”旗艦店,一次性買到你所想要的:樹莓派套裝—專為Android Things打造。*

*電腦用戶,點擊如下鏈接進入淘寶寶貝頁面:*
<a href="https://item.taobao.com/item.htm?&id=549263158263">https://item.taobao.com/item.htm?&id=549263158263</a>
*手機用戶,打開淘寶客戶端掃描二維碼:*

*2.完整和持續更新的《使用Android打開物聯網開發大門——Andoid Thigns開發》文檔,歡迎大家閱讀!*
[http://www.hmoore.net/workshop1024/android_things_develop/360773](http://www.hmoore.net/workshop1024/android_things_develop/360773)

*3.新技術,新未來!歡迎大家關注“1024工場”微信服務號,時刻關注我們的最新的技術訊息。(甭客氣!盡情的掃描或者長按!)*

*4.加入“Android Things開發”QQ討論群,一起學習一起Hi。(甭客氣!盡情的掃描或者長按!)*
