• You are viewing the forum as a Guest, please login (you can use your Facebook, Twitter, Google or Microsoft account to login) or register using this link: Log in or Sign Up

An alternative approach to CO2?

Dear @Yugang and @PeerUnk, I really appreciate your experimental spirit. It's amazing to see how aquarists can work together to improve their hobby. Even if it doesn't turn out as planned in the end (but I hope it does), I want to thank you and Yugang very much for your ideas and experiments. May we all keep it up. I will also try to contribute my two cents, even if it's in a slightly different area (like plant nutrition). ❤️👍🏅🌱
 
Build progress:
- calibrated the sensors. Somehow oxygen readings were a good 20.8% outdoors (@ 5 *C) but jumped up ~0,5% using indoors (@ 19 *C), which needs investigation. CO2 readings are correct though, as it perfectly matches outdoors CO2 of ~400 ppm and my CO2 device measurements of inhouse atmosphere.
1767299998414.png
- selected a 'tank' and developed a lid for the prototype.
IMG_6401.jpegIMG_6402.jpeg

Do you have any suggestions what to do next?
 
Last edited:
I will try and contribute as much as I can, but my time will be limited as I have a couple of external demands this year.
I do not have much time either, but I have some devices ready that can be used to answer a few questions, so it will not be a huge effort to collect some data. These are the devices:
  • A supposed-to-be airtight container with a CO2 sensor. I originally created this to measure the CO2 consumption/photosynthesis rate of individual plants, and to measure the CO2 production (and optionally O2 consumption) of soil or filter media. I never had the time or motivation to run those experiments; I used it mainly to determine the CO2 level in water samples. This container can also be used to quantify CO2 diffusion between air and water at desired CO2 partial pressures; it can be a mini model of an aquarium. I can also stir the water with a magnetic stirrer to emulate water movement.
    The container lid has a rubber-like seal that is pressed against the container wall when closed. I heated the four pins of the SCD41 CO2 sensor and pressed them through the top, then sealed it with silicone:
    IMG_20260101_112609929_HDR_AE.jpgIMG_20260101_112623731_HDR_AE.jpg
    The CO2 sensor of the container can be mounted on my aquarium with two different mounts, both cut from the top of the same type of containers: a shorter one that spans into the headspace air, and a longer one reaching the water. The shorter mount can be used to measure CO2 in the headspace, and the longer can be used to simulate a tightly sealed aquarium. A small headspace can be isolated to measure CO2 diffusion between the aquarium water and headspace. The shorter is already placed in the aquarium lid in this image, but it can be replaced with the longer adapter (also in the image):
    IMG_20251231_075351233_HDR_AE.jpg

  • A DFRobot Gravity 24/7 Industrial Analog pH Meter to monitor pH in the aquarium. It can be used to determine CO2 loss from the aquarium (in dark) and oxygen consumption of the plants (during lighting).

    IMG_20260101_112512819_HDR.jpg
    I am waiting for the ordered plastic nut to be able to mount it on the aquarium lid. Once I have that, I can start monitoring the pH.
  • A CO2 sensor to monitor CO2 concentration in the room air. This will be necessary to determine the driving force for CO2 diffusion between the container and room air, or between the aquarium headspace and room air. It contains an MH-Z19B sensor, which works at lower CO2 ranges, but it will be good enough for room CO2.

    IMG_20260101_112753728_HDR.jpg
Although I will not set up the CO2 delivery system that @Yugang suggested, I think we can gather all the data about diffusion rates that can be used to calculate/simulate the suggested system.
 
The question is what to do about oxygen. I had hoped that because CO2 is more dense than air you could layer CO2 on the water surface in the headspace of the has-a-lid tank AND have an airstone provide oxygenation where the air bubbles rise through the CO2 layer and 'leave the tank'. I expect however the air bubbles won't stay contained in the gas phase headspace and instead will just dilute the CO2. Probably that's ok if you have a small but steady (ideally controlled) CO2 supply. Best would be to supply a mix of CO2 + air which you can buy, but it's expensive for what you get. One thought is during the day when plants are producing O2, have the headspace filled with an appropriate concentration of CO2. At night, turn off the CO2 and turn on an airstone to rapidly sparge the CO2 from the water column and re-oxygenate the water.

