# **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打造。* ![树莓派套装](http://img.blog.csdn.net/20170731000628095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDEwNjc4Njg2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) *电脑用户,点击如下链接进入淘宝宝贝页面:* <a href="https://item.taobao.com/item.htm?&id=549263158263">https://item.taobao.com/item.htm?&id=549263158263</a> *手机用户,打开淘宝客户端扫描二维码:* ![宝贝二维码](http://img.blog.csdn.net/20170731001203829?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDEwNjc4Njg2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) *2.完整和持续更新的《使用Android打开物联网开发大门——Andoid Thigns开发》文档,欢迎大家阅读!* [https://www.kancloud.cn/workshop1024/android_things_develop/360773](https://www.kancloud.cn/workshop1024/android_things_develop/360773) ![这里写图片描述](http://img.blog.csdn.net/20170729191051052?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDEwNjc4Njg2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) *3.新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息。(甭客气!尽情的扫描或者长按!)* ![服务号](http://img.blog.csdn.net/20170411145712154?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDEwNjc4Njg2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) *4.加入“Android Things开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)* ![qq群](http://img.blog.csdn.net/20170411145816560?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcDEwNjc4Njg2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)