Reading CO₂ from pH and KH, no meter required

How to estimate dissolved CO₂ in a planted tank from two numbers you already measure, the chemistry behind it, and when the result lies to you.

You don't need a meter to put a number on CO₂. The standard relation CO₂ (mg/L) = 12.839 · KH (°dKH) · 10^(6.35 − pH) turns two readings you already take into a live estimate — at KH 4 and pH 6.8 that works out to about 18 mg/L, comfortably inside the planted-tank target of 15–30 mg/L. Measure pH and KH within the same hour, then read the result off the table below or punch both numbers into the CO₂ calculator. The estimate holds as long as carbonic acid is the only thing pulling your pH down; peat, tannins and active soils all make it read high.

The dissolved gas is what feeds fast plant growth, and it's also the parameter most likely to quietly kill fish when an injection rig drifts too high. A proper CO₂ meter for aquarium use costs more than most of us care to spend. Dropcheckers, those little glass bulbs with the colour-change indicator, run about a day behind and only sort the world into "low," "good," and "too much."

There's a third route, and it has been sitting inside carbonate chemistry all along. Two numbers you measure anyway, pH and KH, fix the dissolved CO₂ exactly, because all three quantities live on the same equilibrium. No new gear. Just arithmetic.

This guide walks through the formula, the conditions where it holds, and the conditions where it quietly misleads you. If you'd rather skip to the answer, the CO₂ calculator does the math live.

The equilibrium, in one line

When CO₂ dissolves, it turns into carbonic acid, which then splits into bicarbonate and a hydrogen ion:

CO₂ + H₂O ⇌ H₂CO₃ ⇌ HCO₃⁻ + H⁺

The last step is the one that does the work. That hydrogen ion is what a pH meter reads. The bicarbonate is what a KH test reads. Measure both and you've pinned two of the three players in the equilibrium, which leaves the third, CO₂, with nowhere to hide.

The version hobbyists actually punch into a calculator is this:

CO₂ (mg/L) = 12.839 · KH (°dKH) · 10^(6.35 − pH)

The 6.35 is pKa₁, the first dissociation constant of carbonic acid, and it holds well enough at typical room temperature. The 12.839 is just bookkeeping. It folds the molar mass of CO₂ together with the conversion from °dKH into bicarbonate concentration, so that when you feed it a hardness reading in German degrees you get an answer back in mg/L. You don't need to derive it. You only need to know it isn't a fudge factor someone reverse-engineered to make the numbers look nice.

What "target" looks like

In most planted tanks, the sweet spot for dissolved CO₂ runs 15 to 30 mg/L. That's the range where growth looks good and fish stay relaxed. Drop below roughly 10 mg/L and plants visibly slow down. Push past about 35 mg/L and you'll catch fish hanging at the surface, gulping. They aren't short on oxygen, exactly. Their gills just can't dump CO₂ fast enough into water that's already saturated with it.

A handful of sample points to calibrate your gut:

pH KH CO₂ (mg/L)
7.0 3 8.6
6.8 4 18.2
6.8 5 22.8
6.6 4 28.9
6.4 5 57.2

That bottom row is what a pressurised rig does when it runs all night with no off switch. It's not a number you want greeting you with your morning coffee.

When the method lies

The whole back-calculation rests on one assumption: that carbonic acid is the only thing pulling your pH down. Break that assumption and the formula reads higher than the real CO₂, sometimes wildly so, because it credits every stray hydrogen ion to dissolved gas. Here are the usual culprits.

  • Peat, leaf litter, tannins, blackwater extracts. Humic and tannic acids lower pH without touching CO₂ at all. The calculator might shout "60 mg/L" while your fish breathe easy and your actual CO₂ sits comfortably mid-range.
  • A heavy organic bioload. Too many fish or too much food for the filter to keep up with builds organic acids that behave exactly the same way.
  • Buffering soils like ADA Amazonia. These actively bind KH and shed organic acids of their own. Both inputs to the formula get distorted, so the output stops meaning anything you can act on.

For a clean setup, an RO and tap mix, no peat, light to moderate stocking, inert substrate, the calculation tracks real CO₂ closely enough to dose against. For a blackwater Apistogramma tank, or an Amazonia-bedded Iwagumi in its first months, read the number as a rough hint and nothing more.

Pair the two readings in time

Timing is the other trap, and it's the one that catches careful people. A CO₂ rig puts a sawtooth into pH across the day. pH sits high overnight while injection idles or shuts off, drops hard when the morning solenoid fires, drifts lower through the photoperiod as plants strip CO₂ out of the water, then climbs back up at lights-off. KH barely budges over a day, so measuring it whenever is fine. pH is a different animal. Read it at the wrong point in that cycle and your CO₂ number is fiction.

So the rule is simple. Measure pH and KH within the same hour, ideally the same few minutes, and only after the rig has been running at its daytime rate for at least two hours. That window gives you a reading that actually corresponds to a steady state. A continuously logging pH probe earns its keep here. If you're testing by hand, just pick one time of day and stick to it on every measurement, so you're always sampling the same point on the curve. Logging the pair together, same hour, every time, is the habit Manfred quietly rewards: a tidy column you can trust later instead of two numbers taken half a day apart.

The dropchecker still earns its spot

None of this retires the dropchecker. The bulb holds a known KH reference solution, sealed off from your tank water, and its indicator responds to the CO₂ in the air gap above that solution. That gap equilibrates with the dissolved CO₂ in the tank, so the dropchecker is measuring CO₂ directly. It's just slow about it, running roughly a day behind. The colour read is coarse in practice, yellow for too much, blue for too little, green for fine, but within those bands it doesn't lie.

Think of the two as different instruments for different jobs. A pH plus KH calculation is quick and precise, but it'll fib the moment non-carbonic acids get into the mix. A dropchecker is sluggish and blunt, and it never lies. Run both. Let the dropchecker sit on the glass as your always-on canary, and reach for the pH plus KH math when something looks off and you want a sharper read.

One last thing worth saying out loud: none of this means you must inject. Plenty of beautiful tanks run on the CO₂ that fish respiration and surface exchange already provide, and if that's the direction you're leaning, planted without CO₂ covers how to pick species and pace your expectations for that style. But if you do inject, the pH and KH pair is the cheapest honest feedback loop you'll find, as long as you respect the two conditions: clean water chemistry, and readings taken together at the same point in the day.

Manfred

Manfred quietly remembers every test, dose, and water change you log. The trends fall out — no spreadsheet required.

Open a free reefnotes account →