Or... get a cylinder of dirt-cheap compressed air and inject that into the headspace with the standard regulator/needle value setup so it's not just pouring in (like an airstone would do). Then you get a nice blend of CO2-enriched air in the headspace. Possibly over-engineered though.
 
Last edited:
I had hoped that because CO2 is more dense than air
It is more dense than air. However at room temperature the molecules will be mixed by thermal motion and only several hundreds of meters, kilometres, vertical elevation in the atmosphere will result in significant relative concentration differences between CO2 and other gases. The mouse on your bedroom floor will not suffocate in the CO2 that you exhale.

At night, turn off the CO2 and turn on an airstone
I believe this may be the easiest solution, if indeed oxygen is a problem. This is a big if, to be tested on various tanks, as in my heavily planted tank I never saw any problem during the night.

@PeerUnk and @hax47 Very impressed by your work
 
CO2 in the closed container, after injecting (breathing into a container) some CO2:
1767335197987.png
As you can see, the tight seal is not completely tight. I have tried a few different containers over time, but all of them leaked. The obvious place where the CO2 might leak is the point where the pins run through the top, but I don't think I could seal it better. In a previous container, I also used some silicon grease on the cap thread, which has helped a lot to limit the leakage. However, I do not want to use silicone here, as it makes it messy.
Anyway, I think we can conclude that making the aquarium top completely air-tight would not be easy.
The next step would be to measure CO2 simultaneously in the container and in the room air, so we could calculate ΔCO2 for each time point to determine the leakage rate constant of the container. Once we have that, we can add some water and measure the combined (leakage + diffusion into the water) decay, and calculate the diffusion rate constant into the water from that. We can then add some stir to it, to get a feeling about the realistic range of the diffusion rate constant into the water. Does that sound right?
 
Anyway, I think we can conclude that making the aquarium top completely air-tight would not be easy.
This is probably also not necessary. Leakage 15000 ppm to 10000 ppm in 40 hours would be a concern if we'd measure that in our spaceship, but for a planted tank I'd not be concerned.

we can add some water and measure the combined (leakage + diffusion into the water) decay, and calculate the diffusion rate constant into the water from that. We can then add some stir to it, to get a feeling about the realistic range of the diffusion rate constant into the water. Does that sound right?
As a science experiment to measure the diffusion coefficient this seems a good method. However, considering the limited time that you have I am not sure if this is the best rabbit hole to dive into. Diffusion constants are already known from literature, as well as in the paper that I will attach. Once your invest your time and we would have the diffusion constant established, we will still have the uncertainty what is our assumption on the boundary layer thickness, related to surface agitation and turbulence, and it is not clear to me if this will be the shortest and most efficient route bring us closer to our dream for the planted tank.
To add my two pence, I'd see to approaches that I believe are efficient and give relevant information.

-1- Fill a laboratory beaker with degassed water (4 dKH) and some Bromothymol blue (a pH indicator used in drop checkers). Preferrably the beaker has a surface/volume ratio similar to an aquarium, and can be used as a scaled-down laboratory model of our tank. A stirrer in the beaker would be good, so that we have some turbulence to avoid a stagnant boundary layer. Place the beaker in a sealed cabinet (perhaps a tank placed upside down on a table), and have your measurement device inside. Now blow some CO2 in the cabinet, until your meter indicates roughly 1% CO2 concentration. Observe how long it will take for the Bromothymol blue in the beaker to turn lime green, indicating that the CO2 has diffused into our model "aquarium" (beaker with indicator fluid) and reached its target ppm. If we know the time it takes in our beaker, we know roughly how long it will take in a real-sized planted tank. No need to know diffusion constants, or measure them, and no need for calculations.

-2- Mount your CO2 meter on your planted tank, and monitor pH in your tank water. Blow in roughly 1% CO2 in the headspace, and monitor the pH drop. Interesting to do this first in the dark, and next time light on to see the plant consumption kicking in.

I hope this helps.
 

Attachments

Last edited:
If I may use another analogy (I hope it helps) - One could compare the conventional method of injecting CO2 while relying on surface agitation for the stabilisation with heating a home in the winter time, with the windows wide open.

Wasting 95-100% of CO2 to stabilise the tank is not very efficient, nor is it easy to have CO2 homogeneous everywhere in the tank.

