AndroidThings(一)控制LED亮灭

原创 2018年04月15日 09:34:39

AndroidThings(一)控制LED亮灭

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/Java_zjj/article/details/79946676

【转载请注明出处:https://blog.csdn.net/Java_zjj/article/details/79946676

一、新建一个项目,选择创建一个Android Project,输入你的项目名,next

二、取消勾选Phone and Tablet,我们勾选Android Things(没有Android Things选项请升级你的Android studio),next


三、选择默认就好,next,next,Finish

四、创建好了


五、要用到button,首先我们需要添加依赖,点击build.gradle在dependencies{}添加 implementation 'com.google.android.things.contrib:driver-button:0.6' (其他的都在创建时就添加了),添加后点击Sync Now 同步一下


六、接下来配置我们的标签文件AndroidManifest.xml,添加MANAGE_INPUT_DRIVERS权限

 <uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />


七、好了,接下来选择新建一个BoardDefaults.java,这个类的主要功能是返回我们所用开发板的型号对应的GPIO口,直接上代码,还是很简单的

public class BoardDefaults {
    private static final String DEVICE_RPI3 = "rpi3";
    private static final String DEVICE_IMX6UL_PICO = "imx6ul_pico";
    private static final String DEVICE_IMX7D_PICO = "imx7d_pico";
    /**
     * 根据开发板型号返回连接LED的I/O口
     */
    public static String getGPIOForLED() {
        switch (Build.DEVICE) {
            case DEVICE_RPI3:   //树莓派
                return "BCM6";
            case DEVICE_IMX6UL_PICO:
                return "GPIO4_IO22";
            case DEVICE_IMX7D_PICO:
                return "GPIO2_IO02";
            default:
                throw new IllegalStateException("未知设备" + Build.DEVICE);
        }
    }
    /**
     * 跟据开发板型号返回连接Button的I/O口
     */
    public static String getGPIOForButton() {
        switch (Build.DEVICE) {
            case DEVICE_RPI3:  //树莓派
                return "BCM21";
            case DEVICE_IMX6UL_PICO:
                return "GPIO2_IO03";
            case DEVICE_IMX7D_PICO:
                return "GPIO6_IO14";
            default:
                throw new IllegalStateException("未知设备" + Build.DEVICE);
        }
    }
}

八、回到我们的MainActivity,注释还是蛮详细的,onKeyUp()方法监听按键松开,onKeyDown()方法监听按键按下。

有同学可能会问到:为什么要设置 Button.LogicState.PRESSED_WHEN_LOW   , mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);有篇博客很好的阐述了这个问题:《Android Things-硬件基础 https://www.jianshu.com/p/f0df498e91a1

public class MainActivity extends Activity {
    
    private Gpio mLedGpio;
    private ButtonInputDriver mButtonInputerDriver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        //使用PeripheralManager列出可用的GPIO端口
        PeripheralManager pio = PeripheralManager.getInstance();

