Pulse oximetry is a noninvasive way of measuring oxygen saturation, and oximeters are, as a rule, relatively cheap and available. They are very useful in hospitals, working with a patient monitor or alerting medical staff if a patient has low blood oxygen and needs attention.
The COVID-19 pandemic led to medical equipment shortages, so even oximeters are unavailable or too expensive. They are commercial medical devices, so their data is unavailable or hard to use. Faced with this, we decided to create uOxy, an open source oximeter.
We designed uOxy around available components, so it could be assembled quick and easy. It will measure SpO2 from a finger using an LED and processor circuit. It uses BLE to send realtime data to smartphone or a base station - we want to use uOxy in our open source patient monitor project. We'll be assembling prototypes soon, and we decided to put up project files on Hackaday so other people can use them as well.
Algorithm development process has started :) Some part of the work is done, and we would like to share it (further progress is a bit delayed since we switched to other projects for now).
On the firmware side, everything is relatively simple - you need to turn on red, then infrared LEDs, then turn off both, and measure signal levels in these states. The only complication is that there is a switching noise, so measurements have to be done with half-millisecond delay after the switch, when the signal has already stabilized.
Processing of the measured signal is more complicated. First of all, signals have a large constant component: the variation associated with the pulse is only about 1% of the signal value, and the noise is quite significant relative to this variation - but not too high, so simple smoothing solves this problem well. Then on these signals you need to find the local minimum and maximum points, which sounds simple, but there is a catch: the signal as a whole often goes up and down due to a number of factors, and a simple minimum / maximum in the interval will not produce anything useful. But an adaptive algorithm can track the average value and speed of change in each point, and produce quite a stable output. That is shown on the video - small triangles mark the points that the algorithm has identified as local extremums.
Then the real fun begins. This method allows to measure both absolute value and signal variation in each channel, so in theory the SpO2 level is easily obtained from the ratio of these values (it will need to be calibrated and all that, but still it should be simple). And this sounds really logical: the relative absorption in the red and infrared ranges changes with change in oxygen saturation, so the ratio of these values should clearly indicate it...
Well, it really should. The problem is, it doesn’t :) We don’t really have an oxygen deprivation chamber for testing, so for now we simply are holding our breath for lowering SpO2 at some point - but the ratio behaves in a very strange way. In some cases it reacts perfectly. In some - it doesn’t react at all, or only a bit and in a wrong direction :) Moreover, this does not change from case to case, but depending on the conditions - in some conditions it works every time, in others it does not work every time, and for now it is completely unclear why.
The idea to make an oximeter came to us at the end of March. To be more precise, for a while we wanted a method for measuring pressure - and combination of data from ECG and PPG with a proper processing algorithm could do just that. At least that's what several papers claimed, and physics behind that claim looks solid - so we wanted to try it in practice. Also oximeters became a short supply during the pandemics, and that was another reason to make one.
We started by developing a PCB design. After several weeks of work, we made two versions of the oximeter - for the finger and for the ear. With ear-based version there were obvious problems with the mount, so we decided to start with the finger version and move from there.
We ordered components and PCB production, and in early May got everything we need. Usually we don't capture any of our work on assembly, but this time is a rare exception! So in the video you can see how our oximeters are baked!