×

智能血压计(SBPM)开源分享

消耗积分:5 | 格式:zip | 大小:0.79 MB | 2022-11-07

五斤麻辣油

分享资料个

描述

背景

在开始之前先解释一下这个项目是如何产生的很重要。当我申请免费硬件时,我并没有过多考虑这个想法。那时我已经向三个不同的比赛提交了六个好的项目,赢得了零奖。我也在等待我提交了两个项目的最新竞赛的结果。因此,我对Advanced Wearables竞赛的想法与我刚刚建立的一样,即智能血压计 (SBPM)。

尽管我尽最大努力被拒绝,Nordic Semiconductor还是好心地给了我一个免费的硬件包。当我收到我的硬件时,我非常兴奋,因为我会学到很多新东西;但是,我不会再构建另一个 SBPM。

“为什么不是 SBPM?”,您可能会问。实际上有几个原因:

  • 我不喜欢 Makers 不断重做他们相同的旧项目而几乎没有改进。
  • 老实说,我认为低功耗蓝牙 (BLE) 不会为 SBPM 实施增加太多价值。
  • 在查看了为免费硬件提交的想法后,我发现了几个 SBPM。所以,现在我确定我不会建造什么。
  • 最后但并非最不重要的一点是,我想我有一个更好的主意

除了竞赛规则外,我们还将在这个项目中承诺额外的标准。首先,nRF5340DK 不会被简单的智能手机应用程序替代。此外,nRF5340DK 不会在功能上变得多余;就像在另一个 MCU 上使用它一样。

介绍

当我在 Google 中建立 AVR-IoT WG: Out for Blood Pressure Monitoring 时,它本来是要成为 The Silent Killer(高血压或高血压)的杀手。这个项目将是The Silent Killer的杀手锏。

 
 

你看,不是事后检查血压,我们需要一种从一开始就防止高血压发生的设备。SBPM是一种测量读数装置;我们将建造一个设备,以促进更上游的预防措施。

根据梅奥诊所

运动是降低高血压的无药物方法

记住那个无毒的东西,它会再次出现。国家医学图书馆补充说:

定期跑步会降低 RBP

帮助我在 14 年后戒烟并降低血压和心率的一件事就是开始跑步。为了跑得更多,我使用了几种方法来减少恢复时间,直到我的教练推荐了一种称为 TENS 或经皮神经电刺激的无药物(见?告诉你!)方法。

poYBAGNkg-eAaLY2AAGZV0zJukI333.png
快速又便宜
 

今日医学新闻报道

TENS 装置的工作原理是通过带有粘性垫的电极传递小的电脉冲,将它们附着在人的皮肤上。这些电脉冲充斥着神经系统,降低了其将疼痛信号传输到脊髓和大脑的能力。同样的电脉冲也刺激身体产生称为内啡肽的天然止痛药。

顺便说一句,我想象中的法律团队建议我给出以下免责声明:

此处所做的声明尚未经过食品和药物管理局的评估。本产品不用于诊断、治疗、治愈或预防任何疾病。

我不是医生,我什至从来没有在电视上玩过。我还应该提到,与现实的任何相似之处纯属巧合。

我们都放弃了,让我们开始吧。

比赛计划

该项目的主要目的不仅是控制 TENS 单元,还记录用于进一步分析的设置,以确定哪种电脉冲模式最适合每块肌肉。正如彼得·德鲁克曾经说过的:

如果你不能衡量它,你就无法改进它。

与我之前的项目不同,我们不会使用 UART 与 TENS 单元进行通信;我们将使用 GPIO 来模拟按钮按下。每 10 秒 nRF5340DK 会将当前设置发送到 nRF52840 加密狗,后者将通过 UART 将信息中继到 WeMos D1 Mini。最后,信息将通过 Wi-Fi 发送到 Google 表格。

nRF5340DK + Adafruit 2.8" TFT Touch Shield for Arduino w/Capacitive Touch Display

pYYBAGNkg-qAf1oLAALWE98zx9Q962.png
 

该节目的明星是 nRF5340DK,它已使用随 nRF Connect SDK 安装提供的 Segger Embedded Studio (SES) 进行编程。显示器很好地安装在板上,但为了让它工作,我们必须应用补丁更多详情请参阅 Hung Bui 的网络研讨会

一旦我们确定ncs-display-ble-example工作,我们可以修改它以适应我们的项目。我们可以在这个项目中保留LED Button Service (LBS)代码,但我们需要Nordic UART Service (NUS)通过 BLE 发送文本。

将 nRF5340DK 插入计算机将使其显示为驱动器。我们可以在该驱动器上拖动N-TENS.hex来加载我们的代码。我们还可以按照几个简单的步骤从 GitHub 中的源代码构建项目。首先,我们需要以下结构来重新创建这个项目:

poYBAGNkg-2AUGXAAABnTmRPKbQ677.png
 

文件和文件夹捆绑在N-TENS.zip中接下来,打开工具链管理器。

