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

Indikator Detak Jantung Menggunakan EKG

Komponen dan persediaan

perangkat uECG
× 1
Arduino Nano R3
× 1
Adafruit NeoPixel Ring:WS2812 5050 RGB LED
× 1
Baterai Li-Ion 1000mAh
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Tentang proyek ini

Selama bertahun-tahun saya hanya ingin membuat sesuatu dengan LED yang berkedip sesuai detak jantung saya (dan tidak hanya ketika saya diam, namun melompat-lompat di sana-sini). Itu ternyata sangat sulit, saya mencoba dan gagal selama bertahun-tahun. Tapi sekarang tidak lagi!

Sebenarnya semua angkat berat dilakukan oleh uECG - perangkat EKG kecil yang dapat dipakai yang open source dan memiliki pin keluaran yang ramah Arduino (pin itu menjadi tinggi/rendah dengan setiap detak jantung). Memproses status pin ini jauh lebih mudah daripada memproses sinyal EKG, dan saya telah mencoba memaksimalkannya.
UPD:Anda mungkin ingin memeriksa iterasi ke-2 dari proyek ini, yang menerima data melalui tautan radio.

1. Skema
Karena kami hanya bekerja dengan sinyal digital di sini, jadi sangat sederhana. Tetapi sebagai perangkat yang dapat dikenakan akan jauh lebih andal (dan lebih kecil) jika sebagian besar sambungan disolder - untuk pengujian cepat tidak perlu, tetapi jika Anda akan memakainya selama beberapa aktivitas berat, saya sangat merekomendasikannya.
Skema terlihat seperti ini:

  • Pin DI dari cincin LED masuk ke pin D11 (dapat dikonfigurasi dalam kode)
  • Pin DRV perangkat uECG masuk ke pin D3 (juga dapat dikonfigurasi)
  • Baterai + masuk ke input Arduino 5V dan cincin LED 5V
  • Baterai - masuk ke Arduino GND, membunyikan GND dan GND uECG

Saya telah menggunakan baterai LiPo secara langsung sebagai input 5V - tidak ada kesalahan, jika Anda menghubungkannya ke Vin - baterai tidak akan bekerja dengan andal (pengatur tegangan pada Vin menyebabkan penurunan tegangan dan kami benar-benar tidak mampu membelinya di sini). Soalnya, Arduino stabil selama tegangan input tidak sampai di bawah 3,4 volt. Baterai LiPo mulai dari 4,2 volt saat terisi penuh, dan mencapai 3,4 volt hanya saat daya tersisa kurang dari 15%. Jadi dengan baterai apa pun yang lebih besar dari ~200 mAh, Anda bisa mendapatkan waktu pengoperasian yang layak. Selain itu, harap diingat bahwa baterai harus dihubungkan melalui beberapa konektor :) Karena Anda ingin melepaskannya dari skema dan mengisi daya sesekali.

2. Kode
Program ini bekerja dengan cara yang sederhana:ia terus-menerus membaca pin D3, dan ketika perubahan terdeteksi - mendorong waktu perubahan itu ke dalam array 20-elemen. Selisih antara elemen pertama dan terakhir, dibagi 20, adalah waktu rata-rata per ketukan (dalam milidetik). Jadi membagi 1 menit (60000 milidetik) dengan angka itu memberi kita nilai BPM. Anda dapat menyesuaikan jumlah elemen dalam array. Jumlah elemen yang lebih sedikit akan menghasilkan respons yang lebih cepat, tetapi hasil yang kurang stabil (masalah apa pun dalam deteksi ketukan akan menyebabkan lompatan besar dalam BPM yang dihitung). Jumlah elemen yang lebih tinggi akan memberikan data yang lebih stabil, tetapi respons lebih lambat saat BPM berubah dengan cepat.

Kemudian BPM dipetakan menjadi warna (biru->hijau->kuning->merah muda->merah ketika BPM naik dari rendah ke tinggi), dan menjadi jumlah LED:untuk 80 BPM delapan segmen menyala, untuk 110 - sebelas dan seterusnya (skala juga dapat disesuaikan dalam kode).

