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

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Komponen dan Perlengkapan

Berikut adalah daftar komponen yang diperlukan untuk membangun sensor oksimeter DIY ini:

Alat dan Mesin yang Diperlukan

Aplikasi dan Layanan Online

Tentang Proyek Ini

Selama periode isolasi ini, saya membangun sebuah oksimeter dengan komponen yang sudah ada di rumah. Sebuah oksimeter pada dasarnya hanya terdiri dari dua LED dan satu dioda fotovoltaik.

Saya bukan pakar dalam ilmu medis, dan pada tahap ini saya tidak yakin apakah pekerjaan ini memiliki nilai diagnostik, tetapi ini adalah proyek edukasi yang baik untuk mempelajari cara kerjanya, dan mungkin dengan beberapa tips ini bisa menjadi alat medis buatan sendiri.

Saturasi Oksigen dan COVID-19

Selama periode luar biasa ini, kita telah mempelajari banyak hal tentang virus, paru-paru, masker bedah, sabun, dan mencuci tangan. Semua orang membaca tentang gejala seperti batuk, demam, dan kesulitan bernapas. Kami juga mengetahui bahwa satu cara untuk mengukur kesulitan bernapas adalah dengan membaca jumlah oksigen dalam darah kita.

Pengukuran ini dapat dibaca secara tidak langsung dengan alat medis yang disebut Oksimeter. Anda mungkin sudah melihatnya, ini adalah alat non invasif yang ditempatkan di jari dengan beberapa lampu berdenyut yang melakukan pekerjaannya. Seperti ini:

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Secara normal, ketika Anda dalam kondisi baik, Anda memiliki persentase saturasi oksigen (SpO2) mendekati atau lebih dari 95%. Ketika saturasi turun di bawah 90% dan Anda mengalami batuk serta demam, itu adalah masalah.

Jika setiap pembuat (maker) dapat membangun oksimeter, menemukan infeksi akan lebih mudah dan dapat membantu orang untuk memutuskan pergi ke rumah sakit ketika masalah benar-benar ada, dan bukan karena serangan panik.

Pertama, Pahami Cara Kerja Sensor Denyut Jantung

Saya memulai proyek ini dengan bermain-main dengan sensor denyut jantung KY-039 yang saya temukan dalam sekumpulan sensor yang banyak dimiliki di rumah. Seperti yang Anda lihat dalam rangkaian di bawah ini, ini hanyalah satu LED infra merah yang menyinari dioda fotovoltaik. Terdapat juga dua resistor untuk melindungi LED dan membaca sinyal kecil dari sensor.

Jadi jika Anda tidak memiliki sensor KY-039, Anda dapat membangun sensor Anda sendiri dengan beberapa komponen.

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Jari ditempatkan antara sensor dan dioda fotovoltaik seperti dalam foto ini (asalnya diambil dari situs ini dan dimodifikasi):

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Cahaya yang dipancarkan oleh LED infra merah sebagian diserap oleh kuku, kulit, dan semua bagian lain dari jari Anda, tetapi tidak konstan karena berubah mengikuti perubahan darah yang mengalir dalam vena Anda. Jika jantung Anda berdenyut, darah dihasilkan ke dalam vena Anda dan penyerapan cahaya berubah. Kita dapat mengukur arus yang dihasilkan oleh dioda fotovoltaik yang disinari oleh cahaya infra merah yang sampai ke sana.

Sensor KY-039 memiliki pin S (sinyal) untuk membaca nilai yang berubah ini.

Kita dapat mengukur rata-rata denyut jantung dengan menghitung puncak sinyal

Membaca nilai dari sinyal variabel dari sensor tidak begitu mudah, karena ada banyak kebisingan, sinyal sangat rendah, dan kita perlu melakukan beberapa matematika untuk menemukan nilai yang baik untuk divisualisasikan.

Saya ingin mengucapkan terima kasih pada postingan berguna dari Johan Ha, yang menjelaskan cara menghitung rata-rata sinyal dan juga menjelaskan cara menghilangkan kebisingan yang dibuat oleh lampu rumah (cahaya itu adalah kebisingan!).

Triknya adalah membuat array di mana kita mendorong sebuah nilai dan membuang sebuah nilai untuk membuat rata-rata dari nilai X terakhir yang dibaca dari sensor. Ia juga menjelaskan cara menemukan kenaikan sinyal, dengan menghitung N nilai yang bertambah. Maksud saya, ketika nilai lebih besar dari nilai sebelumnya selama N kali, itu adalah puncak.

