查看: 3677|回复: 8
打印 上一主题 下一主题

Genuino(arduino)101与blynk结合显示BLE心率

[复制链接]
  • TA的每日心情
    开心
    2018-11-28 10:20
  • 签到天数: 262 天

    [LV.8]以坛为家I

    跳转到指定楼层
    楼主
    发表于 2017-4-23 15:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 沧海笑1122 于 2017-4-23 15:35 编辑

    【项目简介】
        Genuino101的亮点之一是BLE及其BLE库,可以建立外围以及central设备模式,以便与其他外围设备建立连接、交换数据。BLE库更新之快,令人应接不暇。
        我一直关注BLE库的进展,终于在20173月,在GITHUB上看到了一个heartservice服务,就是我一直希望的:将101设置为BLE central模式,将BLE 4.0心率带作为外围设备,建立连接后读取心率数据。你可以直接将其用作当地展示,比如显示在oled上,做成穿戴。(可惜genuino 101开发板体积较大,不适合作为穿戴,只有等DFRobot CurieNano了,以其小身板,可以做成穿戴,比较期待)。
       言归正传,在Genuino101获取BLE心率带数据后,可以通过blynk 体系展示在blynk 手机APP上。下面,咱们一起动手玩吧。


    【硬件】
    1、蓝牙心率带一条   KATO(国货,性价比高,也可以连接悦跑圈等手机APP
    2Genuino 101 一块
    3、手机一部(安卓4.0.3以上)
    4usb电缆一条
    5pc台式机(用于将101pcblynk server连接)
    【软件】
    2、关于blynk的基本情况以及与dfrobotbeetle BLE的一个小应用可以参考我的另外一个帖子http://www.arduino.cn/thread-45285-1-1.html
    3、关于101BLE,请参考arduino.cn的高级会员甲基红橙黄绿蓝写的《【CurieBLE】教你查询GATT并编写相关服务》,这是一篇精华帖。http://www.arduino.cn/thread-42927-1-2.html
    4heart rate service (本项目的软件核心)https://github.com/wlogsky666/HeartRate_Service
    作者是一名台湾的工科大学生,在此向他表示敬意。原文是在 heart rate strap cs011 上实现的,我稍作修改,并且参考了101的官方例题。

    【延伸阅读】BLE心率带的heart rate service
    https://www.bluetooth.com/specifications/gatt

    BLE 4.0是一个全新的概念,gatt协议是非常重要的ble服务协议。包括心率服务在内都已经做过严格定义,是标准定义,不可乱用。
    心率服务号:0x180D
    (int)((char*)heartrate.value())[1])  -----读取第1个字节的数据(key=1
    【项目实施】

    本项目示意图
    第一步:配置usb连接服务
    这一步骤是在PC机上完成的,你可以选择三种方式将101blynk server连接起来。一是以太网扩展板,二是BLE;三是usb电缆。其中以太网扩展板连接后,在使用blynk时遇到冲突,至今没有解决,而BLE主要用于读取心率带数据,所以本次测试只能先用usb方式直连。这样带来了一个多出的环节,就是PC机必须当成一个中介,用于将101blynk server连接。而以太网方式可以直接与blynk server连接,BLE方式则必须通过手机与server连接。

    我们需要运行一个脚本,这个脚本是在blynk 库里的,具体的位置和运行说明如图:
    你看到101的设备名称变成了白色实体,说明你的101在线了。
    第二步:编写101侧代码并且upload
    [kenrobot_code]/*
    * from https://github.com/wlogsky666/HeartRate_Service
    * arduino 101 central mode read BLE HR_belt KATO via USB serial
    * 去除不必要的注释
    * 2017-04-08
    */
    //101的BLE库读取心率带数据
    //然后通过USB--PC---blynk server
    #include <SoftwareSerial.h>
    SoftwareSerial DebugSerial(2, 3); // RX, TX
    #include <CurieBLE.h>
    #define BLYNK_PRINT DebugSerial
    #include <BlynkSimpleStream.h>


    BLEService heartRateService("180D"); // BLE Heart Rate Service
    char auth[] = "aac*******************a0e";  //101的令牌,请替换为你获取的识别码

    void setup() {

      Serial.begin(9600);
      DebugSerial.begin(9600);
      pinMode(13, OUTPUT);   // indicate when a central is connected
      delay(10000);

      BLE.begin();
      BLE.scan();
      Blynk.begin(Serial, auth);//通过USB连接到PC,一是该PC必须与server能够可靠连接,二是sreial不能再有其他读写操作。所以我们注释了所有调试语句

      
    }

    // the loop function runs over and over again forever
    void loop() {
      Blynk.run();  //调用blynk
      
      BLEDevice peripheral = BLE.available();
       if (peripheral) {
          // discovered a peripheral
        //  Serial.println("Discovered a peripheral");
       //   Serial.println("-----------------------");

          // print address
        //  Serial.print("Address: ");
        //  Serial.println(peripheral.address());

          if (peripheral.hasLocalName()) {
          //  Serial.print("Local Name: ");
         //   Serial.println(peripheral.localName());
          }
          if (peripheral.hasAdvertisedServiceUuid()) {
         //   Serial.print("Service UUID's: ");
          //  for (int i = 0; i < peripheral.advertisedServiceUuidCount(); i++) {
             // Serial.print(peripheral.advertisedServiceUuid(i));
          //    Serial.print(" ");
            //}
          //  Serial.println();
          }


          // Try to connect
          if (peripheral.connect()) {
         //   Serial.println("Connected");
            digitalWrite(13, HIGH);      // Once connected, make builtin LED lighten
            HeartRate(peripheral);
          } else {
            Serial.println("Failed to connect!");
          }
          
        //  Serial.println("Disconnect");
          digitalWrite(13, LOW);   // Disconnect signal
          BLE.scan();//这句原作者没有,但必须加上,否则在一次scan失败后,程序停止
        }

        delay(3000);
    }
    int timer = 0 ;
    void HeartRate(BLEDevice peripheral) {

      // discover peripheral attributes
    // Serial.println("Discovering attributes of service 0x180D ...");
      if (peripheral.discoverAttributesByService("180D")) {//心率服务
         // Serial.println("Attributes discovered");
          //if(!peripheral.discoverAttributesByService("180F"))
          //   Serial.println("Battery Attributes not discoverd");
      }
      else {
       // Serial.println("Attribute discovery failed.");
        peripheral.disconnect();
        return;
      }

      BLECharacteristic heartrate = peripheral.characteristic("2A37");  // UUID of heartrate service is 2A37

      if( !heartrate  )   // Service not exist
      {
        //  Serial.println("No HeartRate Service...");  
          return ;
      }

      if( !heartrate.subscribe() )
      {
        //  Serial.println("Cannot Subscribe HeartRate  Service...");
          return ;
      }
      

      while( peripheral.connected() ){
          timer ++;
          if(  timer > 1000000&& heartrate.read()  &&heartrate.valueUpdated() )
          {
             timer = 0;
           //   Serial.print("Heartrate : ");
              // int v1=(int)((char*)heartrate.value())[1];
              //Serial.print(v1);
               digitalWrite(13, HIGH);   //
             Blynk.virtualWrite(V1,(int)((char*)heartrate.value())[1]);//将bpm赋值给虚拟pin V1,用于图形显示
             Blynk.virtualWrite(V2,(int)((char*)heartrate.value())[1]);//将bpm赋值给虚拟pin V2,可以用于数字显示
             delay(100);
              digitalWrite(13, LOW);   // D13闪动一下
           //  Serial.print((int)((char*)heartrate.value())[1]);//串口窗显示
          //   Serial.println(" bpm");
          }
       
      }
    }
    [/kenrobot_code]
    第三步:设计blynk APP的用户界面(UI
    这是主屏
    增加一个开发板--genuino101
    设置心率的数据控件,绑定V1
    设置心率的图形控件,绑定V2
    第四步:穿上心率带,打开101电源(USB连接PC,且PC运行连接脚本),打开blynk APP并且运行,数据上传至APP
    由于曲线可以说明过程,就不上视频了,否则会比较大。
    【小结】
         本帖尝试用101读取蓝牙心率带数据,然后上送至blynk server,通过手机上的blynk APP图形化展示心率数据。同时为接下来的应用提供了基础。下一节,将希望通过esp8266以及eps32板,将server上的心率数据读取并且在本地展示,展示的方式也多样。也许通过一块0.66oled,也许是一块全彩的led环。
    最后,有玩家问我,心率带本身就可以通过悦跑圈等手机APP读取,需要费这么大周折吗?作为一名长跑爱好者,我也使用过多款心率带以及手机APP,这个质疑我一下子还回答不上来呢。可是,这就是极客吧?不停追求新鲜的玩法。。。

    【感谢】
        感谢@奈何兄提供101的交流平台(手里这块101就来自去年年底的社区活动),感谢@甲基红橙黄绿蓝师兄提供的对gatt的详解,尤其感谢在github.com上已经实现对蓝牙心率带读取的玩家(IDwlogsky666),我是站在你的肩膀上前行。感谢blynk.cc这个了不起的项目。沧海抱拳!
    (关于blynk所有的库在上一贴中都有介绍,你也可以在blynk.cc上直接或者间接找到)



    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-11-28 10:20
  • 签到天数: 262 天

    [LV.8]以坛为家I

    沙发
     楼主| 发表于 2017-4-23 18:49 | 只看该作者
    各位玩家,关于为什么在这个项目中要经过PC,我补充解释一下:
         usb-pc这种方式,肯定不是首选。它是一种备选的替代方式(官方也说,你要实在啥也没有,只能试试这种玩法,因为增加了PC环节,肯定不是最合理的方式),另外,因为以太网卡+101的方式与blynk冲突(原因我也没找到),而101的BLE这次要用来读取蓝牙心率带(一心不能二用啊),所以,只能用usb-pc方式。
    如果有更好的方式,我也愿意尝试。
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2017-7-3 15:02
  • 签到天数: 56 天

    [LV.5]常住居民I

    板凳
    发表于 2017-4-24 22:34 | 只看该作者
    恭喜!终于搞出来了。

    甲基红橙黄绿蓝是我在物理界的称呼,IT界就叫我灯灯就好
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-11-28 10:20
  • 签到天数: 262 天

    [LV.8]以坛为家I

    地板
     楼主| 发表于 2017-4-25 07:51 来自手机 | 只看该作者
    哈哈,灯灯师兄多指教
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-6-16 16:25
  • 签到天数: 777 天

    [LV.10]以坛为家III

    5#
    发表于 2017-6-1 07:24 | 只看该作者
    谢谢分享,该APP可以分享一下吗?是否可以将摄像头拍摄的图片蓝牙传输至手机?BLE2.0模块是否适用?比如常见的HC05
  • TA的每日心情
    开心
    2018-11-28 10:20
  • 签到天数: 262 天

    [LV.8]以坛为家I

    6#
     楼主| 发表于 2017-6-1 10:02 | 只看该作者
    suoma 发表于 2017-6-1 07:24
    谢谢分享,该APP可以分享一下吗?是否可以将摄像头拍摄的图片蓝牙传输至手机?BLE2.0模块是否适用?比如常 ...

    blynk 库 https://github.com/blynkkk/blynk-library
    官网:blynk.cc
    第二个问题我还没有研究过。
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2018-6-16 16:25
  • 签到天数: 777 天

    [LV.10]以坛为家III

    7#
    发表于 2017-6-1 21:00 | 只看该作者
    沧海笑1122 发表于 2017-6-1 10:02
    blynk 库 https://github.com/blynkkk/blynk-library
    官网:blynk.cc
    第二个问题我还没有研究过。 ...

                谢谢,

    该用户从未签到

    8#
    发表于 2018-3-26 23:09 | 只看该作者
    本帖最后由 全都是戏 于 2018-3-27 14:40 编辑

    请问192.168.0.146是如何设置的呢?
  • TA的每日心情
    开心
    2018-11-28 10:20
  • 签到天数: 262 天

    [LV.8]以坛为家I

    9#
     楼主| 发表于 2018-11-28 10:10 | 只看该作者
    全都是戏 发表于 2018-3-26 23:09
    请问192.168.0.146是如何设置的呢?

    抱歉,刚看到,192.168.0.146是我用树莓派做的本地blynk server的ip,是你的路由器自行分配的。你在测试时会有不同的IP。
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库
    博哥零基础教你玩转ESP826
    帖子导航帖 博哥零基础教你玩转ESP8266(一) 重识ESP8266 博哥零基础教你玩转ESP8266
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ)
    求助!WeMos D1 WiFi怎么
    求助!WeMos D1 WiFi怎么接0.96寸OLED?(ㄒoㄒ) 想用WeMos D1 WiFi接收服务器的数据然
    串口发送16进制指令求助
    串口发送16进制指令求助
    我准备串口发出16进制指令到我的外置设备 代码如下图 我分别监控ARDUINO的tx口和USB口
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    大神们!1602显示屏上的MQ2浓度示数不是实时监测的何解
    大神们!1602显示屏上的MQ
    本人小白,刚刚接触arduino,长时间的查阅资料后,通过复制修改代码接线实现了DHT11实
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表