Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Mendapatkan EKG Realtime di Layar OLED

Komponen dan persediaan

Arduino UNO
× 1
perangkat uECG
× 1
Modul nRF24 (Generik)
× 1
ElectroPeak 0.96" Modul Tampilan OLED 64x128
× 1

Tentang proyek ini


Beberapa waktu lalu saya memposting beberapa proyek yang mendemonstrasikan cara mendapatkan data dari perangkat uECG - tetapi mereka memiliki cukup banyak kode yang berantakan dan masih hanya menggunakan data dasar darinya. Jadi akhirnya saya menulis perpustakaan Arduino yang membuat cara ini lebih sederhana dan jauh lebih dapat diandalkan, ini dia:https://github.com/ultimaterobotics/uECG_library (harap dicatat bahwa Anda juga perlu menginstal perpustakaan RF24 dari Manajer Perpustakaan, dan jika Anda ingin menampilkan data pada OLED seperti dalam proyek ini - juga perpustakaan SSD1306 Adafruit).

1. Skema

Skemanya sama dengan proyek lain yang menggunakan modul nRF24 dan OLED:nRF24 terhubung ke bus SPI Arduino (D13, D12, D11) dan dua pin arbitrer untuk jalur modul CS dan CE - Saya telah memilih D10 dan D9 untuk kenyamanan. Satu-satunya poin penting :modul nRF24 harus terhubung ke 3.3V garis, bukan ke 5V! Menambahkan kapasitor 1uF atau 10uF antara 3.3V dan GND juga sangat membantu - modul nRF24 tersebut memerlukan tegangan stabil yang tidak selalu dapat disediakan oleh Arduino pada saluran 3.3V-nya, kapasitor membantu dengan itu.

OLED terhubung melalui I2C - SDA ke A4, SCL ke A5, dan ditenagai dari saluran 5V. Dalam kasus saya, modul OLED memiliki resistor bawaan untuk protokol I2C. Jika modul Anda tidak memilikinya - Anda perlu menambahkan resistor 4.7k dari SDA ke 3.3V dan dari SCL ke 3.3V, meskipun sebagian besar modul yang saya lihat baru-baru ini sudah memilikinya.

Anda dapat melihat skema terlampir di bawah ini, dan ini adalah foto proyek yang dirakit:

2. Kode

Pustaka uECG membutuhkan beberapa baris kode untuk pengoperasian yang benar, yaitu:

di setup(), Anda perlu memanggil uECG.begin(pin_cs, pin_ce) - Anda perlu memberi tahu nomor pin mana yang digunakan untuk jalur nRF24 CS dan CE, ini akan mengaktifkan modul dan memasukkannya ke mode yang benar secara internal.

Dalam loop(), Anda perlu memanggil uECG.run() sesering mungkin:perangkat uECG mengirimkan banyak data - satu paket setiap beberapa milidetik - dan jika Anda tidak akan memanggil uECG.run() pada saat berikutnya paket tiba, datanya akan hilang. Itu berarti jangan pernah memanggil fungsi delay() di dalam loop, dan gunakan milis() untuk tugas yang memerlukan pengaturan waktu (saya telah menambahkan contohnya dalam contoh library).

Kode proyek ini tersedia sebagai contoh di dalam perpustakaan, dan juga dilampirkan di bawah ini (jika terlihat terlalu rumit - harap diingat bahwa di sini 95% kode didedikasikan untuk gambar tampilan yang dioptimalkan, untuk nilai pencetakan sederhana ke monitor serial Anda hanya perlu beberapa baris):

#include 
#include
#include

#define SCREEN_WIDTH 128 // OLED lebar layar, dalam piksel
#define SCREEN_HEIGHT 64 // Tinggi layar OLED, dalam piksel

// Deklarasi untuk layar SSD1306 yang terhubung ke I2C (pin SDA, SCL)
# define OLED_RESET -1 // Reset pin # (atau -1 jika berbagi pin reset Arduino)
Tampilan Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int rf_cen =9; //nRF24 chip mengaktifkan pin
int rf_cs =10; //nRF24 Pin CS

pengaturan kosong() {
Serial.begin(115200); //output serial - sangat berguna untuk debugging
while(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat 0x3D untuk 128x64
Serial.println(F("alokasi SSD1306 gagal"));
}
display.display();
delay(100);
uECG.begin(rf_cs, rf_cen);
delay(100);

// Hapus buffer
display.clearDisplay();
display.setTextSize(1); // Skala piksel 1:1 normal
display.setTextColor(WHITE); // Menggambar teks putih
display.cp437(true); // Gunakan 256 karakter penuh 'Halaman Kode 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 ekg_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(data_baru> 0)
{
uint32_t ms =milis();
int16_t ecg_data[8];
uECG.getECG(ecg_data, new_data);
for(int x =0; x Serial.println(ecg_data[x]);

for(int x =new_data; x ecg_screen[x-new_data] =ecg_screen[x];
for(int x =0; 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] 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( "langkah-langkah:");
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 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 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. Memproses data

Banyak pemrosesan dilakukan on-board dan Anda bisa mendapatkan berbagai statistik yang dihitung oleh perangkat:BPM, GSR, interval RR terakhir, parameter HRV dan 16 HRV bin (bin pertama mewakili jumlah ketukan dengan variasi <1%, bin kedua - variasi antara 1 dan 2% dll), jumlah langkah berjalan, pembacaan akselerometer (walaupun kecepatan refresh rendah sehingga hanya bagus untuk estimasi pose).

Tetapi Anda juga bisa mendapatkan pembacaan EKG mentah - aliran data tidak sempurna, kadang-kadang beberapa paket hilang, namun Anda masih bisa mendapatkan sesuatu yang dapat digunakan:

Nah, itu dia - jika Anda memiliki perangkat ini mengumpulkan debu di sudut, sekarang benar-benar bekerja tanpa terlalu banyak kesulitan :)

Kode

perpustakaan arduino uECG
Memiliki OLED dan contoh serial sederhana di dalamhttps://github.com/ultimaterobotics/uECG_library

Skema


Proses manufaktur

  1. Maxim:modul biosensor PPG dan EKG terintegrasi untuk perangkat seluler
  2. API sensor lingkungan dengan RPi
  3. Memulai TJBot
  4. Modul Verilog
  5. Parameter Verilog
  6. Java 9 - Sistem Modul
  7. Game Arduino Pong - Tampilan OLED
  8. Otomata Seluler berbasis Arduino dan OLED
  9. Hindari The Defs!
  10. Tutorial Arduino 01:Memulai