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

Dari KY-039 Hingga Detak Jantung

Komponen dan persediaan

Arduino UNO
× 1
sensor detak jantung KY-039
× 1
Kabel jumper (generik)
× 1

Tentang proyek ini

Dalam set 37 sensor untuk Arduino , ada sensor detak jantung. Nama itu terlalu menjanjikan. Orang cenderung berpikir itu memberikan nomor digital melalui I2C atau yang serupa, nomor yang merupakan tingkat detak jantung. Apa yang disediakan sensor hanyalah nilai "analog" dari 0 hingga 1023, yang memberi tahu berapa banyak cahaya infra merah yang diterima sensor cahaya, atau sebenarnya seberapa banyak sesuatu yang menaungi sensor cahaya . Semakin tinggi nilainya, semakin sedikit cahaya infra merah.

Singkatnya:letakkan jari Anda di antara LED IR dan transistor cahaya dari sensor. Detak jantung Anda melebarkan pembuluh darah di jari Anda, yang akan menyaring IR. Ini menciptakan sinyal berdenyut.

Dalam proyek ini saya menjelaskan bagaimana sinyal ini diubah menjadi tingkat detak jantung seperti 66 BPM (beats per minute).

Langkah-langkah sederhana

Jika Anda baru saja membaca dan memplot nilai dari sensor KY-039, Anda mendapatkan sesuatu seperti ini:

Nilainya adalah nilai integer. Tidak terlalu akurat. Alih-alih menghitung rata-rata dari sekelompok mereka dan plot rata-rata. Anda mendapatkan ini:

Di sini Anda sudah bisa melihat denyut jantung. Dapatkan perbedaan waktu antara setiap kenaikan signifikan dari pulsa. Dari situ Anda dapat menghitung detak jantung dalam BPM.

(Pola zig zag kecil pada gambar di atas disebabkan oleh cahaya buatan, 50 Hz, hal lain yang harus dihadapi.)

Langkah-langkah dijelaskan

Berikut beberapa kode sederhana untuk menampilkan apa pun yang Anda baca dari sensor KY-039:

// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ while(1) { Serial.print(analogRead(sensorPin)); Serial.print('\n'); }}  

Apa yang mungkin Anda dapatkan adalah seperti ini:

Karena ini adalah keterangan dari jendela monitor serial yang membaca keluaran serial dari Arduino Anda pada 9600 baud, seluruh proses akan diatur waktunya oleh Serial.print() fungsi, yang akan mengatur kecepatan untuk membaca dan memplot nilai. Bagaimanapun, kurvanya sangat bergerigi, karena bervariasi antara 360 dan 383 dan hanya memiliki nilai integer.

Menghaluskan

Untuk mendapatkan output yang lebih halus, ambil rata-rata katakanlah 20 pembacaan terakhir dari sensor. Inilah cara saya melakukannya. Saya mendefinisikan konstanta yang mengatakan berapa banyak bacaan yang saya inginkan:

#define samp_siz 20 

Lalu saya memiliki array yang menampung jumlah bacaan itu:

int reads[samp_siz];  

Untuk setiap bacaan baru, saya mengurangi bacaan terlama dari jumlah dan menambahkan bacaan terbaru ke penjumlahan. Dalam array saya mengganti bacaan terlama dengan bacaan terbaru.

 reader =analogRead (sensorPin); // baca jumlah sensor -=reads[ptr]; // kurangi bacaan terlama dari sum sum +=reader; // tambahkan bacaan terbaru ke jumlah reads[ptr] =reader; // simpan pembacaan terbaru dalam array last =float(sum) / samp_siz; // hitung rata-rata sekarang ptr++; // perbarui indeks untuk larik, miliki ptr %=samp_siz; // restart pada 0 saat dibutuhkan 

Dengan ukuran array 20 dan baud rate 9600 di monitor serial, saya mungkin mendapatkan plot seperti ini:

