Accurate VO2 Max for Zwift and Strava

37,887

140

97

Introduction: Accurate VO2 Max for Zwift and Strava

Human bodies are engines that utilize oxygen to burn fuel. Humans are not built with gauges and checking to see how the human engine is running is usually based on things we find easy to measure--pulse, Blood pressure. These do not directly tell us how the engine is burning its fuel. Measuring the amount of oxygen used with exertion provides better information on how hard the bodies engine is working--the equivalent of looking at the gauges on your cars dashboard. My previous work on measuring the components of exercise physiology were encumbering and not elegant enough to make them easily portable: https://www.instructables.com/Real-VO2Max-Measure... So after being introduced to the joys of Zwift bicycling with a Wahoo trainer I built a device that enables you to accurately add VO2 Max to the bluetooth information displayed on the Zwift screen animation while you are peddling along. The device also easily pairs with the Strava app for providing VO2 Max data for all your trail excursions. It substitutes VO2 max information for the heart rate sensor data in both of these popular exercise programs. The device is portable and lightweight with Wifi and Bluetooth capabilities and is easily worn with a modified 3M mask designed to be comfortable for long term use. I have tested the device for other sports including cross-country skiing and skating but its portability and wireless transmission capacity make it amenable to just about any sport other than swimming. The device also communicates with an App for the iPhone which enables graphing and long term data storage and download for ancillary calculations. The output includes continuous output of VO2, calories consumed, volumes of expired gas, as well as performing such functions as Basal Metabolic Rate. The device is easily made for about $100. Parts are all readily available and the case is 3D printed. It can be assembled in about 10 minutes. We tested the device in a physiology lab against a $60,000 machine and found it gave the about the same results.

Step 1: Gather Your Parts

There are only four main parts to the unit. A differential pressure sensor, an oxygen sensor--both connected by I2C to a TTGO Esp32 microcontroller with screen. A Lipo Battery with switch completes the unit. The original unit included a Laser CO2 sensor and an analogue version of the differential pressure sensor. The digital version of the sensor was found to be much more accurate and with a better range of 1--250 Pa.

1. TTGO T-Display ESP32 CP2104 WiFi bluetooth Module 1.14 Inch LCD Development Board $11

2. Omron--D6F-PH0025AD2--$40 from Digikey

3. Gravity: I2C Oxygen Sensor--$50 from DF Robot

4. Lipo Battery -- $5 1000 Mah

5. Switch ON/OFF ---$1