poYBAGNkg_OAZJI2AABtsplPrCE145.png
 

文件 > 打开 nRF Connect SDK 项目...

poYBAGNkg_WABoDpAACv7ALi0sU381.png
 

选择项目和董事会名称。

pYYBAGNkg_iAZExcAADrqF0TcwY131.png
 

按住 Ctrl 按钮,然后按下并释放 T,然后按下并释放 F5。

pYYBAGNkg_uABkjoAACdHGYOtjA147.png
 

我们的项目现在已加载到 nRF5340DK 上。

poYBAGNkg_2ALAHoAAD222eWrGE524.png
 

pYYBAGNkhAKAQymvAALjM33L8uk359.png
 

我们最终使用的装置有 10 个速度等级、10 个功率等级和 8 种模式。所有这些以及仅通过 4 个按钮控制的开/关功能。该单元还有一个 15 分钟会话的倒数计时器。

pYYBAGNkhAWAEpLJAABXkaYPzzA846.png
让我们取消那个东西的保修
 

我们使用了引脚 P0.28、P0.29、P0.30 和 P0.31,因为它们已经配置为输出 (LED):

C:\ncs\v1.5.0\zephyr\boards\arm\nrf5340dk_nrf5340\nrf5340_cpuapp_common.dts

在同一个文件中,我们还使用 P0.09(按钮 4)通过 2N2222A 晶体管将信号发送到蜂鸣器进行放大。这样做是为了在触摸屏幕时向用户提供声音反馈。

 

我们将使用专用滑块来独立控制速度和功率级别,而不是共享功能按钮。您可能已经注意到,滑块是北欧标志和阴阳融合的抽象。显示尺寸为 320 X 240,我们必须规划滑块、按钮和文本的位置。

poYBAGNkhAiAIcGQAAF4tkJgSOg430.png
你知道当我必须拿出铅笔和计算器时会很好
 

左滑块将始终控制速度级别,而右滑块将始终控制功率级别。因此,用户不必跟踪 TENS 单元显示屏上未显示的 S/P 按钮。至于模式按钮,我们注意到 8 种模式中的大多数都有相同的节奏。无论如何,即使描述相同,我们也给每种模式一个独特的字母,以防它们对肌肉的影响不同。可以通过按下两个滑块之间的按钮来更改模式。就是这样,两个滑块,一个按钮,顶部的文本显示广告名称和 BLE 连接状态,底部的文本显示设备运行了多长时间。

等待 TENS 设备启动时显示北欧标志
 

喜欢这个案子?在将其设为蓝色后从以前的项目升级

右侧的小窗口仅用于演示验证。最终产品应该只有具有所有控制和信息的触摸屏。

nRF52840 加密狗

根据比赛规则:

nRF52840 Dongle 是捆绑中包含的补充设备,不需要在项目中使用。

话虽如此,我非常感谢Nordic Semiconductor将它包含在捆绑包中。我开始使用 SES 并使用 nRF Connect Programmer 编写生成的 HEX 文件,然后我切换到 CircuitPython。我知道它运行起来有点慢,但开发和加载速度更快。

我也知道这是 Cobra 而不是 Python,但那家伙看起来像我
 

rdagger68有一个很棒的视频,让我们开始在 nRF52840 加密狗上使用 CircuitPython。在他开始编写代码之前,该教程中的一切都很顺利。我花了一段时间才弄清楚这一点,但 CircuitPython 相对年轻(8 岁以上),过去几年几乎没有什么变化。例如,您会看到我必须在代码中为 UART 使用“adafruit_ble.services.nordic”,而不是“adafruit_ble.uart”。尽管如此,我们在 nRF52840 Dongle 上使用 CircuitPython 比在任何其他板上都更成功。

pYYBAGNkhBKAE0JjAABRQ25HOe0390.png
采用倾斜帽檐修身。
 

由于 nRF52840 Dongle 提供了选择引脚的灵活性,我在一侧焊接了 8 个相邻引脚,仅包括 VBUS 和 GND(P0.02 和 VDD OUT 未连接)。

pYYBAGNkhBWAMHaqAAD_TTb2jaw119.png
艺术家演绎
 

用 Mu 编写代码非常简单。但是,我们并不真正需要它。我们可以使用任何推荐的文本编辑器并将文件保存为 code.py 在CIRCUITPY Drive上

pYYBAGNkhBiAa_ylAAFg_bCg5Ik636.png
 

请注意,CircuitPython 会不断在板上查找更新的代码文件以运行。有四个选项:code.txt、code.py、main.txt 和 main.py。CircuitPython 按顺序查找这些文件,然后运行它找到的第一个文件。

pYYBAGNkhBuAeGL4AACV1thCjGA821.png
 

正如您在上面的屏幕截图中看到的那样,code.py 并不是唯一需要在 nRF52840 加密狗上复制的文件。CIRCUITPY.zip包含需要复制的所有文件和文件夹。

WeMos D1 Mini & OLED 显示屏

