[原创] SensorTile物联网开发套件(4)——DIY遥控LED

lb8820265   2016-10-24 19:21 楼主
先上图片:
遥控LED.gif
图片中实现的功能是用手机遥控控制LED,这个功能在Blue-MS是有的,但是在ST提供的SDK-Example中没有,那么就跟随我一起一步一步的实现吧!
SensorTile中烧录BM1固件,然后下载SDK,在帖子最后有下载,代码是托管在Github上的,用Android Studio 2.X打开,如果编译时提示缺少所需的编译工具,翻墙点击下载即可,或者直接修改代码中的编译工具版本。
整个工程分为BlueSTSDK和BlueSTExample两个部分,前者是SDK,后者是一个简单的例程,连接后可以显示所有的传感器数据,就像上面GIF图片中所示,点击列表就会出现详细的传感器数据。
打开工程后修改布局文件activity_demo.xml,添加一个按钮和两个线性布局,代码如下:
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:weightSum="1" tools:context="com.st.BlueSTSDK.Example.FeatureListActivity">
  7. <LinearLayout
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content">
  10. <Button
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:id="@+id/Btn_LED"
  14. android:text="LED"/>
  15. </LinearLayout>
  16. <ListView android:id="@+id/featureList"
  17. xmlns:android="http://schemas.android.com/apk/res/android"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"/>
  20. </LinearLayout>
然后找到FeatureListActivity,给按钮添加响应函数,这里采用OnClickListener监听,而不直接在布局文件中添加android:onClick方法的原因是AppCompatActivity类并不支持。给FeatureListActivity添加接口类:
  1. View.OnClickListener
添加LED按钮的全局变量:
  1. private Button LED;
在onCreat函数中给按钮添加监听:
  1. LED = (Button) findViewById(R.id.Btn_LED);
  2. LED.setOnClickListener(this);
在onCreat外添加按钮实现函数:
  1. public void onClick(View view){
  2. switch (view.getId()){
  3. case R.id.Btn_LED:
  4. FeatureSwitch f = mNode.getFeature(FeatureSwitch.class); //get Feature Switch class
  5. if(!mNode.isEnableNotification(f))//Ensure the Switch is EnableNotification
  6. mNode.enableNotification(f);
  7. if(f.getSwitchStatus(f.getSample())==0){//Check the led state
  8. f.changeSwitchStatus((byte)0x01);//Tuen on LED
  9. }else {
  10. f.changeSwitchStatus((byte) 0x00);//Tuen off LED
  11. }
  12. break;
  13. }
  14. }
代码都进行了注释,界面上之所以显示这些类的信息是因为APP检测到有这些Feature类可用,如果注册了算法库后,会发现可用的Feature类变多,在点击了按钮之后,先获取Switch的类,然后判断该节点中Switch类是否Notification,,在没有点击列表中的Feature类的时候是没有Notification该类的,也就是说不会关注该Feature类的任何变动,对其各种操作也是不可行的。因此在这里先判断是否已经Notification了Switch类,如果没有就开启,这样无论是否点击列表中的Switch类都可以实现对LED的控制。然后调用Switch类中的获取LED灯状态的函数,该函数中需要Sample变量,该变量是收到的数据,这里同样需要调用Switch类中的获取Sample函数,这里获取到的是上一次收到的数据,根据LED的状态来控制LED灯,就实现了一键交替开关LED的效果。
有了以上的代码已经能够实现灯的开关操作了,但是却不敢保证LED灯按照要求控制了,还需要一个回馈,因此修改onUpdate函数如下:
  1. public void onUpdate(Feature f, Feature.Sample sample) {
  2. final String featureDump = f.toString();
  3. if( f.getName().equals("Switch")){//if the Feature is Switch
  4. FeatureSwitch Switch = mNode.getFeature(FeatureSwitch.class);
  5. if(Switch.getSwitchStatus(sample)==0){//Check the led state
  6. LED_State=true;
  7. }else{
  8. LED_State=false;
  9. }
  10. FeatureListActivity.this.runOnUiThread(new Runnable() {
  11. @Override
  12. public void run() {
  13. if(LED_State) {
  14. LED.setText("Turn On");//update button text
  15. }else {
  16. LED.setText("Tuen Off");//update button text
  17. }
  18. }
  19. });
  20. }
  21. FeatureListActivity.this.runOnUiThread(new Runnable() {
  22. @Override
  23. public void run() {
  24. mTextView.setText(featureDump);//Modify the button's text
  25. }
  26. });
  27. }//onUpdate