Let's "close the windows", have a decent "thermostat" and have the owner set a comfortable temperature without unnecessary waste or instability. That is the essence of this system that I see as compared to our current approach of stabilising CO2 in the tank.
Really interesting stuff , ty for sharing your knowledge & ideas.
 
As a science experiment to measure the diffusion coefficient this seems a good method. However, considering the limited time that you have I am not sure if this is the best rabbit hole to dive into. Diffusion constants are already known from literature, as well as in the paper that I will attach. Once your invest your time and we would have the diffusion constant established, we will still have the uncertainty what is our assumption on the boundary layer thickness, related to surface agitation and turbulence, and it is not clear to me if this will be the shortest and most efficient route bring us closer to our dream for the planted tank.
Thank you, @Yugang, for the paper you attached; it uses a very similar approach that I also intend to use, and it employs the correct scientific terms, which adds clarity. I think that we are actually much closer in thinking than it may appear at first glance.

I fully agree that what matters in aquariums is not simply a molecular diffusion in a static system, but gas–liquid mass transfer governed by surface renewal, turbulence, and agitation. That is exactly why I am not trying to determine a molecular diffusion coefficient or assume the physical boundary layer thickness.

The parameter I am aiming to identify is the mass-transfer coefficient (kLa), as they refer to in the paper, which, by definition, already incorporates:
  • diffusivity,
  • effective boundary layer thickness,
  • interfacial area,
  • turbulence and surface renewal
In other words, the uncertainty in boundary layer thickness is not an unresolved problem—it is precisely what kLa is meant to absorb. This is the same abstraction used in chemical engineering or medical applications (with which I am more familiar) whenever the microscopic hydrodynamics are inaccessible or irrelevant, which is the case here as well.

I referred to this parameter before as diffusion capacity or conductance. In this paper, they determine the very same parameter (as mass transfer coefficient) for their reactor, which is specific to the system. I would like to determine this parameter in a system that is more similar to an aquarium setup, and then in a real aquarium. With the help of the parameter, we can also determine the CO2 absorption by the plants in a real setup to get the answer to the question whether CO2 mass transport on the air/water surface is on par with the plant usage at the given CO2 concentrations.
I completely agree that kLa is not universal and depends on agitation and setup. That is not a drawback from my perspective; it is the reason to measure it under aquarium-relevant conditions rather than trying to infer it theoretically.

On the specific suggestions:
1. I think that using the indicator dyes is less precise than what I plan to use; I plan to infer dissolved CO2 from changes in headspace CO2 concentration. This could be done more precisely, calculating with the speciation under an aquarium-relevant alkalinity condition (CO2<-->bicarbonate<--> carbonate) or less precisely, using RO water and ignoring the minor effect of the speciation under these conditions. Alkalinity mainly affects the dynamics, not the final equilibrium, so it may not be critical for the questions we are trying to answer. Another issue with bromothymol blue is that it only works under specific conditions: the KH needs to be adjusted to the target CO₂ level (for example, at ~1% CO₂, the KH would need to be around 2 dKH to give the “right” colors). Also, the color would depend on the concentration, lighting, and perception, all of which add uncertainty. Also, matching the surface/volume ratio alone does not guarantee that the effective kL is comparable between a stirred beaker and a real tank.
Instead, I would use a range of water movements in the "model aquarium" (e.g., still water vs strong stirring) to have a feel for the CO2 transfer rate range, and then see where the parameter lies in a real aquarium. This would give us a more realistic approximation of the actual situation.

2. This experiment is more difficult for me to conduct, since I do not have the equipment to keep CO2 constant in the headspace, which I think is required for a meaningful pH drop in the aquarium. @PeerUnk might be better equipped to perform this experiment. What I can do, however, is measure how quickly the CO2 disappears from the headspace to determine what level of sealing is realistic for an aquarium. I can also measure pH changes in the dark and during lighting, as you suggested, but with CO2 levels already at around 30 ppm, to estimate what CO₂ transfer rates are required and how those compare to realistic transfer rates.

This setup and level of theory may sound like overkill for a hobby context, but I believe it is the correct approach and one that is achievable with the home-made equipment we have.
 
Hi all,