6. PARTICULATE RESPIRATR MASK -- 3M $20 Digikey (you don't really care about the filtration on this mask they are removed)

Step 2: 3D Print Your Parts

All parts are printed in PLA. All files are included. No support was used except for the computer housing. The body of the unit consists of three parts--the most important being the venturi tube with ports for both the differential pressure sensor and the oxygen sensor. The measurements of the internal structure of the throat are carefully laid out and measured and cannot be changed or it will drastically effect the results of the output. The venturi tube is nested into the body enclosure. The third part is the access door/ computer housing which is held on by two 3mm screws. A small retaining shield is also included to seal off the computer and make assembly easier.

Step 3: Wire It

The actual wiring for this project is minimal. It consists of connecting two I2C devices to the computer and supplying them with power and ground. They each have different I2C addresses and the pull-up resistors are included in the DF Robot O2 sensor. The O2 sensor is carefully marked for which wires go where, however, pay carefully attention to the wiring diagram included above for the Omron sensor before wiring. (Other Omron sensors of the same type have different wiring patterns!) Both of the sensors take 3 Volts which is obtained off of the TTGO board. This ESP32 board has I2C inputs on pins 21( SDA) and 22(SCL). Multiple options on the board are available for G and Power (3V). The battery supply for voltage is delivered to the small battery connector on the back of the board interrupted by a simple on/off switch. To enable charging you must have the button in the on position and provide power through the USB-C connector. I used a 1000Mah battery which easily powers the unit for several hours. The computer body is carefully designed to fit the battery snugly and you might want to measure it before ordering--there is some variation in size.

Step 4: Build It

The only unique part of the assembly is mounting of the Omron sensor. Two passages located in the venturi tube connect the sensor with the 3D printed ports within the venturi tube. These were built to accommodate two pieces of standard aquarium tubing with an inside diameter of 4mm. This tubing is designed to have a very snug fit into these holes. The tubes sink to a predetermined depth and are then trimmed to accommodate the two fluted ends of the sensor. Please see detailed pictures to clarify the description. There is also a polarity to these input tubes to the sensor--the sensor must be mounted per the photo to have a low and high pressure sensor input to be correct. A bead of hot glue on the tubes will hold them in position. The Oxygen sensor tube friction fits into its holder in the venturi tube--you might want to put a bead of hot glue on the unit to keep it in position. A defect of this sensor allows the chemical unit to separate very easily from the digital measuring unit. This is done on purpose as the O2 sensor head--like all O2 sensors must be replaced about every two years. Threaded inserts for 3 mm screws are heat inserted into the 3D printed holes in the body of the unit. The battery is placed into position in the wall of the main body. The On/Off switch is superglued into the hole in the bottom of the main body. When the two sensors are mounted into correct position in the venturi tube it is hot glued into the main body as shown. The TTGO board with attached wiring is hot glued into position in the side wall. Make sure the buttons are visible through their respective holes and the USB-C connector is open in the hole. The cover is placed over the wiring and sealed with hot glue. The wires are carefully organized and the case closed with two 3mm screws. The button housings are superglued over their respective holes after inserting the flanged buttons. The 3M mask is modified by removing the filters from the side holes which are input. The output valve at the center of the mask has a small plastic cover over it. This is clipped off and removed. The adapter unit that you printed is then glued to the front of the mask.

Step 5: Program It

There are two programs that run the unit. Both are Arduino IDE based. FinalZwiftConnect with files DFRobot_OxygenSensor.cpp and DFRobot_OxygenSensor.h are used when the unit is broadcasting VO2 max to either Zwift or Strava. This is based on Andress Spiess work in YouTube #174. After loading, the initial screen will request the users wt in pounds. Another screen with Zwift will appear and the button with "go" will initiate the session. The loop function checks the Omron sensor for a pressure drop and initiates a time function to calculate the total volume of air moving past the sensor using Bernoulli's equation. Every five seconds if there is no breath the seeO function is called to check the O2 level. At thirty second intervals the goFigure function calculates the minute volume of expired O2 and calculated levels of CO2 and VO2 Max. The program sends the bluetooth characteristic to the Zwift receiver on either your Mac or Apple TV masqueraded as the Heart Rate which approximates a typical VO2 max level. The ESP32 screen then presents alternatively Time, VO2, VO2Max, Cal burned, Max Cal/Day, O2 level and Volume(Liters of O2 used).

The alternative program is FinalSensirionScreen with above DFRobot_OxygenSensor.cpp and DFRobot_OxygenSensor.h as well as Sensirion_GadgetBle_Lib.cpp and Sensirion_GadgetBle_Lib.h. This is a wonderful App(https://apps.apple.com/us/app/sensirion-myambience/id1529131572) that allows you to connect the sensor to your iPhone and collect data, graph it and distribute the data by text or email. The App is designed for collecting data from a CO2 sensor so you have to spoof it by sending the Volume Minute of O2 to the CO2 level screen, the VO2 max to the Temp screen and the O2 level to the Humidity screen. These three pieces of data can then be saved and then downloaded to a spreadsheet program of your choice. The function of the two programs other than their output is identical including the screen output on the ESP32. The App sends out the data in a .edf format which is problematic from a Mac standpoint. Relabel the file as a ".csv" file and this allows you to import it in a regular fashion. Turn on the app only after the unit has been running otherwise it will tend to collect enormous amounts of empty data sets that have to be culled. The two graph screen shots above are from the Sensirion App. The first is treadmill output(VO2 max) the second is X-country skiing(Cal/Day).

Step 6: Testing It

Several compromises were made in the design of the unit: no CO2 sensor and it's totally compact and weights only 4 oz. Physiology labs that are normally used for testing VO2 max cost upwards of $60,000 and are certainly not portable. They have sensors that measure the same things only on a much finer level. But since what you're trying to study may not really require this degree of granularity perhaps our machine will be adequate. CO2 sensor data helps refine the difference between volume inhaled and exhaled which are not exactly the same. Volumes of these two gasses relative to unchanging amount of Nitrogen in room air makes this possible, but is this a really significant difference? Humans are a fairly subjective test animal and within the limits of testing humans do these things matter? We brought our unit to the University of Alaska physiology lab and compared it. All machines are benchmarked for checking a standardized volume with a 3 liter syringe. The labs unit passed with all measurements being +/- 50 cc. Our unit did very well with all measurements within +/- 100cc. An error this small over liters of air/min is not that significant. Standardized gas (O2 16%) was then passed through our O2 sensor and found to be off by only 0.16%. We then ran our test subject through two levels of testing on the treadmill. The results from both O2 volume and VO2 readings were nearly identical. While there was significant minute to minute variability in the VO2 output from the lab machine the averages per minute turned out to be about the same with each instrument. A more thorough test would involve more test subjects and extended periods of testing of each instrument.

Step 7: Using It

The adapter unit on the mask is threaded and allows the corresponding portion of the unit to be screwed into it. It is designed so that the computer unit and the oxygen sensor are off to the right when looking at the mask front on. This prevents fluid from dripping down into the O2 sensor head. Programing is done through the USB-C connector. Charging the battery is accomplished by turning on the unit and then plugging it in. When using the unit with either Strava or Zwift you have to pair the unit with the software that you are using. Make sure bluetooth is enabled on the phone that you have Strava on then go to the record function at the bottom of the screen. Once you push it a Heart icon will appear at the bottom--just push it to bring up the bluetooth pairing screen and find the unit. It will then pair. For the Zwift unit the pairing is just as simple. When the screen that pairs the bike trainer cadence and power meters appears the hear rate monitor will also appear. This will pair the unit with the screen output. On subsequent pairings it should automatically synch. The data from your bike ride can then be graphed and played with in the same manner as your power output and cadence. The graphs above are the VO2 max output graphed on the Zwift App. When using the unit with the Sensirion App for x-country skiing, biking and skating just turn on the device add your weight and push the go button. Then turn on the Sensirion App and it will automatically pair with the unit and start recording data. This is a way of studying many aspects of the human physiology engine that is now portable and cheaply done. How hard is any participant in a sport working? Soft data like pulse rate may offer some clues but the actual amount of energy being consumed will reveal much more about the function of the inner machine. Most VO2 max equations currently available on watches and trainers are based on these soft findings--now they can be based on real data. Since this type of testing has not been widely available due to limitations in size and expense this unit will open up the potential for studying how people improve with conditioning or reveal if they're truly working near their maximum output. The unit is also useful for studying basal metabolic rate. This is the amount of energy that is used by the body in doing nothing. The cost of just being alive. It is hard to study because it should be done with the participant sleeping or resting. Modern studies using doubly labeled water have revealed incredible incites to energy usage among hunter gatherers and office workers. These units could also be used to provide more insight to exertion than the counting of steps. I have found that with the calculations for energy expended from the Oxygen utilization algorithm is slightly higher than that calculated by the work/watt output of the Zwift App algorithm. So good news: more pizza slices from your ride!

Step 8: Additional Upgrades

A wonderful innovator from Bielefeld, Germany has worked with his son to develop the hardware and the software to improve the design of the VO2 max instrument. I have included the photos of his new output and modifications as well as his much superior software. His name is Ulli Rissel and while I encouraged him to write up a whole new Instructable he wanted me to just add it to this one. Here is a description of his changes:

Great project!Here is my version with numerous modifications:

1.I added a barometric sensor (BMP180) to calculate the air density. The calculation of VO2 should also be correct in the mountains thanks to the barometric sensor. The BMP180 sensor is connected to the I2C bus like the other sensors. I glued it between the two sensors on the Venturi tube. In Arduino, the library "Adafruit_BMP085" must be added.2.The VO2max and VEmin calculation is carried out with moving averages and measurement of each individual breath. This allows current measured values every 5 seconds. 3.The displays of the values can be switched during the measurement.4.If the sensor reaches its limit (at approx. 4.5L/s corresponding to a VEmin of 136L/min!) this is displayed. However, the error should only be minimal. If the limit is displayed too often, the Venturi nozzle would have to be modified. 5.A warning appears if the O2 sensor measures less than 20% VO2% at startup. Then the sensor (or room) needs to be ventilated before moving on. If "Continue" is pressed anyway, the value is set to 20.9%.6.Battery indicator: The voltage is displayed with background color to the state of charge. White: USB or charge, Green: Battery full, Yellow: Battery approx. 50%, Red: Battery approx. 20%. The display takes place at the top left. A 1100mAh Lipo lasts about 10h!7.Kcal are now calculated correctly with their own integral timer.8.DEMO mode when the top button is pressed when powered on. It simulates about 28L of respiratory minute volume with respiratory rate of 12 at 4% CO2. This allows you to test the data transfer.9.Reset by pressing both buttons. This works after the 3L check.10.The volume measurement was measured with a 3L calibration pump and a calibration factor was programmed. The volume measurement can be checked in the first 10 seconds with a real-time display. I tested 2 sensors and for practical reasons set the average calibration factor 0.92 for volume measurement. You are welcome to customize this in the program itself (is easy to find).11.The data is sent every 5 seconds as csv via USB cable and Bluetooth serial. Data transmission with cable and BT starts immediately after "Press to start". With Excel Datastream, a display can be made in real time.BT on Excel works really well, even with instant graphical representation. You can also send the data to the APP Bluetooth Serial Monitor on an Android mobile phone and process or send it from there.

As you can see his additions are truly great. But wait they get even better:

I've made some further changes:
Optionally, there is a Venturi nozzle with 20mm for trained athletes. The 16 mm version generates errors due to a too low maximum flow. The current software is set for 16mm and can also be used for 20mm. The necessary adjustment can be found in the commentary at the top of the program. Vo2 is sent via BLE as a heart rate, for example for Zwift, Strava, Wahoo or Garmin. With prolonged operation and high performance, O2 sensor failures occur caused by condensation. The sensor then displays too low O2 concentrations and VO2 is calculated too high. It gets a little better when the sensor is covered with a piece of an FFP2 mask. For this purpose, the diameter for the O2 sensor has been extended to 21mm. You can cut out a 5cm circle from an FFP2 mask, place it on the opening and push the sensor in. It holds without glue. Some thoughts on the calculation: The common spirometers measure the inspiration volume Vi in the supply line, not Ve. However, the concentration of O2 and CO2 is measured expiratory. Therefore, Ve must be calculated in order to correctly record the O2 consumption. Three factors come into play: 1) The volume shrinks minimally if less CO2 is produced than O2 is absorbed (i.e. at quotient <1). This can be corrected via the Haldane formula. However, the deviations are minimal. 2) Much more important is that BTPS conditions prevail in the expiration air (35°C, 95% humidity, actual ambient pressure). 3) The measurement has to be converted to STPD conditions (0 °C, 1013.25 hPa, 0% humidity). VO2 is defined under STPD conditions. (This was the missing part!) According to my research, the conversion is nothing more than the ratio of the density of BTPS (actually measured pressure, 35°C, 95% humidity) to STPD. The density of STPD is constant = 1.2922 kg/m³. The density of BTPS can be easily calculated, whereby instead of the gas constant 287.058, the constant for moist air is used for BTPS (about 292.8). The constant fluctuates in our temperature range depending on pressure only by a few percent, the density only in the per mille range, if 292.8 is not adjusted. The density indicates how many molecules are in the air. And now it becomes relatively simple: We measure Ve directly, so no further conversion is required. This results in: VO2 = Ve * O2diff% * Density BTPS / 1.2922. Done! By the way, according to the spirometry instructions, VO2 is only calculated from the O2 difference. CO2 is only used to calculate the quotient and for the Haldane formula, which we do not need.

