查看: 3226|回复: 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。
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    全过程展示:PWM自定义、测速、PID调速、PID自整定
    全过程展示:PWM自定义、
    arduino如何控制带驱动28步进电机
    arduino如何控制带驱动28
    有大佬知道吗,arduino不知道能不能发出脉冲信号
    Wifiduino(esp8266)+blinker+微信消息推送
    Wifiduino(esp8266)+bli
    最近呢,有个很小的项目 需要反馈现场电源工作状态,着急开发,没时间做方案。我又是
    因为DHT11是假的吗?
    因为DHT11是假的吗?
    用DHT11测温湿度时,监视窗口总是这样显示,这是为什么啊,求大佬告知!
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表