SensorTile所有的数据更新都是通过调用onUpdate函数来实现的,在该函数中调用各个Feature中的toString函数,将收到的数据转换为字符串,最后在UI更新线程中更新。由于所有的Feature的数据更新都会调用onUpdate,那就可以在函数中根据不同的Feature来进行不同的操作。首先获取Feature的名字,如果是“Switch”就往下处理,获取该节点的Switch的类,然后调用该类中的getSwitchStatus,这里sample直接用,不调用Switch类中getsample方法。得到了LED灯的状态就给全局变量LED_State赋值,最后根据LED_State的值改变按钮上的文字,这就可以确保准确了。这里注意LED_State变量不能定义在函数里面,否则在UI线程中会报错。
SDK有很多Feature,熟悉了Switch的使用,其他的也就大同小异了,为以后更复杂的应用打好基础。
回顾整个DIY过程,我们根本没有接触到底层,没有配置服务地址,没有配置特征,没有写发送接收函数,一切都是调用接口函数,却可以满足各种需求,这种开发模式是不是很爽呢。
SDK 函数手册
javadoc.zip (534.92 KB)
(下载次数: 54, 2016-10-24 19:22 上传)
SDK源码https://github.com/STMicroelectronics-CentralLabs/BlueSTSDK_Android 本帖最后由 lb8820265 于 2016-10-26 16:22 编辑
QQ:252669569

回复评论 (14)

哈哈   最喜欢看效果呈现视频了
加油!在电子行业默默贡献自己的力量!:)
点赞  2016-10-25 09:30
玩板看这里: https://bbs.eeworld.com.cn/elecplay.html EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
点赞  2016-10-26 17:11
晕倒,不会Android 的编程。。。。
点赞  2017-1-5 09:04
SDK是什么意思呢??求科普
点赞  2017-1-9 14:47
引用: 小笼包 发表于 2017-1-9 14:47
SDK是什么意思呢??求科普

软件开发工具包(Software Development Kit, SDK)
QQ:252669569
点赞  2017-1-9 16:27
楼主用的是AS几的版本, 编译配置是怎样的? SDK 是用的版本几? 不太熟悉Android Studio .  运行到手机里面 就闪退 咋回事。
我用的是SDK API 24
Gradle 2.2.3
点赞  2017-2-22 10:04
引用: wbhb2011 发表于 2017-2-22 10:04 楼主用的是AS几的版本, 编译配置是怎样的? SDK 是用的版本几? 不太熟悉Android Studio . 运行到手机里 ...
成功编译了吗?在手机里面闪退是在什么时候出现的呢?官方提供的SDK可以编译运行吗? 本帖最后由 lb8820265 于 2017-2-22 10:56 编辑
QQ:252669569
点赞  2017-2-22 10:55
引用: lb8820265 发表于 2017-2-22 10:55
成功编译了吗?在手机里面闪退是在什么时候出现的呢?官方提供的SDK可以编译运行吗?

OK了 import project 然后在android 下调试。尽量选择高版本的SDK API 就行了。现在能用。
点赞  2017-2-22 17:44
请问楼主能帮我看一下如何在这里获取记步数据吗,因为我的设计需要获取步数,但是我找了好久都没有在BlueSTSDK里面找到获取步数的方法函数。@lb8820265
点赞  2017-3-6 18:18
引用: 李炳1991 发表于 2017-3-6 18:18
请问楼主能帮我看一下如何在这里获取记步数据吗,因为我的设计需要获取步数,但是我找了好久都没有在BlueST ...

特地的给你看了下,SDK中是有的,具体位置请看图片:
捕获.PNG
BlueMS中使用这个也是需要获取相应的licence的,当获取后你用SDK打开是否能看到相关的选项。
QQ:252669569
点赞  2017-3-7 15:09
引用: lb8820265 发表于 2017-3-7 15:09
特地的给你看了下,SDK中是有的,具体位置请看图片:

BlueMS中使用这个也是需要获取相应的licence的, ...

我也找到了  不过无法使用  获取license就是使用官方的BlueMS给板子固件获取license对吗,然后就可以了。
点赞  2017-3-9 13:04
引用: 李炳1991 发表于 2017-3-9 13:04
我也找到了  不过无法使用  获取license就是使用官方的BlueMS给板子固件获取license对吗,然后就可以了。

是激活了过后其他自己写的软件也可以用 还是只有激活的软件才可以用了 也就是请问激活的是控制板的固件还是手机上的软件还是手机了?
点赞  2017-3-9 13:19
引用: 李炳1991 发表于 2017-3-9 13:19
是激活了过后其他自己写的软件也可以用 还是只有激活的软件才可以用了 也就是请问激活的是控制板的固件还 ...

激活的是板子上的固件,只要激活了板子,任何APP都可以直接使用的。
QQ:252669569
点赞  2017-3-9 18:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复