Anything Goes Contest 2021

Runner Up in the
Anything Goes Contest 2021

4 People Made This Project!

Recommendations

  • Make It Bridge

    Make It Bridge
  • Big and Small Contest

    Big and Small Contest
  • Game Design: Student Design Challenge

    Game Design: Student Design Challenge

97 Comments

0
janm2000
janm2000

Question 4 months ago

Hi, first of all thanks to rabbitcreek & urissel for the instructions and continuous improvements! Handy tool, nothing I would've thought of on my own tbh 😅
I've encountered some little obstacles when setting up the board, mostly due to lack of programming skills, but with the remarks from samuri28 everything worked!
I've measured the 20mm-version in my CAD and redesigned the thing carefully around the venturi tube. My aim was to "neaten up" the thing a bit, whether or not I've achieved that is probably up to debate (see pictures). But at least all components are screwed in place and interchangeable, no glue needed.
Two questions I have:
1) Regarding the channels leading to the pressure sensor; were the protruding edges in the bends intentionally or a limitation of the CAD system used? I've rounded these off by using sweep along a 3d curve (see pic).
2) I'm now using the SpiroVO2max-code from urissel and while I can connect to a BT serial monitor on my phone, I can't get it to work via cable to the excel datastream add-in. Actually, as soon as I press "connect device" in excel the ESP32 turns its display off and no data is transmitted. Am I doing something wrong or is this problem based on my cheap-o version of the TTGO T-Display (this: amazon.de/gp/product/B07VNG9D52)?