        try {
            mLedGpio = pio.openGpio(BoardDefaults.getGPIOForLED());//获取设备型号的LED的GPIO端口
            mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);//设
        } catch (IOException e) {
            Log.e(String.valueOf(MainActivity.this), "led GPIO口错误", e);
        }

        try {
            mButtonInputerDriver = new ButtonInputDriver(
                    BoardDefaults.getGPIOForButton(),//获取设备型号的LED的GPIO端口
                    Button.LogicState.PRESSED_WHEN_LOW,//
                    KeyEvent.KEYCODE_SPACE);//按键事件,判断按键状态
            mButtonInputerDriver.register();//注册button
        } catch (IOException e) {
            Log.e(String.valueOf(MainActivity.this), "button GPIO口错误", e);
        }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_SPACE){
            //关闭LED灯
            setLedValue(false);
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_SPACE){
            //打开LED灯
            setLedValue(true);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void setLedValue(boolean ledValue) {
        try{
            mLedGpio.setValue(ledValue);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    protected void onStop() {
        if (mButtonInputerDriver != null){
            mButtonInputerDriver.unregister();
        }
        try{
            mButtonInputerDriver.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            mButtonInputerDriver = null;
        }
        
        if (mLedGpio != null){
            try {
                mLedGpio.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                mLedGpio = null;
            }
        }
        super.onStop();
    }
}

九、代码敲好了,开始连线吧,贴上官方连线图


再献下丑。。


十、运行项目,发现报错了,仔细一看是权限的问题。因为AndroidThing暂时不支持动态权限,解决办法是重启一下你的板子emmmm,接线没有错的话,我们按下按钮灯亮,松开灯灭。


 刚试着写博客不久,多有不足,也是刚学androidthings,可以加入QQ群:295446315一起交易

我的gayhub:https://github.com/zhu1105132453/AndroidThingsLED


中断控制LED灯亮灭

中断小结:(用独立键盘控制) #include "stm32f10x.h" #include "stm32f10x_exti.h" #include "stm32f10x_rcc.h" #inclu...
  • xiaoleiacm
  • xiaoleiacm
  • 2014年04月07日 17:44
  • 2198

外部中断实现LED灯的控制亮灭

#include"reg52.h"typedef unsigned char u8;typedef unsigned int u16;sbit led=P2^0;sbit k4=P...
  • weixin_39903708
  • weixin_39903708
  • 2018年02月08日 21:13
  • 41

1-1 实验1 LED不停地实现闪烁(一亮一灭)

LED不停地实现闪烁(一亮一灭) 1、开发环境 IAR继承开发环境(安装IAR Embedded   Workbench软件 )  版本:IAR Embedded   Workbench for 80...
  • gdliweibing
  • gdliweibing
  • 2013年10月12日 19:48
  • 3119

LED灯的延时亮灭与循环流水

全是c语言程序,都已经用keil编译
  • u013589337
  • u013589337
  • 2014年08月02日 21:15
  • 1842

3.按键控制LED灯亮灭

实验现象:本实验通过一个按键来控制一个发光二极管的亮灭。按键按一下LED点亮。再按一下LED熄灭。 理论学习: 该实验主要难点:  如何扫描按键的状态?  如何防抖动?  原理讲解: 按键检测原...
  • u011727748
  • u011727748
  • 2014年02月28日 17:36
  • 3196

Arduino Leonardo 按键控制LED亮与灭

按键控制LED亮灭,试用两种方法,一种是最简单的开关,另一种就是用按键的IO来控制LED。...
  • u010435562
  • u010435562
  • 2014年04月19日 22:11
  • 2985

STM32F407学习笔记——GPIO_按键控制LED亮灭

#include #include "stm32f4xx_conf.h" #include "delay.h" GPIO_TypeDef* io_led=GPIOC; const u16 pin_...
  • u013538360
  • u013538360
  • 2014年04月19日 22:03
  • 2678

打开Nexus 6的LED,并添加双击亮屏

入手了Nexus 6.
  • cherryfish2015
  • cherryfish2015
  • 2015年05月12日 11:51
  • 810

按键控制led亮灭

#include "reg52.h" sbit P10=P1^0; //定义LED指示灯的IO口 sbit P12=P1^2; sbit P13=P1^3; sbit P14=P1^4; ...
  • qq_38202813
  • qq_38202813
  • 2017年09月23日 22:20
  • 128

用开关控制LED(五)

这个比较简单,和之前说的控制LED没有本质的差别。 我们看一下原理图开关和LED的位置。 这里开关并不是灯连一起的,我们只能检测开关状态然后控制灯。 裸机下不知道怎么控制中断寄存...
  • zmnqazqaz
  • zmnqazqaz
  • 2016年05月02日 20:38
  • 596
收藏助手
不良信息举报
您举报文章:AndroidThings(一)控制LED亮灭
举报原因:
原因补充:

(最多只允许输入30个字)