Menggunakan alat plot Serial Arduino atau alat serial lain untuk menganalisis nilai yang dicetak pada port COM (seperti SerialPlot), dan mencoba berbagai nilai kita dapat menentukan angka N yang benar (rise_threshold konstanta n dalam kode). Jika Anda menentukan angka terlalu besar atau terlalu kecil Anda dapat melewatkan beberapa denyut atau menghitung dicrotic notch sebagai denyut.

Setelah Anda memahami cara menemukan puncak, cukup hitungnya, atau hitung waktu antara serangkaian denyut kecil untuk menentukan rata-rata BPM Anda (Beats Per Minute).

Membangun oksimeter (membajak sensor KY-039) untuk menemukan saturasi oksigen

Darah kita menyerap cahaya dengan cara yang berbeda dengan perubahan panjang gelombang cahaya. Cahaya merah (~600nm) diserap lebih baik oleh darah yang mengandung lebih banyak oksigen, jadi kita dapat membandingkan pengukuran yang dilakukan dengan LED infra merah (~950nm) dengan yang dilakukan dengan LED merah dan menemukan persentase oksigen dalam darah kita. Nilai itu disebut Sp02% (peripheral capillary oxygen saturation).

Karena saya memiliki sensor KY-039 saya memutuskan untuk memodifikasinya. Ini hanya memiliki satu LED infra merah, jadi saya menambahkan satu LED MERAH, mencabut LED IR dari Vcc dan menghubungkan dengan resistor 330 ohm kedua LED tersebut ke dua pin yang berbeda pada Arduino.

(Jika Anda tidak memiliki sensor KY-039 untuk dimodifikasi Anda dapat membangunnya, ini hanyalah pasang LED, satu dioda fotovoltaik dan 3 resistor, dan skematisnya sangat sederhana!)

Ini adalah skematik dari sensor yang dimodifikasi:

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Dengan cara ini kita dapat menyalakan LED IR dan membaca nilai dari pin S KY-039, lalu kita dapat mematikan LED IR dan menyalakan LED MERAH, dan membaca nilai dari pin S KY-039.

Ini adalah milik saya:

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Jika Anda memplot dua sinyal Anda dapat melihat bahwa nilai IR selalu lebih rendah dari nilai Merah.

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Untuk menemukan sinyal yang baik ingatlah untuk menempatkan ujung jari dengan benar di atas dioda fotovoltaik dan LED harus menyentuh kuku, ketika Anda menemukan posisi yang nyaman dengan pembacaan yang baik di plot jangan mengubahnya.

Karena sinyal rendah dan kebisingan sangat bermasalah, untuk mendapatkan pengukuran yang berguna saya telah memperhatikan bahwa cahaya lingkungan yang baik selalu diperlukan. Jadi, jangan gerakkan jari Anda saat mengukur dan jangan ubah cahaya, hanya bayangan pada sensor dapat mengubah segalanya.

Bagaimana cara mengukur saturasi SpO2%

Tingkat saturasi oksigen (SpO2) adalah fraksi hemoglobin yang terpuas oksigen relatif terhadap total hemoglobin dan adalah fungsi dari parameter yang disebut R (Saya menemukan informasi ini dalam sebuah kertas akademik dari Politecnico of Milan), yang dihitung menggunakan nilai minimum dan maksimum dari dua sinyal:

R = ( (REDmax-REDmin) / REDmin ) / ((IRmax-IRmin) / IRmin)

Setiap instrumen memiliki R miliknya sendiri dan diperlukan kalibrasi untuk menemukan kurva (fungsi) yang menghubungkan R dengan SpO2%.

Kami telah menghitung jumlah puncak, tetapi sekarang kita perlu menemukan nilai max dan min dua kurva (LED MERAH dan LED IR).

Untuk menyelesaikan pekerjaan ini kita mengevaluasi "periode" denyut jantung (yaitu berapa milidetik satu denyut berlangsung) dan membaginya dengan laju pemantauan untuk menentukan berapa sampel yang membuat satu periode. Laju pemantauan dalam kasus kami adalah 40 milidetik karena kita membaca LED IR selama 20 milidetik dan kemudian LED MERAH selama 20 milidetik lainnya.

Periode denyut adalah waktu yang berlalu antara dua kurva naik dalam sinyal.

Jadi saya dapat menganalisis sampel L terakhir (di mana L = periode / 40), yang telah saya simpan dalam sebuah array, untuk menemukan nilai REDmax, REDmin, IRmax dan IRmin.