What I can do, however, is measure how quickly the CO2 disappears from the headspace to determine what level of sealing is realistic for an aquarium.
I'm doing the same thing. Blowing breath in it and testing how fast the CO2 is disappearing in the waterless test tank. I already printed a new lid which lowers the air gaps. The metric would be the time for CO2 to decrease from 1% to 0,5%. I started with the first prototype from 15 minutes, next adjustment 30 minutes and currently near 60 minutes. Still working on a gasket/seal which will make a notable difference I assume.

This experiment is more difficult for me to conduct, since I do not have the equipment to keep CO2 constant in the headspace, which I think is required for a meaningful pH drop in the aquarium. @PeerUnk might be better equipped to perform this experiment.
Currently I'm not a CO2 user, but I still have my professional dual stage CO2 regulator lying around. It was so damn expensive, I will never get rid of it... The biggest challenge for me would be to work out a solution for a (latching) solenoid valve for the ESP32. If anyone has some good ideas for it, I'm happy to hear them.

Cheers!
 
The biggest challenge for me would be to work out a solution for a (latching) solenoid valve for the ESP32. If anyone has some good ideas for it, I'm happy to hear them.
I guess you would need a power source and a motor driver, like DRV8871? If it is a DC solenoid, of course.
 
The biggest challenge for me would be to work out a solution for a (latching) solenoid valve for the ESP32. If anyone has some good ideas for it, I'm happy to hear them.

Does it have to be latching? It's only a couple of watts to run a normal solenoid, that would take quite a few years of operation to generate a meaningful saving. Monostable 12v solenoids are common in CO2 systems, you could switch it with a mosfet straight off the ucontroller and run solenoid & ucontroller off the same 12v supply
 
Does it have to be latching? It's only a couple of watts to run a normal solenoid, that would take quite a few years of operation to generate a meaningful saving. Monostable 12v solenoids are common in CO2 systems, you could switch it with a mosfet straight off the ucontroller and run solenoid & ucontroller off the same 12v supply
No it doesn't need to be latching. Indeed it would be better to stick to the industry/hobby standard control systems.

ChatGPT recommmends getting:
  • logic-level N-channel MOSFET
  • flyback diode (protects MOSFET & ESP32 from inductive voltage spikes.)
  • Decoupling capacitor. Place near solenoid: 100 µF electrolytic and 100 nF ceramic
  • Status LED (optional)
  • manual shutoff valve
  • gate resistor (100–220 Ω) to limit inrush current
  • gate pull-down (47–100 kΩ) to ensure OFF at boot, but using boot safe GPIO pins would be smarter to me.

I can manage very basic electronics, but currently this is unfamiliar territory. Any help would be nice!
I guess you would need a power source and a motor driver, like DRV8871?
A power source I own. Will a motor driver like suggested do the job, maybe the stuff recommended above is incorporated?

On the software side I will implementing a watchdog / timeout as a failsafe for auto-closing the solenoid after max open time.

Cheers!
 
I can manage very basic electronics, but currently this is unfamiliar territory. Any help would be nice!
Same here.
Will a motor driver like suggested do the job, maybe the stuff recommended above is incorporated?
I am not sure, but it could be. I bought a solenoid valve for liquid (to control soda dosing into the aquarium) and this motor control to switch the 12V that operates the solenoid, but I have not put them together yet. This is what ChatGPT recommended, though It seemed logical as the ESP32 does not have the 12V output. I am not sure whether it includes everything or not, but this is what AI told me a few months ago after I showed the photo of the controller:
1767712398464.png
ChatGPT said:
Yep—this photo tells us a lot:
I can see:
  1. 47 µF / 50 V electrolytic cap (“47 50V VT”) – that’s the bulk VM capacitor.
  2. Small ceramic cap right next to the DRV8871 (likely 0.1 µF) – the high‑freq bypass.
  3. A tiny SMD resistor from the ILIM pin to GND (can’t read the code in this low‑res pic, but it’s one of the 0603 parts by the chip). That means the current limit is already set (most clones use ~30 kΩ → ≈2 A trip).
Pins/Silk on your board (top to bottom):
  • Top left: MOTOR 1 / 2 → connect the two solenoid leads here.
  • Top right: POWER + / – → your 12 V supply.
  • Bottom row: IN2, VM, IN1, GND(looks like “VM” is misprinted “UM”).
    • Tie Heltec GND → board GND.
    • Drive with GPIO → IN1 (or IN2). Hold the other input low for simple on/off.
    • You do not feed 12 V into VM from the Heltec—this is just the chip’s supply coming from POWER+.
