電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>在OLED屏幕上獲取實(shí)時(shí)心電圖

在OLED屏幕上獲取實(shí)時(shí)心電圖

2022-12-23 | zip | 0.07 MB | 次下載 | 免費(fèi)

資料介紹

描述

前段時(shí)間,我發(fā)布了幾個項(xiàng)目,演示了如何從 uECG 設(shè)備獲取數(shù)據(jù) - 但他們有很多混亂的代碼,并且仍然只使用其中的基本數(shù)據(jù)。所以最后我寫了一個 Arduino 庫,使這種方式更簡單,更可靠,這里是:https ://github.com/ultimaterobotics/uECG_library (請注意,您還需要從庫管理器安裝 RF24 庫,如果您想要在這個項(xiàng)目中顯示 OLED 上的數(shù)據(jù) - 也是 Adafruit 的 SSD1306 庫)。

1. 原理圖

原理圖與使用 nRF24 模塊和 OLED 的任何其他項(xiàng)目相同:nRF24 連接到 Arduino 的 SPI 總線(D13、D12、D11)和模塊 CS 和 CE 線的兩個任意引腳 - 為了方便起見,我選擇了 D10 和 D9。唯一重要的一點(diǎn):nRF24模塊必須接3.3V線,不能接5V!在 3.3V 和 GND 之間添加 1uF 或 10uF 電容器也有很大幫助——那些 nRF24 模塊需要穩(wěn)定的電壓,而 Arduino 不能總是在其 3.3V 線路上提供,電容器有助于實(shí)現(xiàn)這一點(diǎn)。

OLED 通過 I2C - SDA 連接到 A4,SCL 連接到 A5,并由 5V 線路供電。就我而言,OLED 模塊具有用于 I2C 協(xié)議的內(nèi)置電阻器。如果您的模塊沒有它們 - 您需要在 SDA 到 3.3V 和從 SCL 到 3.3V 之間添加 4.7k 電阻,盡管我最近看到的大多數(shù)模塊已經(jīng)有了它們。

您可以在下面看到示意圖,這是組裝項(xiàng)目的照片:

pYYBAGOlH1CASEVbAAosSycB6Kg559.jpg
?

2.代碼

uECG 庫需要幾行代碼才能正常運(yùn)行,即:

在 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ù)包到達(dá),其數(shù)據(jù)將丟失。這意味著永遠(yuǎn)不要在循環(huán)內(nèi)調(diào)用 delay() 函數(shù),并為需要計(jì)時(shí)的任務(wù)使用 millis() (我在庫示例中添加了一個示例)。

該項(xiàng)目代碼在庫中作為示例提供,也附在下面(如果它看起來太復(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è)備計(jì)算的各種統(tǒng)計(jì)數(shù)據(jù):BPM、GSR、最后 RR 間隔、HRV 參數(shù)和 16 個 HRV 箱(第一個箱表示變化 <1% 的節(jié)拍量,第二個箱 - 1% 到 2% 之間的變化等),步行的步數(shù),加速度計(jì)讀數(shù)(雖然刷新率很低,所以它只適用于姿勢估計(jì))。

但是您也可以獲得原始 ECG 讀數(shù) - 數(shù)據(jù)流并不完美,有時(shí)會丟失一些數(shù)據(jù)包,但您仍然可以獲得可用的東西:

poYBAGOlH2iARbhHAAJC6xvKoWY979.png
?

好吧,就是這樣 - 如果你讓這個設(shè)備在角落里收集灰塵,現(xiàn)在它實(shí)際上可以正常工作了:)


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)