Dengan nilai maksimum dan minimum saya dapat menghitung R.

R, L dan periode dihitung setiap denyut, jadi perhitungan R juga dilakukan untuk setiap denyut.

Dari R ke SpO2%: Bagaimana cara mengkalibrasi oksimeter?

Fungsi yang menghubungkan R dengan SpO2 dapat disederhanakan dengan garis lurus:

SpO2 = K * R + M

Jadi kita butuh dua titik (dua pasang nilai SpO2 dan R) untuk menentukan K dan M. Satu-satunya cara untuk menemukan 2 titik ini adalah menggunakan oksimeter lain dan membaca nilai dari tampilannya.

Oksimeter baru akan menjadi referensi, kita membaca nilai SpO2 saat mengukur nilai R dari oksimeter buatan sendiri kami.

Pertama bernapas secara normal, dan baca nilai SpO2 dan R. Tulis catatannya.

Kemudian coba tahan napas dan setelah 10-20 detik Anda akan membaca SpO2 di oksimeter baru menurun, Anda juga harus melihat parameter R dari oksimeter Anda meningkat. Sebelum pingsan, tulis nilai SpO2 yang tercapai dan nilai parameter R Anda.

Selesaikan persamaan derajat 2 dan temukan K dan M untuk oksimeter Anda.

Sekarang mungkin untuk menghitung nilai bpm dan SpO2 untuk setiap pengukuran R.

Saya juga menambahkan tampilan untuk menunjukkan semua angka, saya hanya menampilkan nilai jika saya telah menemukan setidaknya 5 pengukuran periode yang tidak berubah terlalu banyak (±10% dari panjang periode). Dengan cara ini saya menghilangkan nilai yang berubah terlalu banyak yang tergantung pada komponen yang buruk atau perubahan cahaya lingkungan atau gerakan jari.

Nilai c menunjukkan bahwa nilai yang ditampilkan dihitung dengan c pengukuran stabil.

Perbaikan proyek: hilangkan variabilitas cahaya lingkungan

Setelah beberapa hari bermain-main dengan proyek saya, saya telah menemukan cara untuk memperbaikinya.

Saya memperhatikan bahwa dengan komponen dengan biaya rendah ini (kita hanya menggunakan LED dan satu dioda fotovoltaik!) pengukuran terlalu bergantung pada cahaya lingkungan dan ini bukan hal yang baik, jika kita ingin membaca data dengan benar dalam lingkungan kerja nyata. Karena saya memperhatikan bahwa pada hari yang cerah hasilnya lebih baik daripada dengan cahaya mendung atau di malam hari ketika saya menggunakan lampu listrik, saya memutuskan untuk menambahkan satu LED ketiga, yang selalu menyala dan hanya memberikan cahaya pada jari.

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Dengan sensor 3-LED ini pengukuran juga dilakukan di bawah kain hitam untuk mengecualikan cahaya lingkungan yang selalu dapat berubah.

Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen

Sekarang, hasilnya lebih baik dan tidak lagi bergantung pada cahaya lingkungan.

Saya juga harus mengkalibrasi ulang oksimeter, seperti yang Anda lihat dari video setelah beberapa detik itu dengan benar menemukan bpm dan SpO2%:


Kode

oximeter-diy-ver-0.92.inoArduino

Ini adalah kode sumber dari Oksimeter DIY, yang dibuat dengan beberapa komponen yang bisa dimiliki oleh pembuat di rumah.