#include 
#ifdef __AVR__
#include
#endif
// DI pin cincin LED
#define PIN 11
// jumlah piksel dalam ring
#define NUMPIXELS 16
// pin input untuk menghubungkan uECG
int in_pin =3;
Adafruit_NeoPixel piksel =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
pengaturan kosong() {
piksel.begin(); // Ini menginisialisasi perpustakaan NeoPixel.
pinMode(in_pin, INPUT); //set pin ke mode input
digitalWrite(in_pin, 1); //aktifkan PULLUP:ini penting, uECG tidak memiliki pull-up internal
}
//kami menyimpan 20 detak jantung terakhir untuk meratakan BPM di atasnya
//dengan nilai yang lebih tinggi, itu akan menjadi lebih dapat diandalkan,
//tetapi akan membutuhkan lebih banyak waktu untuk melihat perubahan output ketika BPM berubah
#define BEAT_HIST 20
denyut panjang[BEAT_HIST];
void push_beat(long ms) //geser semua ketukan dalam larik dan masukkan satu ketukan saat ini
{
for(int x =0; x {
denyut[x] =ketukan[x+1];
}
denyut[BEAT_HIST-1] =ms;
}
int get_bpm() //menggunakan perbedaan waktu antara ketukan pertama dan terakhir
{
long dt =ketukan[BEAT_HIST-1] - ketukan[0];
panjang bpm =BEAT_HIST * 60000 / dt;
balikkan bpm;
}
long last_pix_upd =0; //untuk melacak kapan kami memperbarui piksel sebelumnya
int prev_in_state =0; //status pin input sebelumnya:kami hanya ingin memproses perubahan status
void loop()
{
long ms =milis();
int in_state =digitalRead(in_pin ); // saat tidak ada detak yang terdeteksi, 0 dalam detak
if(in_state ==1 &&prev_in_state ==0) //bereaksi hanya untuk mengubah
{
push_beat(ms);
}
prev_in_state =in_state;
if(ms - last_pix_upd> 10) //jangan terlalu sering memperbarui piksel
{
int r, g, b;
last_pix_upd =ms;
int bpm =get_bpm();
int max_bright =120; //nilai kecerahan maksimum, maks 255. Tapi Anda tidak selalu menginginkannya maksimal :)
float dd =20; //perubahan BPM antar tone warna (biru->hijau->kuning->pink->merah)
float t1 =90, t2, t3, t4; //t1 - BPM "dasar", lebih rendah dari t1 akan berwarna biru
t2 =t1 + dd;
t3 =t2 + dd;
t4 =t3 + dd;
/ /kode untuk mengubah warna tergantung pada rentang t1...t4 kita sekarang
if(bpm else if(bpm else if(bpm else if(bpm else {r =max_bright; g =0; b =0; }
if(in_state) //bila tidak dalam irama, 1/4 intensitas, jadi hanya ketukan yang disorot
{
r *=0.25;
g *=0.25;
b *=0.25;
}
int on_pixels =(bpm+5)/10; //jumlah LED yang digunakan:untuk 60 BPM, 6 LED akan menyala, untuk 120 - 12 dst
for(int i=0;i{
if( i else pixels.setPixelColor(i, pixels.Color(0,0,0)); //matikan semua LED lainnya
}
pixels.show();
}
}

3. Perakitan sebagai perangkat yang dapat dikenakan
Lebih mudah untuk menempatkan Arduino di dalam ring - ukurannya hampir sama dengan sempurna. Baterai cocok di dekatnya juga. Jangan lupa bahwa uECG ditempatkan di peti - jadi Anda membutuhkan kabel dengan konektor, pertama Anda memasangnya, lalu Anda mengenakan baju dengan komponen lain, dan kemudian Anda pasang konektornya. Kalau tidak, akan sangat merepotkan untuk memakainya - percayalah, saya sudah mencoba ))

Itu pada dasarnya - jika semuanya dilakukan dengan benar, dalam 30 detik setelah Anda mencolokkan semua konektor, itu akan mulai berkedip dan menunjukkan BPM.

4. Pengujian lapangan
Saya mengujinya sambil berjalan dan berlari - dan menemukan bahwa selama berlari, baterai memantul tepat di atas sensor EKG, mendistorsi pembacaannya. Ketika saya memindahkan semuanya sedikit, ternyata kabel yang menghubungkan uECG dengan Arduino terlalu pendek dan menarik sensor EKG dengan setiap langkah, mendistorsi pembacaan lagi. Secara keseluruhan, saya mendapatkan ketukan yang andal hanya saat berjalan dan berdiri, tetapi tidak berlari - namun saya pikir saya akan meningkatkannya. Sensor itu sendiri, ketika saya menggunakannya dengan baju yang berbeda, menampilkan BPM dengan benar saat berlari juga (diperiksa melalui aplikasinya).

Juga, ternyata LED di peti mungkin terlihat keren tetapi praktis tidak berguna. Sungguh merepotkan untuk melihat ke bawah untuk memeriksa denyut nadi Anda. Saya pikir di iterasi berikutnya saya akan membuat semacam gelang tangan yang akan menunjukkan ketukan.

P.S. Jika Anda tertarik dengan proyek uECG - Anda dapat memeriksa halaman hackaday-nya, ada banyak detail teknis, desain PCB, diskusi, dan log proyek

Kode

  • uECG_pixel_ring.ino
uECG_pixel_ring.inoArduino
#include #ifdef __AVR__ #include #endif// DI pin ring LED#define PIN 11// jumlah piksel di ring#define NUMPIXELS 16// input pin untuk menghubungkan uECGint in_pin =3; Adafruit_NeoPixel pixels =Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);void setup() { pixels.begin(); // Ini menginisialisasi perpustakaan NeoPixel. pinMode(in_pin, INPUT); //set pin ke mode input digitalWrite(in_pin, 1); //aktifkan PULLUP:ini penting, uECG tidak memiliki internal pull-up}//kami menyimpan 20 detak jantung terakhir untuk meratakan BPM di atasnya//dengan nilai yang lebih tinggi, ini akan menjadi lebih andal,//tetapi akan membutuhkan lebih banyak waktu untuk melihat perubahan output ketika BPM berubah#define BEAT_HIST 20 ketukan panjang[BEAT_HIST];void push_beat(md panjang) //geser semua ketukan dalam larik dan masukkan yang sekarang{ for(int x =0; x  10) //jangan terlalu sering memperbarui piksel { int r, g, b; last_pix_upd =ms; int bpm =get_bpm(); int max_bright =120; //nilai kecerahan maksimum, maks 255. Tapi Anda tidak selalu menginginkannya maksimal :) float dd =20; //mengubah BPM antar tone warna (biru->hijau->kuning->merah muda->merah) float t1 =90, t2, t3, t4; //t1 - BPM "dasar", lebih rendah dari t1 akan berwarna biru t2 =t1 + dd; t3 =t2 + dd; t4 =t3 + dd; //kode untuk mengubah warna tergantung pada rentang t1...t4 kita sekarang if(bpm   

Skema


Proses manufaktur

  1. Defibrillator Eksternal
  2. Rolling Pin
  3. Hati Buatan
  4. Katup Jantung Buatan
  5. Sensor Gerak menggunakan Raspberry Pi
  6. Pantau suhu rumah Anda menggunakan Raspberry Pi
  7. Monitor Detak Jantung Jarak Jauh
  8. Sistem Memungkinkan Pemantauan Irama Jantung Tanpa Kontak Menggunakan Speaker Cerdas
  9. Tato Elektronik Memungkinkan Pemantauan Jantung Tanpa Gangguan untuk Waktu yang Lama
  10. Memahami Sendi Knuckle