資料介紹
描述
前段時間,我發(fā)布了幾個項目,演示了如何從 uECG 設(shè)備獲取數(shù)據(jù) - 但他們有很多混亂的代碼,并且仍然只使用其中的基本數(shù)據(jù)。所以最后我寫了一個 Arduino 庫,使這種方式更簡單,更可靠,這里是:https ://github.com/ultimaterobotics/uECG_library (請注意,您還需要從庫管理器安裝 RF24 庫,如果您想要在這個項目中顯示 OLED 上的數(shù)據(jù) - 也是 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 模塊需要穩(wěn)定的電壓,而 Arduino 不能總是在其 3.3V 線路上提供,電容器有助于實現(xiàn)這一點。
OLED 通過 I2C - SDA 連接到 A4,SCL 連接到 A5,并由 5V 線路供電。就我而言,OLED 模塊具有用于 I2C 協(xié)議的內(nèi)置電阻器。如果您的模塊沒有它們 - 您需要在 SDA 到 3.3V 和從 SCL 到 3.3V 之間添加 4.7k 電阻,盡管我最近看到的大多數(shù)模塊已經(jīng)有了它們。
您可以在下面看到示意圖,這是組裝項目的照片:

2.代碼
uECG 庫需要幾行代碼才能正常運行,即:
在 setup() 中,您需要調(diào)用 uECG.begin(pin_cs, pin_ce) - 您需要告訴它哪些引腳號用于 nRF24 CS 和 CE 線路,它將打開模塊并在內(nèi)部將其置于正確的模式。
在 loop() 中,您需要盡可能頻繁地調(diào)用 uECG.run():uECG 設(shè)備會發(fā)送大量數(shù)據(jù) - 每幾毫秒一個數(shù)據(jù)包 - 如果您在下一次之前不調(diào)用 uECG.run()數(shù)據(jù)包到達,其數(shù)據(jù)將丟失。這意味著永遠不要在循環(huán)內(nèi)調(diào)用 delay() 函數(shù),并為需要計時的任務(wù)使用 millis() (我在庫示例中添加了一個示例)。
該項目代碼在庫中作為示例提供,也附在下面(如果它看起來太復(fù)雜 - 請記住,這里 95% 的代碼專用于優(yōu)化顯示繪圖,用于簡單地將值打印到串行監(jiān)視器中只需要幾行):
#include
#include
#include
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int rf_cen = 9; //nRF24 chip enable pin
int rf_cs = 10; //nRF24 CS pin
void setup() {
Serial.begin(115200); //serial output - very useful for debugging
while(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
}
display.display();
delay(100);
uECG.begin(rf_cs, rf_cen);
delay(100);
// Clear the buffer
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.cp437(true); // Use full 256 char 'Code Page 437' font
display.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(int x = 0; x < new_data; x++)
Serial.println(ecg_data[x]);
for(int x = new_data; x < ecg_screen_len; x++)
ecg_screen[x-new_data] = ecg_screen[x];
for(int x = 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(int x = 1; x < 10; x++)
display.drawLine(110, x, 110+bat_len, x, WHITE);
}
if(displ_phase == 1)
{
for(int x = 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(int x = 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.處理數(shù)據(jù)
板載執(zhí)行大量處理,您可以獲得設(shè)備計算的各種統(tǒng)計數(shù)據(jù):BPM、GSR、最后 RR 間隔、HRV 參數(shù)和 16 個 HRV 箱(第一個箱表示變化 <1% 的節(jié)拍量,第二個箱 - 1% 到 2% 之間的變化等),步行的步數(shù),加速度計讀數(shù)(雖然刷新率很低,所以它只適用于姿勢估計)。
但是您也可以獲得原始 ECG 讀數(shù) - 數(shù)據(jù)流并不完美,有時會丟失一些數(shù)據(jù)包,但您仍然可以獲得可用的東西:

好吧,就是這樣 - 如果你讓這個設(shè)備在角落里收集灰塵,現(xiàn)在它實際上可以正常工作了:)
- ADI心電圖(ECG)解決方案
- 簡易心電圖儀的設(shè)計
- Arduino心電圖屏蔽
- 基于堆疊式雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的心電圖分類算法 4次下載
- 使用LABVIEW實現(xiàn)心電圖的資料合集免費下載 25次下載
- 如何進行心電圖機器自動分析算法的研究與實現(xiàn)概述 21次下載
- 新型心電圖儀的設(shè)計詳析 15次下載
- 動態(tài)心電圖動脈圖同步檢測儀的設(shè)計詳析 13次下載
- MSP430動態(tài)心電圖采集系統(tǒng)解析 8次下載
- 基于STM32的便攜式心電圖儀設(shè)計 68次下載
- 心電圖(ECG)解決方案 124次下載
- 心電圖機熱敏打印系統(tǒng)設(shè)計 81次下載
- 無線心電圖通信芯片研制 90次下載
- ECG-6511型心電圖機走紙速度控制電路的分析
- 一種新的胎兒心電圖提取算法
- 研究人員創(chuàng)造一種六角形心電圖貼片 實現(xiàn)遙感與數(shù)據(jù)傳輸功能 1.5k次閱讀
- 基于STM32單片機的心電圖系統(tǒng)設(shè)計 3.1k次閱讀
- 國產(chǎn)鐵電存儲器PB85RS2MC在心電圖機中的應(yīng)用 916次閱讀
- FPGA在OLED上顯示DHT11數(shù)據(jù) 2.5k次閱讀
- 利用MAX11040K同步采樣Σ-ΔAD簡化心電圖儀的應(yīng)用設(shè)計 2.5k次閱讀
- dfrobot心電圖電極片簡介 2.7k次閱讀
- 心電信號采集及心電圖分類識別的方法研究 1.6w次閱讀
- 便攜式心電診斷式系統(tǒng)設(shè)計與實現(xiàn) 1.7k次閱讀
- USB傳輸?shù)那度胧?b class="flag-6" style="color: red">心電圖量測系統(tǒng)設(shè)計 2.3k次閱讀
- 基于STM32芯片和TFT-LCD的便攜式心電圖儀設(shè)計 1.5w次閱讀
- 基于MSP430的低功耗便攜式心電儀的設(shè)計 4.1k次閱讀
- 基于MSP430設(shè)計的微型家用心電圖機 1.6k次閱讀
- 利用 SPICE 分析理解心電圖前端中的右腿驅(qū)動 4.1k次閱讀
- ZigBee無線傳感心電圖監(jiān)視儀技術(shù) 1.5k次閱讀
- 人體右腿驅(qū)動心電圖放大電路圖 9.4k次閱讀
下載排行
本周
- 1耗盡型MOS FET產(chǎn)品目錄選型表
- 0.14 MB | 2次下載 | 免費
- 2TI系列-米爾TI AM62L核心板開發(fā)板-高能效低功耗嵌入式平臺
- 1.51 MB | 次下載 | 免費
- 3WILLSEMI韋爾20年半年度報告由代理分銷經(jīng)銷一級代理分銷經(jīng)銷
- 3.30 MB | 次下載 | 免費
- 4LRC 樂山無線電InTWSApplications家電由原廠代理分銷經(jīng)銷一級代理分銷經(jīng)銷供應(yīng)
- 85.84 KB | 次下載 | 免費
- 5LAT1596 一文說明白 STM32G4 雙 Bank 啟動與升級
- 0.64 MB | 次下載 | 5 積分
- 6LAT1594_基于事件喚醒低功耗之介紹
- 0.37 MB | 次下載 | 5 積分
- 7PT8P2309 觸控 A/D 型 8-Bit MCU規(guī)格書
- 4.05 MB | 次下載 | 免費
- 8PT8P2308 觸控 A/D 型 8-Bit MCU規(guī)格書
- 4.13 MB | 次下載 | 免費
本月
- 1美的電磁爐電路原理圖資料
- 4.39 MB | 19次下載 | 10 積分
- 2反激式開關(guān)電源設(shè)計解析
- 0.89 MB | 11次下載 | 5 積分
- 3耗盡型MOS FET產(chǎn)品目錄選型表
- 0.14 MB | 2次下載 | 免費
- 4簡易光伏控制器原理圖資料
- 0.07 MB | 1次下載 | 5 積分
- 52EDL05x06xx系列 600V半橋門驅(qū)動器帶集成自舉二極管(BSD)手冊
- 0.69 MB | 1次下載 | 免費
- 6國產(chǎn)千兆網(wǎng)口芯片PT153S中文資料
- 1.35 MB | 次下載 | 免費
- 7斯丹電子 | 用于芯片測試系統(tǒng)的射頻干簧繼電器
- 5.11 MB | 次下載 | 免費
- 8SFI立昌ESD/TVS管原廠代理分銷經(jīng)銷一級代理分銷經(jīng)銷
- 294.76 KB | 次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233095次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183360次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81605次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73829次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論