7369浏览
查看: 7369|回复: 0

micropython学习笔记之蓝牙心率带读取及显示

[复制链接]
本帖最后由 沧海笑 于 2017-9-3 13:04 编辑

【内容】micropython学习笔记之蓝牙心率带读取及显示
【时间】2017-09-03

【本期主要玩法】
blynk的时候,就通过Arduino 101读过蓝牙心率带数据,同时显示在oled上。这次esp32ble正在测试,感谢岛主、 당신 사랑
师兄的资料,我是在他们的基础上,稍加改动,读取了蓝牙心率带的数据,这样就很容易做一只与心率带配合的心率表了,如果加上姿态传感器以及算法,就可以做出更多的功能。

ble_hr.jpg

【硬件】
2、蓝牙心率带 1条 (某宝有售,要求支持ble4.0)
3.oled ssd1306屏 1块(I2C接口)
4、杜邦线4根
【软件】
  
  
软件
出品或借鉴的原帖
1
upy ide 0.26
Dfrobot
2
BLE
乐鑫官方,已集成至固件中,正在完善中
【接线】
  
  
oled
1
VCC
VCC(3v3)
2
GND
GND
3
SCL
SCL
4
SDA
SDA

代码:
[mw_shl_code=python,true]#BT_HRM read .it works
#2017-07-24

import gc
import sys
import network as n
import gc
import time
from machine import Pin,I2C
import ssd1306
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
lcd=ssd1306.SSD1306_I2C(128,64,i2c)

b = n.Bluetooth() #建立实例

found = {}
complete = True
connectname = ""
mac=b'\x00\x00\x00\x00\x00\x00'
def bcb(b,e,d,u): #读取程序
  global complete
  global found
  global connectname
  global mac
  if e == b.CONNECT:
        print("CONNECT")
        oled("CONNECT")
  elif e == b.DISCONNECT:
        print("DISCONNECT")
        oled("DISCONNECT")
  elif e == b.SCAN_RES:
    if complete:
      found = {}
      adx, name,ssic= d
      if connectname == str(name):
        mac = adx
        print(d)
        if adx not in found:
          found[adx] = name
      else:
        print('else')
        print(d)

  elif e == b.SCAN_CMPL:
    ok = True
    print("Scan Complete")
    oled("Scan Complete")
    complete = True
    print ('\nFinal List:')
    for adx, name in found.items(): #显示搜索BLE设备的结果
      print ('Found:' + ':'.join(['%02X' % i for i in adx]), name)
      print('connect ',name)
      oled(name)
  else:
    print ('Unknown event', e,d)

def cb (cb, event, value, userdata):
  print('charcb ', cb, userdata, ' ', end='')
  if event == b.READ:
    print('Read')
    return 'ABCDEFG'
  elif event == b.WRITE:
    print ('Write', value)
  elif event == b.NOTIFY:
    print ('Notify', value)
    period = None
    flags = value[0]
    hr = value[1]
    if flags & 0x10:
        period = (value[3] << 8) + value[2]
    print ('HR:', hr, 'Period:', period, 'ms')
    lcd.fill(0)
    lcd.text("HR:",20,16)
    lcd.text(str(hr),50,16)
    lcd.show()
   
def conn(bda):
  b.ble_settings(adv_is_scan_rsp = False)
  conn = b.connect(bda)
  
  while not conn.is_connected():
   
    time.sleep(.1)
  print ('Connected')
  time.sleep(2) # Wait for services
  service = ([s for s in conn.services() if s.uuid()[0:4] == b'\x00\x00\x18\x0d'] + [None])[0]
  if service:
    print(service.chars())
    char = ([c for c in service.chars() if c.uuid()[0:4] == b'\x00\x00\x2a\x37'] + [None])[0]
    if char:
        descr = ([d for d in char.descrs() if d.uuid()[0:4] == b'\x00\x00\x29\x02'] + [None])[0]
        if descr:
            char.callback(cb)
            descr.write(b'\x01\x00') # Turn on notify

  return conn
def onScanComplete():
  time.sleep(2)
def set_connetname(name):
  return "b'%s'" % name
def scan():
  global connectname
  connectname = set_connetname("BT_HRM")
  oled('BT_HRM')
  b.ble_settings(adv_is_scan_rsp = True)
  b.scan_start(5)
  time.sleep(10)
def oled(lcdtxt):
  lcd.fill(0)
  lcd.text(lcdtxt,20,16)
  lcd.show()
b.callback(bcb)
scan()
print('mac:',mac)
oled(mac)
conn(mac)[/mw_shl_code]
【小结】
  BLE是esp32的重要亮点,希望大家一起挖掘分享好玩的应用。但是目前还在完善中。比如在esp32与ble设备连接后,不能释放的问题到目前还未解决,我也和大家一起期待esp32 BLE的不断进步。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail