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

Tampilan ECG Realtime pada OLED dengan Arduino UNO

Komponen dan Perlengkapan

Tentang Proyek Ini

Beberapa waktu lalu saya memposting beberapa proyek yang menunjukkan cara mendapatkan data dari perangkat uECG - namun mereka memiliki banyak kode yang berantakan dan masih hanya menggunakan data dasar dari perangkat itu. Jadi akhirnya saya menulis library Arduino yang membuatnya jauh lebih sederhana dan jauh lebih andal, berikut ini: https://github.com/ultimaterobotics/uECG_library (perlu diperhatikan bahwa Anda juga perlu menginstal library RF24 dari Library Manager, dan jika Anda ingin menampilkan data pada OLED seperti dalam proyek ini - juga library Adafruit's SSD1306).

1. Skematik

Skematik sama seperti untuk proyek lain yang menggunakan modul nRF24 dan OLED: nRF24 terhubung ke bus SPI Arduino (D13, D12, D11) dan dua pin arbitrary untuk baris CS dan CE modul - saya memilih D10 dan D9 untuk kenyamanan. Poin penting: modul nRF24 harus terhubung ke garis 3.3V, bukan ke 5V! Ini juga sangat membantu untuk menambahkan kapasitor 1uF atau 10uF antara 3.3V dan GND - modul nRF24 ini membutuhkan tegangan stabil yang Arduino tidak selalu dapat memberikan pada garis 3.3V-nya, kapasitor membantu hal itu.

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

Anda dapat melihat skematik yang dilampirkan di bawah ini, dan berikut adalah foto proyek yang telah dirakit:

Tampilan ECG Realtime pada OLED dengan Arduino UNO

2. Kode

Library uECG membutuhkan cukup banyak baris kode untuk operasi yang tepat, yaitu:

Dalam setup(), Anda perlu memanggil uECG.begin(pin_cs, pin_ce) - Anda perlu memberitahu nomor pin mana yang digunakan untuk baris CS dan CE nRF24, itu akan menyala modul dan menempatkannya dalam mode yang benar secara internal.

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

Kode proyek ini tersedia sebagai contoh di dalam library, dan juga dilampirkan di bawah ini (jika terlihat terlalu kompleks - ingatlah bahwa di sini 95% kode didedikasikan untuk menggambar layar yang dioptimalkan, untuk mencetak nilai sederhana ke serial monitor Anda hanya butuh beberapa baris):

#include <uECG.h> #include <Wire.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // lebar layar OLED, dalam piksel #define SCREEN_HEIGHT 64 // tinggi layar OLED, dalam piksel #define OLED_RESET -1 // Pin reset # (atau -1 jika berbagi pin reset Arduino) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); int rf_cen = 9; // pin chip enable nRF24 int rf_cs = 10; // pin CS nRF24 void setup() { Serial.begin(115200); while(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); } display.display(); delay(100); uECG.begin(rf_cs, rf_cen); delay(100); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.cp437(true); 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. Memproses Data

Sangat banyak pemrosesan dilakukan di papan dan Anda dapat mendapatkan berbagai statistik yang dihitung oleh perangkat: BPM, GSR, interval RR terakhir, parameter HRV dan 16 bins HRV (bin pertama mewakili jumlah detak dengan variasi <1%, bin kedua - variasi antara 1 dan 2% dll), jumlah langkah yang ditempuh, pembacaan akselerometer (meskipun tingkat penyegaran rendah jadi bagus hanya untuk estimasi pose).

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

Tampilan ECG Realtime pada OLED dengan Arduino UNO

Nah, itu saja - jika Anda memiliki perangkat ini yang menempel di sudut, sekarang ini sebenarnya bekerja tanpa terlalu banyak kesulitan :)

Kode

Library Arduino uECG

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

Skematik

Tampilan ECG Realtime pada OLED dengan Arduino UNO

Proses manufaktur

  1. Maxim’s MAX86150: Modul Terintegrasi PPG & ECG untuk Pemantauan Kesehatan Mobile
  2. Membuat API Suhu & Sensor Kuat di Raspberry Pi dengan Modul GY-91
  3. Memulai dengan TJBot: Bangun, Konfigurasikan, dan Kendalikan dengan Suara Robot AI Anda
  4. Dasar Modul Verilog: Struktur & Sintaks
  5. Menguasai Parameter Verilog: Membangun Modul yang Dapat Digunakan Ulang dan Dapat Diskalakan
  6. Sistem Modul Java 9: Peningkatan, Waktu Link, dan Citra Runtime Kustom
  7. Membuat Game Pong Klasik pada Arduino UNO dengan Layar OLED – Tutorial Langkah demi Langkah
  8. Bangun Automata Seluler Real-Time di Arduino dengan Layar OLED 128x64
  9. Proyek LCD Arduino DIY: Rangkaikan dengan Resistor, Tombol, dan Layar 16x2
  10. Tutorial Arduino Untuk Pemula 01: Mulai dengan Proyek Pertama Anda