Conclusion:
This breakout already has the caps and RILIM, so you don’t need to add a flyback diode or external limit resistor. Just wire it up and go.
I don’t know if this is actually correct, but as a non-expert, it looks fine to me. I haven’t tried it yet.
 
1st Experiment - container leak quantification (will be updated with repeated measurements)

The goal of this experiment is to determine how leaky my container is, in which I plan to conduct some of the measurements. The leakiness is important to determine, since when I am determining the CO₂ diffusion from air to water, I need to compensate for the CO₂ loss from the system.

The leakiness is determined with two parameters:

- conductance, K_leak:
Starting from Fick's first law, we lump together all the unknown details in our system (container) into a single coefficient:
  • diffusion coefficient D
  • effective diffusion path length
  • effective diffusion area, seal geometry, etc.

So we get this equation:

J=K_leak(C_container−C_room),

where the J is the flux

– system-specific decay constant, k_leak:
This describes the rate of decrease of the CO₂ in the container given the concentration difference (or partial pressure difference). This coefficient is dependent on the gas volume in the container, since the rate of decay is less, when the volume is bigger (the relative loss per time unit is smaller). Dividing the flux by the gas volume converts it into the concentration decay term dC_container/dt (I can only measure the concentration, not the flux).

dC_container/dt = -K_leak/Vg*ΔC,

where ΔC = C_container - C_room and Vg is the gas volume.

Assuming C_room is approximately constant (I take the average in the calculations for simplicity), this can be written as:

dΔC/dt = -K_leak/Vg*ΔC,

Combining K_leak/Vg into a single k_leak, we get:

dC_container/dt = -k_leak*ΔC,

This is a first-order system. Therefore, the concentration difference at a given time point is:

ΔC(t) = ΔC(0)*exp(-k_leak * t),

where ΔC(t) is the actual concentration difference at time t, and ΔC(0) is the concentration difference at the start.

Taking the natural logarithm of both sides:

ln(ΔC(t)) = ln(ΔC(0)) - (k_leak * t),

which is a linear equation. Thus, -k_leak is the slope of the straight ln(ΔC) line when ln(ΔC) is plotted against time, making it easy to calculate k_leak from the data. Knowing the volume of the container (1.115 l) also allows the calculation of the K_leak conductance.

This is exactly what @Andy Pierce suggested a few years ago for a similar system.
This is the container with the CO2 sensor.
1767805736358.png
I injected CO2 into the container and measured CO2, both in the container and in the room (showing the data from the point where the maximum CO2 is reached):
1767805791357.png

The ln(ΔC) in time, and the line after a linear fit:

1767805819488.png

We can see from the plot that at the start, the slope is steeper. I think this might be because when I close the container, either the pressure inside the container increases above that of the room, thereby creating an additional force for CO2 transport, or the gas is not yet completely mixed within the container. After a consolidation period, the ln(CO2) level change gets linear as expected from the diffusion-dominated first-order model.

Results:
  1. 1st leak measurement: The fitted value of the k_leak (decay slope, calculated per hour) is 0.018, the corresponding K_leak (leakiness or conductance) is 0.0205.
  2. (Edited) 2nd leak measurement: this time, there was a little bit of water in the container to have humidity set above 90% to see if that changes the K_leak. The conductance this time was 0.01998, so not really different

Explanation:

The parameter K_leak describes the conductance through the container seal. Later, this value can be determined for a real aquarium and compared to the conductance through the water surface under various conditions. This will allow estimating how much CO2 is lost to the room air per unit CO2 that diffuses into the water.

Note: I will edit this post to include the repeated measurements of this experiment to assess the variability of this constant.
I also attach the original measurements in case someone wants to play with or check the calculations.
 

Attachments

Last edited:
No it doesn't need to be latching. Indeed it would be better to stick to the industry/hobby standard control systems.

ChatGPT recommmends getting:
  • logic-level N-channel MOSFET
  • flyback diode (protects MOSFET & ESP32 from inductive voltage spikes.)
  • Decoupling capacitor. Place near solenoid: 100 µF electrolytic and 100 nF ceramic
  • Status LED (optional)
  • manual shutoff valve
  • gate resistor (100–220 Ω) to limit inrush current
  • gate pull-down (47–100 kΩ) to ensure OFF at boot, but using boot safe GPIO pins would be smarter to me.