spiro1.jpgspiro2.jpgspiro3.jpgvergleich_pressureport.png
0
urissel
urissel

Answer 4 months ago

Hi,
neat design! As far as I know the design of the channels to the pressure sensor is not critical because only a static pressure difference is transmitted. There is only an insignificant airflow thru the sensor.
The Amazon picture of your TTGO is identical to my version. I have no problems with the serial connection to Excel datastreamer via USB cable or wireless via bluetooth serial. A dark display could be a reset from the interface. Reason? Did you configure the correct baud rate in Excel (datastreamer - advanced - manifest - baudrate = 115200) ?
Did you try to connect to the Arduino serial monitor? If this is ok your connection to excel should be ok.
As an alternative try to connect to your computer via BT serial. After the connection BT generates a virtual com port. It is working in the same way like the wired connection.

0
janm2000
janm2000

Reply 3 months ago

my Arduino serial monitor via USB is working, however (even with the correct baudrate) the board turns off when connected to excel. But the BT serial connection to Excel datastreamer is working, which probably is the more practical solution anyway, so it's not really a downside.
Now the last thing to do is gathering some data to benchmark the device... which, painfully, involves me doing a/some ramp test(s) 😅
Have you ever compared the results against "official" measurements (to determine the accuracy and absolute information value) or just the "DIY"-results among each other to track training progress over time?

