CO₂ without a meter — the pH + KH method
A two-number CO₂ check that works for any planted tank. The chemistry behind the table, the cases where it lies, and the dropchecker question.
Most planted-tank keepers eventually want a number for CO₂. The dissolved gas drives plant growth, but it's also the thing most likely to silently kill fish if injection drifts too high. A CO₂ meter for aquarium use costs more than most people want to spend, and dropcheckers — the little glass bulbs with the colour-change indicator — lag by a full day and only tell you "low / target / high" in coarse colours.
There is a third option, and it has been hiding in carbonate chemistry the whole time. Two numbers you already measure for every other reason — pH and KH — pin the dissolved CO₂ exactly, because all three sit on the same equilibrium.
This guide explains the formula, the conditions under which it works, and the conditions under which it lies. If you'd like the answer first, the free CO₂ calculator runs the math live.
The equilibrium, in one line
Dissolved CO₂ in water becomes carbonic acid, which dissociates into bicarbonate (HCO₃⁻) and a hydrogen ion (H⁺):
CO₂ + H₂O ⇌ H₂CO₃ ⇌ HCO₃⁻ + H⁺
That last step is the one that matters here. The hydrogen ion is what your pH meter reads. The bicarbonate is what your KH test reads. So if you measure pH and KH, you have two of the three quantities in the equilibrium — and the third (CO₂) is forced.
The hobby formula people actually use is:
CO₂ (mg/L) = 12.839 · KH (°dKH) · 10^(6.35 − pH)
The 6.35 is the first dissociation constant of carbonic acid (pKa₁), reasonably accurate at room temperature. The 12.839 folds together the molar mass of CO₂, the conversion from °dKH to milliequivalents of bicarbonate per litre, and the small temperature corrections aquarium literature has settled on.
What "target" looks like
For most planted tanks, the dissolved-CO₂ range that produces visibly good growth without distressing fish is 15–30 mg/L. Below 10 mg/L, plants slow noticeably. Above about 35 mg/L, you'll start to see fish gasping at the surface — they're not running out of oxygen so much as their gills can't unload CO₂ fast enough into water that already has plenty of it.
A few sample points to anchor intuition:
| pH | KH | CO₂ (mg/L) |
|---|---|---|
| 7.0 | 3 | 8.6 |
| 6.8 | 4 | 18.2 |
| 6.8 | 5 | 22.7 |
| 6.6 | 4 | 28.8 |
| 6.4 | 5 | 57.2 |
That last row is what happens when a pressurised injection rig runs unchecked overnight. It's not the kind of number you want to see when you walk into the room in the morning.
When the method lies
The pH + KH back-calculation assumes the only acid pulling pH down in your tank is carbonic acid. That assumption fails — and the result reads higher than the actual CO₂ — whenever something else is contributing H⁺ ions. The usual suspects:
- Peat, leaf litter, blackwater extracts. Tannins and humic acids drop pH without involving CO₂ at all. Your calculator says "60 mg/L" and the fish are perfectly fine.
- Heavy bioload. Organic acid build-up from a tank with too much fish/feed for the filter capacity behaves the same way.
- Some buffering substrates (ADA Amazonia and similar). These actively bind KH and release organic acids; the numbers stop meaning what you think they mean.
For a clean planted tank — RO/tap mix, no peat, light to moderate bioload, inert substrate — the calculation tracks the real CO₂ closely enough that you can dose against it. For a blackwater Apisto tank or an Amazonia-laden Iwagumi, treat the number as suggestive at best.
Pair the readings in time
The other gotcha is timing. CO₂ injection rigs put a sawtooth into pH — pH climbs overnight as injection sits at the lower rate (or off), drops sharply when the morning solenoid opens, drifts down through the photoperiod as plants pull CO₂, then climbs again at lights-off. Measuring pH at one point in the cycle and KH at another is fine for KH (it barely moves over a day) but useless for pH.
The rule: measure pH and KH within the same hour, ideally the same minute, after the injection rig has been at its daytime rate for at least two hours. That gives you a number that means something. A pH-meter that logs continuously is worth its weight here; with a manual test, pick the same time of day every measurement.
Why a dropchecker is still useful
This isn't a "dropchecker is obsolete" argument. The dropchecker uses a known KH solution sealed off from the tank water, and the indicator measures the equilibrium CO₂ in the air gap above that solution — which equilibrates with the dissolved CO₂ in your tank water. It's measuring CO₂ directly, just with a 24-hour lag. The colour change is binary in practice ("yellow = too much, blue = too little, green = fine"), but it's true binary.
A pH + KH calculation is fast, precise, and lying-prone. A dropchecker is slow, coarse, and honest. The right setup is both: dropchecker as the always-on canary, pH + KH for diagnosis when something looks off.
What reefnotes does with this
When you log paired pH + KH tests against an aquarium, reefnotes does the same calculation and shows the derived CO₂ on the trends chart — including a sparkline, a band tied to the planted-tank target range, and the same caveats about pairing tolerance (Manfred drops pairs more than ~3 days apart rather than fabricating a number). The forecast also walks injection cadence forward, so you see where CO₂ is heading, not just where it sits today.
The same equilibrium, the same caveats — applied automatically to every measurement you log, instead of in a tab you open every few weeks.