/* * an oximeter diy. v.0.92 (minor fixes) * by hacking a ky-039 heartbeat sensor or using an infrared led * a red led and a photodiode. * https://hackaday.io/project/170752-oximeter-do-it-yourself */ #include <Wire.h> #include <LiquidCrystal_I2C.h> #define maxperiod_siz 80 // max number of samples in a period #define measures 10 // number of periods stored #define samp_siz 4 // number of samples for average #define rise_threshold 3 // number of rising measures to determine a peak // a liquid crystal displays BPM LiquidCrystal_I2C lcd(0x3F, 16, 2); int T = 20; // slot milliseconds to read a value from the sensor int sensorPin = A1; int REDLed = 3; int IRLed = 4; byte sym[3][8] = { { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000 },{ B00000, B00000, B00000, B11000, B00100, B01000, B10000, B11100 },{ B00000, B00100, B01010, B00010, B00100, B00100, B00000, B00100 } }; void setup() { Serial.begin(9600); Serial.flush(); pinMode(sensorPin,INPUT); pinMode(REDLed,OUTPUT); pinMode(IRLed,OUTPUT); // initialize the LCD lcd.init(); lcd.backlight(); // turn off leds digitalWrite(REDLed,LOW); digitalWrite(IRLed,LOW); for(int i=0;i<8;i++) lcd.createChar(i, sym[i]); } void loop () { bool finger_status = true; float readsIR[samp_siz], sumIR,lastIR, reader, start; float readsRED[samp_siz], sumRED,lastRED; int period, samples; period=0; samples=0; int samplesCounter = 0; float readsIRMM[maxperiod_siz],readsREDMM[maxperiod_siz]; int ptrMM =0; for (int i = 0; i < maxperiod_siz; i++) { readsIRMM[i] = 0;readsREDMM[i]=0;} float IRmax=0; float IRmin=0; float REDmax=0; float REDmin=0; double R=0; float measuresR[measures]; int measuresPeriods[measures]; int m = 0; for (int i = 0; i < measures; i++) { measuresPeriods[i]=0; measuresR[i]=0; } int ptr; float beforeIR; bool rising; int rise_count; int n; long int last_beat; for (int i = 0; i < samp_siz; i++) { readsIR[i] = 0; readsRED[i]=0; } sumIR = 0; sumRED=0; ptr = 0; while(1) { // // turn on IR LED digitalWrite(REDLed,LOW); digitalWrite(IRLed,HIGH); // calculate an average of the sensor // during a 20 ms (T) period (this will eliminate // the 50 Hz noise caused by electric light n = 0; start = millis(); reader = 0.; do { reader += analogRead (sensorPin); n++; } while (millis() < start + T); reader /= n; // we got an average // Add the newest measurement to an array // and subtract the oldest measurement from the array // to maintain a sum of last measurements sumIR -= readsIR[ptr]; sumIR += reader; readsIR[ptr] = reader; lastIR = sumIR / samp_siz; // // TURN ON RED LED and do the same digitalWrite(REDLed,HIGH); digitalWrite(IRLed,LOW); n = 0; start = millis(); reader = 0.; do { reader += analogRead (sensorPin); n++; } while (millis() < start + T); reader /= n; // we got an average // Add the newest measurement to an array // and subtract the oldest measurement from the array // to maintain a sum of last measurements sumRED -= readsRED[ptr]; sumRED += reader; readsRED[ptr] = reader; lastRED = sumRED / samp_siz; // // R CALCULATION // save all the samples of a period both for IR and for RED readsIRMM[ptrMM]=lastIR; readsREDMM[ptrMM]=lastRED; ptrMM++; ptrMM %= maxperiod_siz; samplesCounter++; // // if I've saved all the samples of a period, look to find // max and min values and calculate R parameter if(samplesCounter>=samples){ samplesCounter =0; IRmax = 0; IRmin=1023; REDmax = 0; REDmin=1023; for(int i=0;i<maxperiod_siz;i++) { if( readsIRMM[i]> IRmax) IRmax = readsIRMM[i]; if( readsIRMM[i]>0 && readsIRMM[i]< IRmin ) IRmin = readsIRMM[i]; readsIRMM[i] =0; if( readsREDMM[i]> REDmax) REDmax = readsREDMM[i]; if( readsREDMM[i]>0 && readsREDMM[i]< REDmin ) REDmin = readsREDMM[i]; readsREDMM[i] =0; } R = ( (REDmax-REDmin) / REDmin) / ( (IRmax-IRmin) / IRmin ) ; } // check that the finger is placed inside // the sensor. If the finger is missing // RED curve is under the IR. // if (lastRED < lastIR) { if(finger_status==true) { finger_status = false; lcd.clear(); lcd.setCursor(0,0); lcd.print("No finger?"); } } else { if(finger_status==false) { lcd.clear(); finger_status = true; lcd.setCursor(10,0); lcd.print("c="); lcd.setCursor(0,0); lcd.print("bpm"); lcd.setCursor(0,1); lcd.print("SpO"); lcd.write(1); //2 lcd.setCursor(10,1); lcd.print("R="); } } float avR = 0; int avBPM=0; if (finger_status==true){ // lastIR holds the average of the values in the array // check for a rising curve (= a heart beat) if (lastIR > beforeIR) { rise_count++; // count the number of samples that are rising if (!rising && rise_count > rise_threshold) { lcd.setCursor(3,0); lcd.write( 0 ); // <3 // Ok, we have detected a rising curve, which implies a heartbeat. // Record the time since last beat, keep track of the 10 previous // peaks to get an average value. // The rising flag prevents us from detecting the same rise // more than once. rising = true; measuresR[m] = R; measuresPeriods[m] = millis() - last_beat; last_beat = millis(); int period = 0; for(int i =0; i<measures; i++) period += measuresPeriods[i]; // calculate average period and number of samples // to store to find min and max values period = period / measures; samples = period / (2*T); int avPeriod = 0; int c = 0; // c stores the number of good measures (not floating more than 10%), // in the last 10 peaks for(int i =1; i<measures; i++) { if ( (measuresPeriods[i] < measuresPeriods[i-1] * 1.1) && (measuresPeriods[i] > measuresPeriods[i-1] / 1.1) ) { c++; avPeriod += measuresPeriods[i]; avR += measuresR[i]; } } m++; m %= measures; lcd.setCursor(12,0); lcd.print(String(c)+" "); // bpm and R shown are calculated as the // average of at least 5 good peaks avBPM = 60000 / ( avPeriod / c) ; avR = avR / c ; // if there are at last 5 measures lcd.setCursor(12,1); if(c==0) lcd.print(" "); else lcd.print(String(avR) + " "); // if there are at least 5 good measures... if(c > 4) { // // SATURTION IS A FUNCTION OF R (calibration) // Y = k*x + m // k and m are calculated with another oximeter int SpO2 = -19 * R + 112; lcd.setCursor(4,0); if(avBPM > 40 && avBPM <220) lcd.print(String(avBPM)+" "); //else lcd.print("---"); lcd.setCursor(4,1); if(SpO2 > 70 && SpO2 <150) lcd.print( " " + String(SpO2) +"% "); //else lcd.print("--% "); } else { if(c <3) { // if less then 2 measures add ? lcd.setCursor(3,0); lcd.write( 2 ); //bpm ? lcd.setCursor(4,1); lcd.write( 2 ); //SpO2 ? } } } } else { // Ok, the curve is falling rising = false; rise_count = 0; lcd.setCursor(3,0);lcd.print(" "); } // to compare it with the new value and find peaks beforeIR = lastIR; } // finger is inside // PLOT everything Serial.print(lastIR); Serial.print(","); Serial.print(lastRED); /* * Serial.print(","); Serial.print(R); Serial.print(","); Serial.print(IRmax); Serial.print(","); Serial.print(IRmin); Serial.print(","); Serial.print(REDmax); Serial.print(","); Serial.print(REDmin); Serial.print(","); Serial.print(avR); Serial.print(","); Serial.print(avBPM); */ Serial.println(); // handle the arrays ptr++; ptr %= samp_siz; } // loop while 1 } 