0
ivorhewitt
ivorhewitt

Reply 4 weeks ago

Love the modular case design, very neat. Re the BT issue, might be worth checking the versions of BT libraries you are using, possibly downgrading if necesary.

0
janm2000
janm2000

Reply 4 weeks ago

It worked out in the end - I've switched to recording the values via the Android-app "Serial Bluetooth Terminal", so that I don't have to fiddle with my laptop and sweaty fingers :)
The modularity is a nice feature, a quick disassembly after use to dry all parts is really easy. Though I've to admit, it got a bit top-heavy. You really have to tighten the mask straps to an uncomfortable level to make it as airtight as possible. But since a ramp-test is even less pleasant, I had other things to worry about 😂🥵
v2 with the electronics close(r) to the mask may be a project for another day...

0
urissel
urissel

Reply 3 months ago

Yes, we did some tests with trained athletes in a professional spirometry lab. The VO2 looks good, the final VO2max is about 10% too high. This is caused by the excessive hyperventilation at the end of the ramp test. The calculation of the expiratory volume per minute is fast whereas the O2 sensor has a slower response time to the increasing O2 concentration caused by the hyperventilation. This results in a higher VO2max calculation.
However, the VO2max reading about 30sec before finishing the ramp is reliable and close to the results of the professional spirometry.
Our "low-cost self-made gadget" is excellent for the monitoring of your training.

