DIY Open-Source Pulsoximeter voor COVID-19: Arduino Build
Onderdelen en benodigdheden
| Arduino Nano R3 | 1 | |
| Maxim Integrated MAX30102 Puls- en Hartslagsensor | 1 | |
| DFRobot Gravity I2C OLED-2864 Display | 1 |
Benodigde tools en machines
| 3D-printer (generiek) | |
| Solderbout (generiek) |
Apps en online diensten
| Arduino IDE | |
| Autodesk Fusion 360 |
Over dit project
De uitdagingen van COVID-19
COVID-19 is een ziekte veroorzaakt door het SARS-CoV-2-virus dat voornamelijk het ademhalingssysteem aanvalt. Mildere symptomen kunnen koorts, pijn en rillingen zijn, maar het kan ook leiden tot ernstigere aandoeningen zoals longontsteking. Een persoon met longontsteking of zelfs lichte benauwdheid weet misschien niet wanneer ze naar het ziekenhuis moet gaan, zeker niet als ziekenhuizen overvol raken. Daarom heb ik deze open-source pulsoximeter gemaakt, die kan helpen bij het krijgen van de juiste hulp en nauwkeurige informatie over de huidige toestand.
Een waarschuwing
Dit apparaat/project is niet bedoeld als een accurate medische diagnostische tool!
De elektronica
MAX30102
128x64 Pixel OLED
Arduino Nano
Het apparaat stap voor stap bouwen
Hier is een stapsgewijze handleiding voor het bouwen van dit project.
1. Onderdelen printen en schoonmaken
Begin met het downloaden van elk onderdeel uit de bijlagen en laad het in je slicer. Ik gebruikte een invulling van 70-80% en medium supports, allemaal met PLA. Na het printen haalde ik de supports eraf en schuurde lichtjes om te zorgen dat alles netjes past.
2. De elektronica solderen
Het hele apparaat is ontworpen rond een Arduino Nano die op een 44mm x 30mm perforatieplaatje gemonteerd zit. Eerst worden draden gesoldeerd aan de VIN, GND, SDA en SCL pinnen van de sensor en daarna onder het bodemstuk naar de Arduino Nano geleid.
Vervolgens wordt de connector voor de OLED aan de Nano gesoldeerd en naar het display geleid.
Tot slot wordt de hele elektronica in de behuizing geschoven en vastgezet met een paar 3mm schroefjes.
3. Het apparaat assembleren
Na het plaatsen van de elektronica, bevestig je het OLED-scherm aan het bovenstuk en bevestig dit aan de rest van het chassis met een paar 3mm schroefjes. Je kunt de beweging testen door het deksel zachtjes open en dicht te doen.
4. De sketch uploaden
De bijgevoegde sketch voert een paar acties uit om de hartslag en zuurstofverzadiging weer te geven. Om te uploaden, installeer de benodigde bibliotheken, selecteer Arduino Nano in het Tools-menu en klik op Upload.
Wat de sketch doet: het initialiseert de OLED en MAX30102, met foutmeldingen. Vervolgens leest het 100 waarden in om de sensor te kalibreren en begint met weergeven. Daarna gaat het in een lus waar het 25 nieuwe waarden inleest en een bewegend gemiddelde berekent. Ten slotte controleert het of de waarden geldig zijn en print ze naar het scherm.
5. Gebruik
Om de pulsoximeter te gebruiken, plaats je vingertop op de sensor en sluit zachtjes het deksel. Sluit dan een voeding aan en wacht tot je data ziet verschijnen.
Code
Pulsoximeter Code
/* Hardware-aansluitingen (Breakoutboard naar Arduino):
* -5V = 5V (3.3V is toegestaan)
* -GND = GND
* -SDA = A4 (of SDA)
* -SCL = A5 (of SCL)
* -INT = Niet aangesloten
* De MAX30105 Breakout kan 5V of 3.3V I2C-logica aan.
* We raden aan om het bord met 5V te voeden maar het draait ook op 3.3V.
*/
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
MAX30105 particleSensor;
SSD1306AsciiWire oled;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
// Arduino Uno heeft niet genoeg SRAM om 50 samples van IR en rode led data in 32-bit formaat op te slaan
// Om dit op te lossen, wordt de 16-bit MSB van de gesamplede data afgekapt. Samples worden 16-bit data.
uint16_t irBuffer[50]; // infrarood LED sensor data
uint16_t redBuffer[50]; // rode LED sensor data
#else
uint32_t irBuffer[50];
uint32_t redBuffer[50];
#endif
int32_t spo2; // SPO2-waarde
int8_t validSPO2; // indicator of SPO2-berekening geldig is
int32_t heartRate; // hartslagwaarde
int8_t validHeartRate; // indicator of hartslagberekening geldig is
void setup() {
Serial.begin(115200);
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);
// Sensor initialiseren
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println(F("MAX30105 niet gevonden. Controleer bedrading/voeding."));
while (1);
}
particleSensor.setup(55, 4, 2, 200, 411, 4096); // Sensor configureren
}
void loop() {
// Lees eerste 50 samples, bepaal signaalbereik
for (byte i = 0; i < 50; i++) {
while (particleSensor.available() == false)
particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer[i], DEC);
}
// Bereken hartslag en SpO2 na eerste 50 samples (eerste 4 seconden)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
// Continu samples nemen. Hartslag en SpO2 elke seconde berekenen
while (1) {
// Eerste 25 samples dumpen en laatste 25 naar boven schuiven
for (byte i = 25; i < 50; i++) {
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}
// 25 nieuwe samples nemen voordat berekening
for (byte i = 25; i < 50; i++) {
while (particleSensor.available() == false)
particleSensor.check();
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample();
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);
Serial.print(F(", HR="));
Serial.print(heartRate, DEC);
Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);
Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);
}
// Na 25 nieuwe samples HR en SpO2 herberekenen
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}
void printToScreen() {
oled.clear();
oled.setCursor(0, 0);
if (validSPO2 && validHeartRate) {
oled.print(F("HR: "));
oled.println(heartRate, DEC);
oled.print(F("SPO2: "));
oled.println(spo2, DEC);
} else {
oled.print(F("Niet geldig"));
}
}
Aangepaste onderdelen en behuizingen
3D-printbestanden beschikbaar in de bijlagen.
Schema's
Productieproces
- FirePick Delta Project Log: Een Open-Source MicroFactory Bouwen met OpenPnP
- Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
- Een Arduino Iron Man bouwen: onderdelen, sensoren en stapsgewijze handleiding
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Bouw een Functionele, Arduino-aangedreven 3D-geprinte Robotarm – Stap-voor-Stap Handleiding
- Draagbare pulsoximeter voor noodgebruik tijdens COVID-19
- DIY Arduino Luchtbevochtiger Controller met Relais – Veilige Hoogspanningsopstelling
- NeoPixel Matrix Pong op Arduino Nano: Bouw je eigen neon Pong-spel
- Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
- Health Band: slimme weerebare assistant voor senioren
- Waarom Open Source Innovatie Aan De Edge Drijft – Essentiële eBook