CO2Scape
Reference table

KH and pH CO2 chart, corrected for temperature

The table everyone copies uses a fixed factor of 3. That factor is temperature dependent, so the familiar chart reads about 10 to 21 percent low across the range a planted tank actually runs at. Here is the same table with the constant derived properly, and the three tank types where no version of it applies.

The chart below is the first dissociation equilibrium of carbonic acid, nothing more. Carbonate hardness fixes how much bicarbonate is in the water, pH fixes the ratio of carbonic acid to bicarbonate, and temperature moves the constant that ties the two together.

// dissolved carbon dioxide, mg/L, which is the same as ppm
CO2  =  15.696 × KH[dKH] × 10^( pK1(T) − pH )

// first dissociation constant, T in kelvin
pK1(T)  =  3404.71/T  +  0.032786·T  −  14.8435

The factor 15.696 falls out of the units: 17.848 mg/L of calcium carbonate equivalent per degree of KH, divided by the 50.043 g/eq equivalent weight of calcium carbonate, times the 44.009 g/mol molar mass of carbon dioxide. The constant is from Harned and Davis (1943), The Ionization Constant of Carbonic Acid in Water, Journal of the American Chemical Society 65, pages 2030 to 2037.

The chart at 25 °C

Values in ppm of dissolved carbon dioxide. The green column is the usual target window for a standard planted tank, 20 to 30 ppm.

Dissolved CO2 in ppm at 25 °C, by carbonate hardness and pH
dKHpH 6.06.26.46.66.87.07.27.4
13522148.85.63.52.21.4
270442818117.04.42.8
310667422717116.74.2
414189563522148.95.6
517611170442818117.0
621113384533321138.4
82821781127145281811

Why the familiar table reads low

Written in the shorthand everyone quotes, the relation is 3 × dKH × 10^(7 − pH). That leading 3 is treated as a constant. It is not one. Derived properly it comes out at 3.78 at 20 °C, 3.52 at 25 °C and 3.33 at 30 °C, so a flat 3 understates the result by roughly 21, 15 and 10 percent across that range.

Same tank at 4 dKH and 25 °C: the shorthand against the derived constant
pHFlat factor 3Derived at 25 °CDifference
6.44856The old table is 15 percent low
6.63035You aim for 30 and run 35
6.81922The gap is proportional, not fixed
7.01214Same 15 percent, smaller numbers

Where the 3 probably comes from is an old unit slip. Read the 17.85 mg/L of calcium carbonate equivalent per degree as though it were milligrams of bicarbonate, divide by its molar mass instead of its equivalent weight, and you land on 3.01 exactly.

A chart cannot show you the error bar

Every cell above is a single number, and a single number claims a precision your test kit does not have. pH sits in the exponent, so a reading tolerance does not add a few percent, it multiplies. A drop test read to about a fifth of a pH unit turns into plus 58 and minus 37 percent on the result. Carbonate hardness enters linearly and adds its own share: half a degree of titration resolution is worth 12.5 percent at 4 dKH and 50 percent at 1 dKH.

Worked example

KH 4.0, pH 6.8, 25 °C. The chart says 22 ppm. Carry a drop test tolerance of 0.2 pH and a half degree of KH resolution through the same equation and the honest answer is 12 to 40 ppm. That interval spans plant limited at one end and livestock stress at the other, which is a different decision at each edge.

Three tanks where you should not read this chart at all

The whole table rests on one assumption: that carbonate is the only thing holding your pH where it is. Break that and the arithmetic still works perfectly, it simply describes a different tank.

  • Active plant substrates. Ion exchanging soils strip carbonate hardness and acidify the water column, so KH and pH stop being independent inputs.
  • Peat, leaves and botanicals. Humic and fulvic acids push pH down on their own, and the chart reads that depression as dissolved gas.
  • Phosphate based pH buffers. A buffer pins pH at a set point regardless of how much gas is in the water, so the answer becomes a constant with no relation to the tank.

In documented soil setups the classic table runs high by a factor of 12 to 19. That is not an error bar, it is a different tank. Above pH 7.8 there is a fourth case: carbonate begins to contribute measurably to alkalinity and the approximation the chart depends on breaks from the other direction.

Get the chart with its error band attached

The app carries the same equation, derives the constant for the temperature you actually run, and returns a range instead of a cell from a table. When one of the four cases above applies, it stops and points you at the two methods that still work.

Download CO2 Calculator: Planted Tank on the App Store Free, with one optional purchase. iPhone and iPad, iOS 17 or later. English and German.