0
janm2000
janm2000

Reply 3 months ago

a significant deviation in only the last 30sec is indeed fantastic value for money! I'm really interested in testing it myself but... unfortunately, after dodging it for two years, our favorite C-word finally got me :( so I guess the ramp-efforts will have to wait a bit

0
urissel
urissel

Question 1 year ago

Great project! I would like to build it together with my son in law who is a semiprofessional cyclist. I connected the TTGO to Arduino IDE but every attempt to compile the Zwift version ends with compile error caused by the Omron library. I installed the Omron_D6FPH-master.zip from Github with no errors. The library manager shows "installed".
i appreciate any help and suggstions.

------- Error message: -----------

Arduino: 1.8.13 (Windows 10), Board: "TTGO LoRa32-OLED, TTGO LoRa32 V1 (No TFCard), 80MHz, 921600, None"
C:\Users\uriss\OneDrive\Dokumente\Arduino\libraries\Omron_D6FPH-master\src\Omron_D6FPH.cpp: In member function 'boolean Omron_D6FPH::init()':
C:\Users\uriss\OneDrive\Dokumente\Arduino\libraries\Omron_D6FPH-master\src\Omron_D6FPH.cpp:56:42: error: 'I2C_ERROR_OK' was not declared in this scope
return (_i2cPort->endTransmission() == I2C_ERROR_OK);
^~~~~~~~~~~~
C:\Users\uriss\OneDrive\Dokumente\Arduino\libraries\Omron_D6FPH-master\src\Omron_D6FPH.cpp:56:42: note: suggested alternative: 'ESP_ERROR_CHECK'
return (_i2cPort->endTransmission() == I2C_ERROR_OK);
^~~~~~~~~~~~
ESP_ERROR_CHECK
C:\Users\uriss\OneDrive\Dokumente\Arduino\libraries\Omron_D6FPH-master\src\Omron_D6FPH.cpp: In member function 'boolean Omron_D6FPH::isConnected()':
C:\Users\uriss\OneDrive\Dokumente\Arduino\libraries\Omron_D6FPH-master\src\Omron_D6FPH.cpp:61:43: error: 'I2C_ERROR_OK' was not declared in this scope
return _i2cPort->endTransmission() == I2C_ERROR_OK;
^~~~~~~~~~~~
..... (Edit: shorten the error messages)
^~~~~~~~~~~~
ESP_ERROR_CHECK
exit status 1
Error compiling for board TTGO LoRa32-OLED.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

0
ivorhewitt
ivorhewitt

Answer 11 months ago

Hi Ulli... I've just built one of these with your barometer addition and firmware - (brilliant software BTW), is the initial 3l calib pump step mandatory? (it seems to provide sane values if I let that timeout)

0
urissel
urissel

Reply 11 months ago

Hi, thanks for your appreciation! The calibration step is not mandatory. It provides an opportunity to test the flow sensor. The sensors are factory calibrated. I used this initial step to calculate an additional calibration factor for the "real life" measurement of the venturi valve.
This calibration pump is "home made" and was easy to build. The only critical part is the length of the push rod which defines the exakt volume.
Have fun,
Ulli

20220328_223606_resized.jpg20220328_223635_resized.jpg20220328_223509_resized.jpg
0
ivorhewitt
ivorhewitt

Reply 11 months ago

brilliant that's good to know (that a diy pump worked) I was wondering if I made one if it would be ok.
I'm getting (consistently) high readings at the moment so was worried I needed to check the calibration. (either that or I'm superman)
thanks!

