查看: 2565|回复: 7

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

[复制链接]
  • TA的每日心情
    开心
    2017-2-26 10:18
  • 签到天数: 259 天

    [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连接)
    硬件.jpg
    【软件】
    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服务协议。包括心率服务在内都已经做过严格定义,是标准定义,不可乱用。
    heart_rate_180D.png heart_rate_2A37.png
    心率服务号:0x180D
    (int)((char*)heartrate.value())[1])  -----读取第1个字节的数据(key=1
    【项目实施】

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

    我们需要运行一个脚本,这个脚本是在blynk 库里的,具体的位置和运行说明如图:
    usb连接脚本.png
    via_usb.png
    101联机.png 你看到101的设备名称变成了白色实体,说明你的101在线了。
    第二步:编写101侧代码并且upload
    /* * 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");       }       } }
    第三步:设计blynk APP的用户界面(UI
    心率主屏.png
    这是主屏
    设备配置.png
    设备配置2_101.png
    增加一个开发板--genuino101
    心率数据.png
    设置心率的数据控件,绑定V1
    心率数据图形窗.png
    设置心率的图形控件,绑定V2
    第四步:穿上心率带,打开101电源(USB连接PC,且PC运行连接脚本),打开blynk APP并且运行,数据上传至APP
    心率主屏_1.png
    由于曲线可以说明过程,就不上视频了,否则会比较大。
    【小结】
         本帖尝试用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的每日心情
    开心
    2017-2-26 10:18
  • 签到天数: 259 天

    [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的每日心情
    开心
    2017-2-26 10:18
  • 签到天数: 259 天

    [LV.8]以坛为家I

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

    [LV.10]以坛为家III

    发表于 2017-6-1 07:24 | 显示全部楼层
    谢谢分享,该APP可以分享一下吗?是否可以将摄像头拍摄的图片蓝牙传输至手机?BLE2.0模块是否适用?比如常见的HC05
  • TA的每日心情
    开心
    2017-2-26 10:18
  • 签到天数: 259 天

    [LV.8]以坛为家I

     楼主| 发表于 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

    发表于 2017-6-1 21:00 | 显示全部楼层
    沧海笑1122 发表于 2017-6-1 10:02
    blynk 库 https://github.com/blynkkk/blynk-library
    官网:blynk.cc
    第二个问题我还没有研究过。 ...

                谢谢,

    该用户从未签到

    发表于 2018-3-26 23:09 | 显示全部楼层
    本帖最后由 全都是戏 于 2018-3-27 14:40 编辑

    请问192.168.0.146是如何设置的呢?
    高级模式  
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    创客集结号:温馨浪漫硬纸板台灯创客作品
    创客集结号:温馨浪漫硬纸
    创客集结号xk100.com:点亮台灯,在柔光中享受这一刻的温馨浪漫,这定是这一天中最惬
    18脚的8x8LED点阵如何使用??
    18脚的8x8LED点阵如何使用
    这个点阵模块上面一排有12个脚,左下方2个脚,右下方4个脚。搞不懂这个模块该如何使
    求助,这个串口输出在联机的时候可以正常运行,脱机无.....
    求助,这个串口输出在联机
    void setup() { Serial.begin(9600); pinMode( 4 , INPUT); } void loop() { while (
    ATMega328P-PU空芯片烧写BootLoader步骤
    ATMega328P-PU空芯片烧写B
    ①连接ISP下载线,下载线连接到arduino的isp下载接口6P,下载线一端没有防呆设计,所
    空气质量监测-SGP30模块使用 VOC CO2测量
    空气质量监测-SGP30模块使
    空气质量监测-SGP30模块VOC CO2 http://www.lingzhilab.com/forum. ... d&tid=485&fro
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表