Skematik

Dalam proyek saya saya telah memodifikasi KY-039 tetapi sensor itu tidak tersedia dalam perpustakaan fritzing jadi saya membangunnya dengan sedikit komponen yang membuatnya tetapi saya tidak menemukan dioda fotovoltaik yang tepat dalam perpustakaan fritizing.oximeter-diy_oW9ZI5zQtJ.fzzSebuah oksimeter sederhana untuk membaca oksigen dalam darah dapat dibuat dengan membajak sensor KY-039, atau dengan membangun sensor dari nol,Panduan Membangun Sensor Oksimeter Akurat DIY – IR, Arduino, LCD & Komponen


Proses manufaktur

  1. Rangkaian Hemat Daya Sensor Infra Merah Pasif: Desain, Operasi, dan Aplikasi
  2. Gelombang LiDAR Mana yang Akan Mendominasi Aplikasi Otomotif?
  3. Membangun Sensor Gerak Infrared DIY untuk Raspberry Pi – Panduan Langkah Demi Langkah
  4. Mengontrol LED dengan Sensor Gerak PIR pada Raspberry Pi
  5. Bangun Sensor Kelembaban Tanah Berbasis Raspberry Pi Biaya Rendah untuk Irigasi Cerdas
  6. Menguji Sensor Suhu DS18B20 pada Raspberry Pi
  7. Membangun Pemantau Suhu Rumah Raspberry Pi dengan MCP9808, InfluxDB & Grafana
  8. Sensor Telemetry 2.0.1 – Pemantauan Suhu Canggih dengan Azure IoT Hub
  9. Sensor Emosi & EEG: Hardware Biaya Rendah untuk Deteksi Emosi Real-Time
  10. Pengukuran Suhu Inframerah Presisi untuk Proses Sensitif Warna