AndroidThings(一)控制LED亮灭

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


阅读更多
个人分类: androidthings
上一篇NXP板子跑AndroidThings
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