I can manage very basic electronics, but currently this is unfamiliar territory. Any help would be nice!

I would do this, as a mechanical engineer who knows enough soldering to be dangerous:
solenoid.png

IRFZ34N is the most basic MOSFET I have on hand, but there are countless alternatives that would do. Important bits of the datasheet:
  • Drain-to-Source Breakdown Voltage: needs to be above 12V to switch in a 12V system. This one does 55V, I'm not sure if they make MOSFETs that can't switch 12v
  • Drain-to-Source On-Resistance: 40 mOhm, so for a 3W 12V solenoid (250 mA) the MOSFET will dissipate 2.5 mW. IRFZ34N is in the TO-220 package, so is overbuilt for this load by a factor of 1000 without needing any additional heatsink
  • Gate Threshold Voltage: >2V, so should be switched by 3.3V logic level. The max in the datasheet is 4V, so I admit I am playing a bit loose - there's a chance the specific MOSFET you get won't be switched by 3.3V, but it probably will (and definitely will be switched if the ucontroller has 5V logic level)

I think chatGPT is right about the flyback diode (the 1N4001 in the diagram), but the capacitors and gate resistor are not needed for a simple implementation like this. The gate resistor wouldn't hurt to add though if you wanted to though. This device also doesn't need a manual shutoff valve; the user can either turn off the regulator connected to the CO2 bottle or just unplug the whole thing if you need to stop the CO2 addition in an emergency.

You could switch an LED light in the same manner without the flyback diode, but if it needed more than a couple amps I'd recommend either adding a heatsink or a lower resistance MOSFET like IRLB8314. Come to think of it IRLB8314 also has a lower gate threshold, so should reliably trigger at 3.3V - it would be a better choice.

I am not sure, but it could be. I bought a solenoid valve for liquid (to control soda dosing into the aquarium) and this motor control to switch the 12V that operates the solenoid, but I have not put them together yet. This is what ChatGPT recommended, though It seemed logical as the ESP32 does not have the 12V output. I am not sure whether it includes everything or not, but this is what AI told me a few months ago after I showed the photo of the controller:

A DC motor controller lets you PWM the output to fine-tune the speed of a motor. It'll also work as a switch, but is overkill for a solenoid that just has to be on or off. It would be useful if you had a proportional solenoid valve, PWMing that would let you adjust how open the valve was.

Motor controllers will also you you reverse the polarity across the motor, so you can reverse its direction. I think a solenoid supplied with the reverse voltage will be unharmed but won't do anything - the coil will have the same resistance either way so the power draw will be the same, but it'll be working with the spring instead of against it. If it does try and turn the solenoid on backwards, just swap IN1 and IN2
 
A DC motor controller lets you PWM the output to fine-tune the speed of a motor. It'll also work as a switch, but is overkill for a solenoid that just has to be on or off. It would be useful if you had a proportional solenoid valve, PWMing that would let you adjust how open the valve was.
Thanks for the clarification! Now that you explained it above, the whole thing looks quite simple, and indeed the motor controller might seem as an overkill. For a non-expert like me, it is often easier to opt for an off-the-shelf solution than to understand the details. I admit, though, that it seems from your sketch that wiring the from-scratch solution is not more complicated than using a controller.
 
2nd Experiment – air–water CO2 diffusion (will be updated with repeated experiments)

The goal of this type of experiment is to determine the diffusion of CO2 from air to water in the container. This is similar to the suggested CO2 delivery system, except that here the CO2 level in the headspace is not kept constant. However, once we have the relevant coefficients, we can simulate what would happen at a constant CO2 level.

The container contains 615 ml of water and has a headspace of 500 ml, and has substantial stirring/water circulation. The CO2 concentration in the headspace is measured continuously. Part of the CO2 leaks into the room air, and part of it diffuses into the water. I use RO water so that I can neglect the speciation of CO2 into bicarbonate and carbonate. Since we already have the K_leak value from the previous experiments, we know how much CO2 is lost to the room air. The remaining CO2 disappearing from the headspace must therefore be transferred into the water. Based on this, we can calculate the air–water CO2 transfer rate and determine the K_La coefficient, which describes the CO2 conductance into the water.

