资料介绍
描述
前段时间,我发布了几个项目,演示了如何从 uECG 设备获取数据 - 但他们有很多混乱的代码,并且仍然只使用其中的基本数据。所以最后我写了一个Arduino库,使这种方式更简单,更可靠,这里是:https ://github.com/ultimaterobotics/uECG_library(请注意,您还需要从库管理器安装RF24 库,如果您想要在这个项目中显示OLED上的数据 - 也是Adafruit 的 SSD1306 库)。
1. 原理图
原理图与使用 nRF24 模块和 OLED 的任何其他项目相同:nRF24 连接到 Arduino 的 SPI 总线(D13、D12、D11)和模块 CS 和 CE 线的两个任意引脚 - 为了方便起见,我选择了 D10 和 D9。唯一重要的一点:nRF24模块必须接3.3V线,不能接5V!在 3.3V 和 GND 之间添加 1uF 或 10uF电容器也有很大帮助——那些 nRF24 模块需要稳定的电压,而 Arduino 不能总是在其 3.3V 线路上提供,电容器有助于实现这一点。
OLED 通过I2C- SDA 连接到 A4,SCL 连接到 A5,并由 5V 线路供电。就我而言,OLED 模块具有用于 I2C 协议的内置电阻器。如果您的模块没有它们 - 您需要在 SDA 到 3.3V 和从 SCL 到 3.3V 之间添加 4.7k电阻,尽管我最近看到的大多数模块已经有了它们。
您可以在下面看到示意图,这是组装项目的照片:
2.代码
uECG 库需要几行代码才能正常运行,即:
在 setup() 中,您需要调用 uECG.begin(pin_cs, pin_ce) - 您需要告诉它哪些引脚号用于 nRF24 CS 和 CE 线路,它将打开模块并在内部将其置于正确的模式。
在 loop() 中,您需要尽可能频繁地调用 uECG.run():uECG 设备会发送大量数据 - 每几毫秒一个数据包 - 如果您在下一次之前不调用 uECG.run()数据包到达,其数据将丢失。这意味着永远不要在循环内调用 delay() 函数,并为需要计时的任务使用 millis() (我在库示例中添加了一个示例)。
该项目代码在库中作为示例提供,也附在下面(如果它看起来太复杂 - 请记住,这里 95% 的代码专用于优化显示绘图,用于简单地将值打印到串行监视器中只需要几行):
#include#include#include#define SCREEN_WIDTH 128 // OLEDdisplaywidth,inpixels#define SCREEN_HEIGHT 64 // OLEDdisplayheight,inpixels// Declaration foran SSD1306displayconnected to I2C (SDA, SCL pins)#define OLED_RESET -1 //Resetpin # (or-1ifsharing Arduinoresetpin)Adafruit_SSD1306display(SCREEN_WIDTH, SCREEN_HEIGHT,&Wire, OLED_RESET);int rf_cen = 9; //nRF24 chip enable pinint rf_cs = 10; //nRF24 CS pinvoid setup() {Serial.begin(115200); //serialoutput- very useful for debuggingwhile(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64Serial.println(F("SSD1306 allocation failed"));}display.display();delay(100);uECG.begin(rf_cs, rf_cen);delay(100);// Clear the bufferdisplay.clearDisplay();display.setTextSize(1); // Normal 1:1 pixel scaledisplay.setTextColor(WHITE); // Draw white textdisplay.cp437(true); // Use full 256 char'Code Page 437'fontdisplay.display();delay(100);Serial.println("after display");}uint32_t prev_data_count = 0;uint32_t prev_displ = 0;uint8_t ecg_screen[128];int ecg_screen_len = 128;float ecg_avg = 0;float ecg_max = 1;float ecg_min = -1;int ecg_size = 40;int displ_phase = 0;void loop(){uECG.run();uint32_t data_count = uECG.getDataCount();int new_data = data_count - prev_data_count;prev_data_count = data_count;if(new_data > 0){uint32_t ms = millis();int16_t ecg_data[8];uECG.getECG(ecg_data, new_data);for(intx= 0;x< new_data;x++)Serial.println(ecg_data[x]);for(intx= new_data;x< ecg_screen_len;x++)ecg_screen[x-new_data] = ecg_screen[x];for(intx= 0;x< new_data;x++){ecg_avg*= 0.99;ecg_avg += 0.01*ecg_data[x];ecg_max = ecg_max*0.995 + ecg_avg*0.005;ecg_min = ecg_min*0.995 + ecg_avg*0.005;if(ecg_data[x] > ecg_max) ecg_max = ecg_data[x];if(ecg_data[x] < ecg_min) ecg_min = ecg_data[x];int ecg_y = 63-ecg_size*(ecg_data[x] - ecg_min) / (ecg_max - ecg_min + 1);ecg_screen[ecg_screen_len-1-new_data+x] = ecg_y;}if(ms - prev_displ > 30){prev_displ = ms;if(displ_phase == 0){display.clearDisplay();display.setCursor(0, 0);display.print("BPM: ");display.println(uECG.getBPM());display.print(" RR: ");display.println(uECG.getLastRR());display.print("steps: ");display.print(uECG.getSteps());int batt_mv = uECG.getBattery();int batt_perc = (batt_mv - 3300)/8;if(batt_perc < 0) batt_perc = 0;if(batt_perc > 100) batt_perc = 100;display.drawLine(110, 0, 127, 0, WHITE);display.drawLine(110, 10, 127, 10, WHITE);display.drawLine(110, 0, 110, 10, WHITE);display.drawLine(127, 0, 127, 10, WHITE);int bat_len = batt_perc / 6;for(intx= 1;x< 10;x++)display.drawLine(110,x, 110+bat_len,x, WHITE);}if(displ_phase == 1){for(intx= 1;x< ecg_screen_len/2;x++)display.drawLine(x-1, ecg_screen[x-1],x, ecg_screen[x], WHITE);}if(displ_phase == 2){for(intx= ecg_screen_len/2;x< ecg_screen_len-1;x++)display.drawLine(x-1, ecg_screen[x-1],x, ecg_screen[x], WHITE);}if(displ_phase == 3)display.display();displ_phase++;if(displ_phase > 3) displ_phase = 0;}}}
3.处理数据
板载执行大量处理,您可以获得设备计算的各种统计数据:BPM、GSR、最后 RR 间隔、HRV参数和 16 个 HRV 箱(第一个箱表示变化 <1% 的节拍量,第二个箱 - 1% 到 2% 之间的变化等),步行的步数,加速度计读数(虽然刷新率很低,所以它只适用于姿势估计)。
但是您也可以获得原始 ECG 读数 - 数据流并不完美,有时会丢失一些数据包,但您仍然可以获得可用的东西:
好吧,就是这样 - 如果你让这个设备在角落里收集灰尘,现在它实际上可以正常工作了:)
- 简易心电图仪的设计1次下载
- Arduino心电图屏蔽1次下载
- 基于堆叠式双向循环神经网络的心电图分类算法4次下载
- 基于虚拟仪器的胎儿心电提取实现与设计1次下载
- 如何进行心电图机器自动分析算法的研究与实现概述21次下载
- 新型心电图仪的设计详析15次下载
- 动态心电图动脉图同步检测仪的设计详析13次下载
- MSP430低功耗便携式心电图仪设计详析20次下载
- MSP430动态心电图采集系统解析7次下载
- 基于STM32的便携式心电图仪设计68次下载
- 基于STM32的便携式心电图仪的设计与实现58次下载
- 心电图(ECG)解决方案124次下载
- 心电图机热敏打印系统设计81次下载
- ECG-6511型心电图机走纸速度控制电路的分析46次下载
- 一种新的胎儿心电图提取算法26次下载
- 研究人员创造一种六角形心电图贴片 实现遥感与数据传输功能203次阅读
- 基于STM32单片机的心电图系统设计802次阅读
- 国产铁电存储器PB85RS2MC在心电图机中的应用264次阅读
- 使用腕戴式心电监护仪减轻胸部重量1123次阅读
- dfrobot心电图电极片简介1582次阅读
- 心电信号采集及心电图分类识别的方法研究1.3w次阅读
- 一文了解OLED屏幕4459次阅读
- 便携式心电诊断式系统设计与实现1085次阅读
- USB传输的嵌入式心电图量测系统设计1539次阅读
- 基于STM32芯片和TFT-LCD的便携式心电图仪设计1.1w次阅读
- 基于MSP430的低功耗便携式心电仪的设计3218次阅读
- 基于MSP430设计的微型家用心电图机1138次阅读
- 利用 SPICE 分析理解心电图前端中的右腿驱动3238次阅读
- ZigBee无线传感心电图监视仪技术1050次阅读
- 人体右腿驱动心电图放大电路图8473次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB |532次下载 |免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB |339次下载 |免费
- 3TC358743XBG评估板参考手册
- 1.36 MB |330次下载 |免费
- 4DFM软件使用教程
- 0.84 MB |295次下载 |免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB |227次下载 |免费
- 6迪文DGUS开发指南
- 31.67 MB |194次下载 |免费
- 7元宇宙底层硬件系列报告
- 13.42 MB |182次下载 |免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB |178次下载 |免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB |234315次下载 |免费
- 2555集成电路应用800例(新编版)
- 0.00 MB |33566次下载 |免费
- 3接口电路图大全
- 未知 |30323次下载 |免费
- 4开关电源设计实例指南
- 未知 |21549次下载 |免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB |15349次下载 |免费
- 6数字电路基础pdf(下载)
- 未知 |13750次下载 |免费
- 7电子制作实例集锦 下载
- 未知 |8113次下载 |免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB |6656次下载 |免费
总榜
- 1matlab软件下载入口
- 未知 |935054次下载 |免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB |537798次下载 |免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 |420027次下载 |免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB |234315次下载 |免费
- 5Altium DXP2002下载入口
- 未知 |233046次下载 |免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 |191187次下载 |免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M |183279次下载 |免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 |138040次下载 |免费
评论
查看更多