Tentang proyek ini
Tantangan COVID-19
COVID-19 adalah penyakit yang disebabkan oleh virus SARS-CoV-2 yang terutama menyerang sistem pernapasan seseorang. Beberapa gejala yang lebih ringan dapat mencakup demam, nyeri, dan kedinginan, tetapi juga dapat menyebabkan kondisi yang lebih serius seperti pneumonia. Seseorang yang menderita radang paru-paru atau bahkan sedikit sesak napas mungkin tidak tahu kapan harus pergi ke rumah sakit, terutama karena mereka mulai kewalahan. Inilah mengapa saya membuat oksimeter pulsa open source ini, yang dapat membantu orang mendapatkan bantuan yang mereka butuhkan dan mendapatkan informasi akurat tentang kondisi mereka saat ini.
Sedikit Penafian
Perangkat/proyek ini tidak untuk digunakan sebagai alat diagnostik medis yang akurat!
Elektronik
MAX30102
128x64 Piksel OLED
Arduino Nano
Membangun Perangkat Langkah-demi-Langkah
Berikut adalah panduan langkah demi langkah tentang cara membangun proyek ini.
1. Cetak dan Bersihkan Bagian
Mulailah dengan mengunduh setiap bagian dari bagian lampiran pada proyek ini dan memuatnya ke dalam alat pengiris pilihan Anda. Saya menggunakan pengisi sekitar 70-80% dan penyangga sedang, semuanya dengan PLA. Setelah selesai mencetak, saya melepas penyangga dan melakukan pengamplasan ringan untuk memastikan semuanya cocok satu sama lain.
2. Solder Elektronik
Seluruh perangkat dirancang di sekitar Arduino Nano yang dipasang pada papan perfboard 44mm kali 30mm. Pertama, kabel disolder ke pin VIN, GND, SDA, dan SCL dari sensor, lalu disambungkan di bawah bagian alas ke Arduino Nano.
Selanjutnya, konektor untuk OLED dipasang ke Nano dan kemudian berjalan ke layar itu sendiri.
Dan terakhir, seluruh rakitan elektronik dimasukkan ke dalam rumahan dan diamankan dengan sepasang sekrup 3mm.
3. Merakit Perangkat
Setelah elektronik dimasukkan, cukup pasang layar OLED ke bagian atas dan kencangkan ke seluruh sasis dengan beberapa sekrup 3mm. Anda dapat menguji gerakannya dengan mengartikulasikan tutupnya ke atas dan ke bawah dengan lembut.
4. Mengunggah Sketsa
Sketsa yang disertakan melakukan beberapa tindakan untuk menampilkan detak jantung dan saturasi oksigen pengguna saat ini. Untuk mengunggahnya, cukup instal pustaka yang diperlukan dan pilih Arduino Nano dari daftar papan di menu Alat dan klik Unggah.
Adapun sketsa itu sendiri, pertama-tama menginisialisasi OLED dan MAX30102, sambil melaporkan kesalahan yang mungkin muncul. Selanjutnya, ia membaca dalam 100 nilai untuk mengkalibrasi sensor dan mulai menampilkannya. Perangkat kemudian memasuki loop di mana ia membaca dalam 25 nilai baru dan menghitung rata-rata bergerak dengan mereka. Terakhir, ia memeriksa apakah nilainya valid dan mencetaknya ke layar jika benar.
5. Menggunakannya
Untuk menggunakan oksimeter denyut, letakkan ujung jari Anda di atas sensor dan tutup penutup atas dengan lembut. Kemudian colokkan sumber listrik dan tunggu sampai Anda melihat data ditampilkan.
Kode
Kode Pulse OksimeterC/C++
/* Koneksi Perangkat Keras (Breakoutboard ke Arduino):-5V =5V (diizinkan 3,3V) -GND =GND -SDA =A4 (atau SDA) -SCL =A5 (atau SCL) -INT =Tidak terhubung MAX30105 Breakout dapat menangani logika 5V atau 3.3V I2C. Kami merekomendasikan memberi daya pada papan dengan 5V tetapi juga akan berjalan pada 3.3V.*/#include #include "MAX30105.h"#include "spo2_algorithm.h"#include "SSD1306Ascii.h"#include "SSD1306AsciiWire .h"MAX30105 particleSensor;SSD1306AsciiWire oled;#define MAX_BRIGHTNESS 255#jika ditentukan(__AVR_ATmega328P__) || didefinisikan(__AVR_ATmega168__)//Arduino Uno tidak memiliki cukup SRAM untuk menyimpan 50 sampel data yang dipimpin IR dan data yang dipimpin merah dalam format 32-bit//Untuk mengatasi masalah ini, MSB 16-bit dari data sampel akan dipotong. Sampel menjadi data 16-bit.uint16_t irBuffer[50]; //sensor LED inframerah datauint16_t redBuffer[50]; //data sensor LED merah#elseuint32_t irBuffer[50]; //sensor LED inframerah datauint32_t redBuffer[50]; //data sensor LED merah#endifint32_t spo2; //nilai SPO2int8_t validSPO2; //indikator untuk menunjukkan apakah perhitungan SPO2 validint32_t heartRate; //nilai detak jantungint8_t validHeartRate; //indikator untuk menunjukkan apakah perhitungan detak jantung validvoid setup(){ Serial.begin(115200); // menginisialisasi komunikasi serial pada 115200 bit per detik:oled.begin(&Adafruit128x64, 0x3C); oled.setFont(Arial14); // Inisialisasi sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Gunakan port I2C default, kecepatan 400kHz { Serial.println(F("MAX30105 was not found. Please check wiring/power.")); sementara (1); } particleSensor.setup(55, 4, 2, 200, 411, 4096); //Konfigurasikan sensor dengan pengaturan ini}void loop(){ //baca 50 sampel pertama, dan tentukan rentang sinyal untuk (byte i =0; i <50; i++) { while (particleSensor.available() ==false ) //apakah kita memiliki data baru? partikelSensor.check(); //Periksa sensor untuk data baru redBuffer[i] =particleSensor.getRed(); irBuffer[i] =particleSensor.getIR(); partikelSensor.nextSample(); //Kita sudah selesai dengan sampel ini jadi pindah ke sampel berikutnya Serial.print(F("red=")); Serial.print(redBuffer[i], DEC); Serial.print(F(", ir=")); Serial.println(irBuffer[i], DEC); } //menghitung detak jantung dan SpO2 setelah 50 sampel pertama (4 detik pertama sampel) maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); // Terus menerus mengambil sampel dari MAX30102. Denyut jantung dan SpO2 dihitung setiap 1 detik sementara (1) { //membuang 25 set sampel pertama ke dalam memori dan menggeser 25 set sampel terakhir ke atas untuk (byte i =25; i <50; i++) { redBuffer[i - 25] =redBuffer[i]; irBuffer[i - 25] =irBuffer[i]; } //ambil 25 set sampel sebelum menghitung detak jantung. for (byte i =25; i <50; i++) { while (particleSensor.available() ==false) //apakah kita memiliki data baru? partikelSensor.check(); //Periksa sensor untuk data baru redBuffer[i] =particleSensor.getRed(); irBuffer[i] =particleSensor.getIR(); partikelSensor.nextSample(); //Kita sudah selesai dengan sampel ini jadi pindah ke sampel berikutnya Serial.print(F("red=")); Serial.print(redBuffer[i], DEC); Serial.print(F(", ir=")); Serial.print(irBuffer[i], DEC); Serial.print(F(", HR=")); Serial.print(denyut jantung, DES); Serial.print(F(", HRvalid=")); Serial.print(validHeartRate, DES); Serial.print(F(", SPO2=")); Serial.print(spo2, DEC); Serial.print(F(", SPO2Valid=")); Serial.println(validSPO2, DEC); } //Setelah mengumpulkan 25 sampel baru, hitung ulang HR dan SP02 maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); printKeLayar(); }}void printToScreen() { oled.clear(); oled.setCursor(0,0); if(validSPO2 &&validHeartRate) { oled.print(F("HR:")); oled.println(denyut jantung, DES); oled.print(F("SPO2:")); oled.println(spo2, DEC); } else { oled.print(F("Tidak valid")); }}
Suku cadang dan penutup khusus
Skema