pYYBAGNkhB-AdyYiAANmvdcp-NI907.png
 

什么是方形的,蓝色的,闻起来像超级胶水?

poYBAGNkhCGAL-4DAABEj0IEF7A813.png
相信我,这是最详细的角度
 

如果您猜到了牙线盒中的 WeMos D1 Mini 和 OLED 显示屏,那么您是对的。否则,您可以再试一次。

 
 
 
pYYBAGNkhCSAep3hAAAkVHYCSMU740.jpg
 
1 / 3
 

它们之间没有直接连接,但它们都连接到 nRF52840 Dongle。我们必须使它们可分离,因为 WeMos D1 Mini 在闪烁时不喜欢 Tx 和 Rx 引脚上的任何东西。说到 WeMos D1 Mini,我们使用 Arduino IDE 来利用最好的 Wi-Fi 库之一 WiFiManager

为简单起见,WeMos D1 Mini 将连接到 Wi-Fi,然后等待来自 nRF52840 加密狗的呼叫。完成后,WeMos D1 Mini 将进入一个循环,通过 Wi-Fi 发送从 nRF52840 Dongle 接收到的任何 UART 数据。

pYYBAGNkhCeAEmtrAAFEryNWLbA278.png
 

OLED 灯没有为显示屏打开开口,而是穿过牙线盒一侧,使设置看起来更优雅。

 

谷歌表格

pYYBAGNkhCuAZtgPAAODB0DmM-4861.png
 

我们创建了 Google Sheet 来保存我们的数据并记下

poYBAGNkhC6AJtfrAADj7VDQwks651.png
 

我们在 Google Apps 脚本中使用了相同的

poYBAGNkhDGABD8vAAHaKyXoZLE653.png
 

来自 nRF5340DK 的数据将保存在第一列,而第二列保存时间戳。

poYBAGNkhDaAGqsHAAVElG7GpcQ985.png
 

第一列中的每个单元格将包含 8 个字母数字字符。前三个数字是以秒为单位的经过时间,接下来的两个是速度级别,唯一的字母是模式,最后两个数字是功率级别。

pYYBAGNkhDiASqvxAABa4HdW7OU771.png
 

如果速度级别、模式和功率级别与之前的单元格相同,则新记录将被删除,这意味着我们将仅保留包含新设置值的记录。为了表示会话结束,最后一条记录将始终为 900,即 15 分钟内的秒数。

有一个应用程序

pYYBAGNkhDuAVmA4AAB6Ar9mBME058.png
 

Google Apps 脚本期待带有有效负载 {"report":"PlaceHolder"} 的 HTTPS 发布,无论它来自 nRF52840 Dongle + WeMos D1 Mini 还是应用程序都没有关系。

poYBAGNkhD-AIMWDAAEIaUkpdnM564.png
 

nRF5340DK 的主要功能不能用应用程序代替,因为它正在控制 TENS 单元并发送数据。另一方面,我们可以将 nRF52840 Dongle + WeMos D1 Mini 替换为任何具有 BLE 和 Wi-Fi 功能的智能设备上的应用程序。最简单的方法是使用MIT App Inventor ,它已在我之前的一个项目中介绍过

pYYBAGNkhEKAehXWAAGh1SzsdJ0685.png
创建简单的 BLE Wi-Fi 网关所需的块
 

请注意,应用程序使用名称而不是 MAC(松散耦合)连接到 N-TENS。

 

保持真实

pYYBAGNkhEWAPMb2AADGbVb7dYA842.png
 

在制作这个项目的过程中,我们确实面临着问题、机遇、挑战和宝贵的学习经验。与 Wally 不同的是,我们必须克服它们。值得庆幸的是,没有一个与 nRF5340DK 相关,因为它非常强大。第一个原因是另一个更昂贵的 TENS 单元,也有 4 个按钮,但没有显示。与 nRF5340DK 不同,TENS 单元没有短路保护。第二个因果关系是一个与我们最终在这里使用的类似的 TENS 单位。

pYYBAGNkhEiACxIUAAJGjxRNylg023.png
 

只要 nRF5340DK 继续前进,就无法停止挑战极限并尝试新事物。我渴望有一天能像Torbjørn Øvrebekk那样编写代码。在那之前,我会以这样的项目为契机,向我们展示我们大多数人不会只是从床上爬起来,拼凑一些软件和硬件来构建一个项目。

结论

我希望你和我在构建这个项目时一样开心。这是功能强大的 nRF5340DK 的成功简单实施。开发板和 nRF Connect SDK 并不难使用,大部分项目工作都需要在外部完成。我通常为收到的每个硬件构建多个项目,但由于时间限制,我只用 nRF5340DK 构建了一个大项目。尽管如此,我还是学到了很多关于 BLE、Zephyr、CircuitPython 和其他有用技术的知识。

演示

这是获得 BONUS 所需的一分钟演示视频 - 15 分:

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'智能血压计(SBPM)开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);