0
ivorhewitt
ivorhewitt

Reply 11 months ago

Super, built a home-made pump and got good values - my sensor was calibrating at 0.97.... the only issue I have at the moment is I seem to be getting higher values using your algorithm to the original code (which was giving reasonable looking figures). I'm going to add a lot of debugging output to see if I can see anything odd, but thought I'd mention it in case you had any similar behaviour.

1
urissel
urissel

Reply 11 months ago

Wow, you are very fast! Yes the output values seem to be higher than in the original version. I haven't been able to find any gross errors so far. This is the calculation that needs to be critically checked:

co2 = initialO2 - lastO2; //calculated level of CO2 based on Oxygen level loss
if (co2 < 0) co2 = 0; // correction for sensor drift
vo2Total = volumeVEmean * rho * co2 * 10; // = vo2 in ml/min (* co2% * 10 for L in ml)
vo2Max = vo2Total / weightkg; //correction for wt

VO2Total and vo2Max in ml/min/kg
volumeVEmean: breath volume in L/min. (running mean)
rho: density of the air in kg/m³

The breathing volume per minute can be checked with the pump and a clock. It seems to fit even at high respiratory rate.
Please let me know about your test results. Any errors in the calculation?

In the meantime i build a second version with additional CO2 sensor. The results are similar and calculation of the respiratory quotient gives reasonable results.

0
ivorhewitt
ivorhewitt

Reply 11 months ago

oh wow, yes I narrowed it down to coming from the pressure/co2 adjustment so I reverted to the original formula for now.
I too am planning on getting a CO2 sensor for further experiments.
(e.g. I was thinking the SCD-41 sensor might be a good fit and would give humidity of expelled air also)
thanks again, having lots of fun with this.

1
urissel
urissel

Reply 11 months ago

Hi
Ich tested the SCD41. It is too slow and has a limited range. it was not possible to get values above 33000ppm.
The SCD30 is much faster and my first test had been successfull with sane values up to the limit of 40000ppm.
The original calculation uses a correction factor (0.852) and i did not know the reason for this. It is very close to 1/1.225 and represents the relation to the standard conditions.
I will modify my calculation. The results should be correct even in higher altitudes.

0
ivorhewitt
ivorhewitt

Reply 11 months ago

Ah great thanks for that info, I thought the form factor would be easier to build into the project - I'll take a look at the SCD30 and have a think... also discovered that the old BMP85 I had added appears faulty so that might also explain the problems I had!!! Should have a BMP280 tomorrow so fingers crossed that improves matters.

0
urissel
urissel

Reply 11 months ago

I modified my software but I'm not able to download it here. In the meantime I completed my beta-Version of the CO2 device with the SCD30. I can send you the CO2 software to your mail address.You may use it for further improvements and testing.

0
ivorhewitt
ivorhewitt

Reply 11 months ago

sure thing, that would be great, I was thinking of uploading the code to github. this afternoon I've been getting it working with GoldenCheetah by making it output the bluetooth messages for a "VO2 master pro" which goldencheetah has code for.

0
urissel
urissel

Reply 11 months ago

https://1drv.ms/u/s!AoaoNDkkQH5qh5I0oxB-9CgyqS46KA...

Link it to my public folder in OnDrive with the actual software versions. It is still work in progress. The too high VO2 was caused by the missing conversion to STPD conditions (0°C, 1013,25hPa, 0%humidity), whereas the measurements are under BTPS conditions (35°C, ambient pressure, 95% humidity). The actual calculation is much better but it needs further improvement. I am currently delving into the topic. The conversion with measurement of the actual conditions for air pressure and temperature is challenging.

Another issue is the venturi tube. The maximum sensor limit is 4,8L/sec.
However, trained athletes reach values above 10L/sec! My son-in-law was almost constantly at the sensor limit. I modified the Venturi nozzle to an inner diameter of 20mm. In the next few days I will carry out tests with it. However, the nozzle must not be too large, otherwise the measurement resolution is no longer sufficient for reliable measurements at rest.