Di sini Anda melihat detak jantung yang sebenarnya sebagai kurva naik yang curam. Tapi Anda juga melihat pola zig zag kecil. Zig zag yang lebih kecil berasal dari lampu dapur saya, tiga lampu LED menerangi ruangan. Listrik di rumah saya adalah 240 V, 50 Hz AC. Jadi 50 kali per detik ada peningkatan intensitas cahaya, ternyata juga di pita IR. Saya ingin menghaluskan suara 50 Hz itu. Seharusnya berfungsi, jika saya membaca nilai dari sensor selama periode 20 ms dan mengambil rata-rata semua nilai. Mari kita lihat...

 n =0; mulai =mili(); pembaca =0.; lakukan { reader +=analogRead (sensorPin); // membaca dan menambahkan nilai... n++; sekarang =mili(); } while (sekarang  

Dengan cuplikan ini saya mengambil pembacaan sensor dalam potongan 20 ms, yang akan meratakan kedipan 50 Hz yang disebabkan oleh cahaya buatan. Jika Anda tinggal di negara dengan 60 Hz, gunakan potongan 16,67 ms sebagai gantinya. Atau 16667.

Karena saya sudah menghaluskan kurva di bagian 20 ms, saya sebenarnya tidak membutuhkan array yang saya gunakan sebelumnya, tetapi karena ada di sana dan mudah diubah ukurannya, saya membiarkannya di sana. Dan menggunakan ukuran array 5 tampaknya bahkan mengeluarkan suara terakhir yang mengganggu. Inilah yang saya miliki sekarang:

Hal terakhir yang perlu saya lakukan adalah mengenali bagian mana pun dalam pola berulang. Karena kemiringan yang menanjak lebih teratur, saya melakukannya. Perhatikan bagaimana nilai sumbu y sangat berbeda di semua grafik. Saya benar-benar tidak bisa hanya mengandalkan nilai absolut. Saya hanya bisa mengandalkan naik turunnya kurva. Matematikawan akan berbicara tentang turunan. Saya puas jika saya menemukan n nilai naik berturut-turut, di mana n bisa menjadi nilai yang dapat disesuaikan berguna. Saya mulai dengan 5. Untuk ini saya memiliki rise_threshold konstanta didefinisikan dalam kode. Ketika saya menemukan 5 nilai kenaikan berturut-turut, saya tahu saya berada di bagian bawah kurva menuju ke atas. saya mengambil waktu. Saya menunggu kurva turun, lalu saya menunggu 5 nilai naik berikutnya dan perhatikan waktunya. Kemudian saya mencetak BPM yang sesuai.

Saya melakukan tes dan dihitung bagaimana banyak berturut-turut naik nilai di sana adalah di yang kurva dan ditemukan keluar di sana adalah antara 10 dan 15. Jadi jika Saya hitung ke 5, Saya akan sebagian besar pasti tahu Saya sudah ditemukan yang mulai dari yang detak jantung.

Karena saya hanya mencetak setelah setiap detak jantung, tidak akan ada banyak pencetakan. Akan ada lebih banyak waktu untuk membaca sensor. Saya mungkin menangkap lebih sering noise, yang tidak akan saya lihat, karena plotter tidak menyala. Mari kita lihat cara kerjanya.

Kode terakhir

#define samp_siz 4#define rise_threshold 5// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ float reads[samp_siz], sum; int panjang sekarang, ptr; mengapung terakhir, pembaca, mulai; float pertama, kedua, ketiga, sebelumnya, print_value; bool naik; int kenaikan_jumlah; int n; int last_beat panjang; for (int i =0; i  sebelumnya) { rise_count++; if (!naik &&rise_count> rise_threshold) { // Oke, kami telah mendeteksi kurva naik, yang menyiratkan detak jantung. // Catat waktu sejak ketukan terakhir, lacak dua // kali sebelumnya (pertama, kedua, ketiga) untuk mendapatkan rata-rata tertimbang. // Bendera yang naik mencegah kita mendeteksi kenaikan yang sama // lebih dari sekali. naik =benar; pertama =milis () - last_beat; last_beat =milis(); // Hitung rata-rata tertimbang dari detak jantung // menurut tiga ketukan terakhir print_value =60000. / (0,4 * pertama + 0,3 * kedua + 0,3 * ketiga); Serial.print(nilai_cetak); Serial.print('\n'); ketiga =kedua; kedua =pertama; } } else { // Oke, kurvanya turun naik =false; naik_jumlah =0; } sebelum =terakhir; ptr++; ptr %=samp_siz; }}  

Ini bekerja cukup baik. Ini videonya.

Perhatikan bahwa led RX kecil berkedip di Arduino selaras dengan hati saya. Hanya karena ketika ada detak jantung, tingkat dihitung dan dicetak ke serial, yang berkedip led. Ketika jari bergerak sedikit, akan ada kesalahan pembacaan.

Pengembangan lebih lanjut

Saat ini tarif yang dicetak dihitung berdasarkan tiga ketukan terakhir. Tapi bisa lebih tepat untuk menghitungnya berdasarkan katakanlah periode 15 detik. Saya dapat menyimpan 15 nilai tingkat berturut-turut, menghitung rata-rata, lalu mengabaikan lima nilai yang terjauh dari rata-rata dan menghitung rata-rata baru. Ini akan memberikan pengukuran detak jantung yang andal dan stabil.

Saya hanya menguji sensor pada istri saya dan saya. Setiap langkah dalam meningkatkan sinyal telah saya buat berdasarkan bacaan sebelumnya. Orang lain mungkin memiliki jenis detak jantung lain yang menyebabkan kurva berbentuk berbeda, yang memerlukan pendekatan lain untuk menemukan detaknya. Mungkin kurva jatuh yang lebih mudah dikenali. Atau paling atas. Dan apa yang terjadi jika pulsa 180 - 200 BPM? Menemukan kurva yang naik mungkin lebih sulit.

Kode

  • Versi terakhir
Versi finalC/C++
Program membaca detak jantung dan mencetak kecepatan di jendela serial.
#define samp_siz 4#define rise_threshold 4// Pulse Monitor Test Scriptint sensorPin =0;void setup() { Serial.begin(9600);}void loop (){ float dibaca[samp_siz], jumlah; int panjang sekarang, ptr; mengapung terakhir, pembaca, mulai; float pertama, kedua, ketiga, sebelumnya, print_value; bool naik; int kenaikan_jumlah; int n; int last_beat panjang; for (int i =0; i  sebelumnya) { rise_count++; if (!naik &&rise_count> rise_threshold) { // Oke, kami telah mendeteksi kurva naik, yang menyiratkan detak jantung. // Catat waktu sejak ketukan terakhir, lacak dua // kali sebelumnya (pertama, kedua, ketiga) untuk mendapatkan rata-rata tertimbang. // Bendera yang naik mencegah kita mendeteksi kenaikan yang sama lebih dari sekali. naik =benar; pertama =milis() - last_beat; last_beat =milis(); // Hitung rata-rata tertimbang dari detak jantung // menurut tiga ketukan terakhir print_value =60000. / (0,4 * pertama + 0,3 * kedua + 0,3 * ketiga); Serial.print(nilai_cetak); Serial.print('\n'); ketiga =kedua; kedua =pertama; } } else { // Oke, kurvanya turun naik =false; naik_jumlah =0; } sebelum =terakhir; ptr++; ptr %=samp_siz; }} 

Skema


Proses manufaktur

  1. Sensor Warna – Bekerja dan Aplikasi
  2. OPT3007 Ultra -Thin Sensor Cahaya Sekitar
  3. Streaming Data Sensor dari ppDAQC Pi Plate Menggunakan InitialState
  4. Sensor Suhu dan Cahaya Raspberry Pi
  5. Solar Driveway Light ke MSP430 Wireless Sensor Node
  6. Suara– dan SMS–Sensor Cahaya yang Diaktifkan Menggunakan Raspberry Pi dan Twilio
  7. Windows 10 IoT Core – Membaca Denyut Jantung
  8. Sensor Cahaya Raspberry Pi:Tutorial LDR Sederhana
  9. Sensor Cahaya Digital
  10. Monitor Detak Jantung Jarak Jauh