Experiment 2.1. This level of water circulation represents a more intensive water movement than what we typically have in an aquarium, so it can be considered an upper extreme when interpreting the diffusion rate.
output.gif
Experiment 2.2 The stirring is slower compared to the above:

output2.gif

Theory

I model the coupled air–water exchange and leakage to room air with two coupled processes:

dp_w/dt = k_La * (p_g - p_w) # rate of CO2 partial pressure change in the water
dp_g/dt = -Vw/Vg * k_La * (p_g - p_w) - k_leak * (p_g - p_room_avg) # rate of CO2 partial pressure change in the headspace


where:

  • V_w, V_g are the water and gas volumes
  • p_g and p_w are the CO2 partial pressures in the gas (headspace) and water phase
  • k_La is the liquid-side mass-transfer coefficient to be fitted (units: s⁻¹)
  • k_leak is taken from the leak-only experiment (rescaled for the actual gas volume)
  • p_room is the mean room CO2 partial pressure during the run

I calculate with partial pressures instead of ppm, since ppm is defined differently in gas and water, and the two are not directly comparable.

There is no simple analytical solution to this set of coupled equations (unlike the first-order model used for the leak determination), so I simulated the process numerically and fitted the k_La value in Python to minimize the difference between the model and the measured headspace data. I also fitted the initial water CO2 partial pressure, since it was not directly known.

The next plot shows the measured CO2 partial pressures in both the headspace and the room air. Compared to the leak-only experiment, there is a much faster initial decline in the headspace CO2, indicating significant CO2 transfer into the water. After some time, the rate of decline slows down, most likely because the water approaches equilibrium with the headspace. The slow decline during approximately the last three quarters of the measurement is probably dominated by leakage into the room air after near-equilibrium between air and water has been reached.
1767873056714.png

After fitting the k_La coefficient and the initial water CO2 partial pressure, we can simulate second-by-second how the headspace and water partial pressures evolve (starting from the maximum CO2 level in the headspace).
Experiment 2.1:
1767873161633.png
There is essentially a perfect fit between the measured and simulated headspace data, suggesting that the model captures the dominant processes correctly.

Results:
  1. Experiment 2.1 The resulting K_La value with intensive stirring (the conductance through the water surface) is approximately 0.65. This value is directly comparable to the previously determined K_leak, and it is about 32 times larger.
  2. Experiment 2.2 In the repeated measurement with slower stirring, the K_La was 0.321

Explanation:
In this setup, CO2 diffuses into the water faster (in the first experiment, about 32 times) than it leaks into the room air when the partial pressure differences are the same between the headspace and the water and between the headspace and the room air. The actual CO2 transfer in an aquarium will also be dependent on the partial pressure differences (headspace-water and headspace-room air), so we will need some more experiments and calculations to assess the actual CO2 delivery effectiveness in an aquarium. This system would be close to an ideal situation for the proposed CO2 delivery approach. However, the water circulation in this setup is somewhat exaggerated, and the container seal is relatively good, so it remains to be seen how these values compare to those in a real aquarium.
It would be interesting to see the CO2 transfer data in @PeerUnk's experiments too, using the lids with different sealing properties.

Note: I will update the post with the new repeats to keep all the data in a single post.
 
Last edited:
2nd Experiment – air–water CO2 diffusion (will be updated with repeated experiments)

The goal of this type of experiment is to determine the diffusion of CO2 from air to water in the container...

After fitting the k_La coefficient and the initial water CO2 partial pressure, we can simulate second-by-second how the headspace and water partial pressures evolve (starting from the maximum CO2 level in the headspace).
Experiment 2.1:
View attachment 235161
There is essentially a perfect fit between the measured and simulated headspace data, suggesting that the model captures the dominant processes correctly.

Results:
  1. Experiment 2.1 The resulting K_La value with intensive stirring (the conductance through the water surface) is approximately 0.65. This value is directly comparable to the previously determined K_leak, and it is about 32 times larger.
  2. Experiment 2.2 In the repeated measurement with slower stirring, the K_La was 0.321
You've done a great job! Thumbs up! 👍 And with perfect results, too. ✅ You have my utmost admiration. 🎖️🏆
 
Back
Top