This keyboard had been dropping its Bluetooth link for weeks, with four cells in its battery bay reporting 85% charge the whole time. I took all four out, dropped two fresh cells into the four-slot bay, and left the other two slots empty. The dropouts stopped — and the reported charge went up, to 100%.

Both halves of that are worth explaining. Half the cells should not be enough to run the device at all, and fewer cells should not read higher than more. Neither is a firmware bug. The voltage constraint of a parallel connection, together with cell internal resistance, fixes both outcomes — and bounds what that percentage can express in the first place. What follows is the mechanism, the equations, and the measurements that pin it down.

DeviceMicrosoft Designer Compact Keyboard (21Y-00001)
CellsCR2032 · 3.0 V · 4 slots in parallel
Data sourceBlueZ GATT Battery Service
Measured2026-08-21

01 · What was observed

To pin down what the reading actually tracks, the old cells were measured back in, one configuration at a time — the same set of cells throughout, changing only how many were present. Each configuration was confirmed to be a fresh sample by an independent disconnect/reconnect cycle, then sampled continuously for more than 30 seconds to confirm it had settled.

ConfigurationCells presentReadingNotes
Old cell A (alone)145%8 samples, no jitter
Old cell B (alone)145%8 samples, no jitter
Old cell C (alone)145%8 samples, no jitter
Old cell D (alone)140%one quantisation step lower
A + B265%
Old cells ×3385%after contacts were reseated
Old cells ×4485%matches the historical mode
New cells ×22100%18 samples, no jitter
Bluetooth keyboard with three CR2032 coin cells removed from the bay resting above it, two positive-side up and one negative-side up
The device under test and the old cells removed from it. The cells are CR2032 — 20 mm diameter, 3.2 mm thick lithium-manganese-dioxide coin cells, nominally 3.0 V. The three shown were taken from the bay; installed alone, they read 45%, 45% and 40%.

Two results run against intuition: four old cells (85%) read lower than two new cells (100%), and three old cells read exactly the same as four. Cell count neither determines the reading monotonically nor is irrelevant to it. Explaining that shape takes three things — the parallel voltage constraint, cell internal resistance, and the mapping from voltage to percentage.

02 · Parallel locks every cell to one voltage

The four slots are oriented the same way and share a single metal strip, which makes this a parallel connection. The manufacturer documentation agrees: Microsoft’s support page for this keyboard states that it “uses four coin-cell (C2032) batteries” and instructs the user to “make sure the positive end is facing up” — one orientation for all four slots, with no alternation (Microsoft Support). The regulatory filing settles it mechanically: internal photographs submitted for FCC ID C3K1954 show four identical contact assemblies in pure translation — the same side-spring-and-flat-pad arrangement, the same orientation, carried on one continuous strip (FCC filing). Series wiring requires alternating polarity between adjacent slots, which would force a mirrored contact layout. There is none. The defining constraint of a parallel connection is that every branch sits at the same terminal voltage:

Parallel constraint
V1 = V2 = … = Vn = Vpack
The constraint is imposed by the wiring topology and holds regardless of cell age, capacity, or internal resistance. Any voltage difference immediately drives current between branches until that difference is erased.
Close-up of the keyboard's underside battery bay: four slots in a row, the shell marked CR2032 with a positive-side-up symbol, cells in slots one and four, slots two and three empty showing the metal contacts at the bottom
The bay: four slots in a row, all facing the same direction, sharing one metal strip. The moulded marking reads ⊕ CR2032 × — the means positive side up, printed once for the whole row, so all four slots share an orientation. A series pack requires alternating polarity between adjacent slots, so this alone identifies the connection as parallel. Shown here is the final configuration of this write-up: new cells in slots 1 and 4, slots 2 and 3 empty, with the negative contacts visible at the bottom of the empty slots. The keyboard works in this state, which is a second piece of evidence independent of the marking.
SERIESemptyopen circuitkeyboarddeadPARALLELemptykeyboardstill on
Removing one cell has opposite consequences in the two topologies. In series the cells are joined end to end, so any missing cell opens the loop and the device loses power entirely. In parallel each cell is an independent branch between two shared rails; remove one and the rest stay closed. This gives a test that takes seconds and is fully reversible: pull a cell — if the device dies it is series, if it keeps running it is parallel.

Measured result for this deviceWith two cells installed and two slots empty, the keyboard’s Connected property remained true and battery reporting worked normally. A series pack missing a cell is necessarily an open circuit, so this observation alone settles the topology as parallel.

03 · A real cell is an ideal source plus internal resistance

The constraint above explains why the keyboard still runs with cells missing, but not why the reading changes. That requires dropping the “battery as ideal voltage source” simplification and introducing internal resistance — the equivalent series resistance (ESR).

A real cell is equivalent to an ideal voltage source Voc (open-circuit voltage) in series with a resistance Rint. When current flows, part of the voltage is dropped across that resistance, so the terminal voltage measurable from outside is lower than Voc:

Terminal voltage of one cell
Vterm = VocI · Rint
Voc
open-circuit voltage, set by the chemistry and the remaining state of charge
Rint
equivalent series resistance, which rises sharply as the cell depletes
I
load current

The decisive property is that Rint rises sharply with depletion — nowhere near a linear decay. Texas Instruments measured this directly on CR2032 cells under pulsed Bluetooth Low Energy loads: internal resistance climbs from roughly 5 Ω on a fresh cell to about 50 Ω by the time ~130 mAh has been drawn, and their design guidance budgets for 1 kΩ at end of life — two orders of magnitude (TI SWRA349). Their conclusion is blunt: “Since the IR increases rapidly as capacity is used, the circuit must be able to manage a very high IR to achieve good effective battery capacity.” This is why an old cell whose open-circuit voltage still looks acceptable collapses the moment it is loaded.

3 cells in parallelV₍ₒc₎R₍int₎Thévenin equivalentV₍ₒc₎ unchangedR₍int₎ / 3keyboardV₍term₎
n identical cells in parallel are externally equivalent to a single source with unchanged open-circuit voltage and internal resistance reduced to 1/n. Voltage sources in parallel do not add their voltages — that follows directly from the parallel constraint. What does change with cell count is resistance, because n copies of Rint in parallel are equivalent to Rint/n.

04 · Terminal voltage rises with n toward an asymptote

Combining the two steps, the terminal voltage of n cells in parallel under load current I is:

Terminal voltage of n cells in parallel
Reff = Rint / n
Vterm(n) = VocI · Rint / n
As n grows the drop term I·Rint/n decreases monotonically, so Vterm rises monotonically. As n → ∞ the drop goes to zero and Vterm → Voc. Voc is the asymptote of this curve.

In the voltage domain this gives a monotonic rise with shrinking increments, approaching Voc. What the reported percentage does with that shape depends on f, and the two do not match: the readings saturate earlier than the voltage model predicts. §08 takes that up.

05 · The percentage is a function of voltage, and it cannot see n

The keyboard firmware has a single voltage sampling path. It maps the sampled terminal voltage through a fitted curve to a percentage, then reports a uint8 over the Bluetooth Low Energy (BLE) Battery Service (service 0x180F, characteristic 0x2A19). The specification defines that value as 0 to 100 with 1% resolution (Bluetooth BAS v1.1); every value this keyboard reports is a multiple of 5. The coarser quantisation is the firmware’s own, not a constraint of the transport.

Reported percentage
P(n) = f( VocI · Rint / n )
where f is monotonically increasing
The domain of f holds exactly one variable: voltage. The firmware has no channel through which it could learn how many cells sit on that rail, or how much charge each has left. This is not an implementation defect; it is an intrinsic limit of the measurement principle.

Three consequences follow directly, all consistent with the measurements:

  1. Cell count is invisible. Two new cells and four new cells read the same, because a parallel connection does not change voltage. Cell count changes only capacity (amp-hours add linearly) and equivalent internal resistance. The firmware makes this stronger than it has to be: across four days of logged reports, 95% never appears and 100% appears only with fresh cells — above some threshold the output is clamped, so everything in that region reads identically no matter how many cells produce it.
  2. Capacity is not measured. This is a voltage proxy, not a coulomb counter (a dedicated circuit that integrates current to track remaining charge). Coin-cell devices do not carry one.
  3. The reading is optimistic. The lithium-manganese-dioxide discharge curve is flat through its middle section: most of the usable energy leaves while the voltage barely moves. By the time the percentage starts falling, the remaining energy is far below the displayed value.
measured 1/n model prediction asymptote f(Voc) = 85%
100%80%60%40%n = 1n = 2n = 3n = 4cells present in parallel (n)f(V₍ₒc₎) = 85%1/n model, n=3: 71.7%1/n model, n=4: 75%71.7%75%measured, n=1: 45%measured, n=2: 65%measured, n=3: 85%measured, n=4: 85%45%65%85%85%used for fit
The model is fitted on n=1 and n=2; n=3 and n=4 are pure extrapolation, used as check points. Fitting P(n) = A − B/n to those two points gives B = 40 percentage points and A = 85%. The measured readings saturate at 85% — n=3 and n=4 both land there, as does the mode of several months of logs from before the cells were changed (85%, 62 samples). That saturation value is an observation, not a model output; the fitted A merely agrees with it. The rate is where the model fails: it puts n=3 at 71.7% and n=4 at 75%, while both measure 85%.

06 · Masking: single-cell state is not measurable in parallel

The parallel constraint has a further consequence, more significant than the offset in the reading: a spent cell whose internal resistance is high enough that it can barely source current is held at the same rail voltage by the good cells beside it. In the reading it is indistinguishable from a good cell.

3 good cells · V₍A₎ higherdepleted · V₍B₎ lowerR₍B₎ very highI₍rev₎ reverse chargeVreads V₍rail₎
The firmware measures the voltage of the shared rail, and that rail voltage is set by all branches together. "All four are fine" and "three are fine, one is dead" produce the same reading. Determining the state of a single cell requires removing it from the parallel connection and measuring it alone — which is exactly the method used for the measurements here: with one cell installed, it is the only thing on the rail and the masking disappears.

The masked cell also keeps drawing current from the good ones. Its magnitude is set by the voltage difference and the sum of the internal resistances:

Reverse charging current between branches
Irev = ( VA − VB ) / ( RA + RB )
As long as VA ≠ VB the current exists, until the voltages are equalised. This is why new and old cells must not be mixed: energy from the new cell goes into the old cell rather than to the load, and a lithium-manganese coin cell such as the CR2032 carries a leakage risk when reverse-charged. Leaked electrolyte corrodes the bay contacts. The magnitude is not marginal — Energizer's CR2032 datasheet rates the cell for a maximum reverse charge of 1 microampere (datasheet). A 0.3 V difference across a combined 100 Ω of internal resistance gives 3 mA, exceeding that limit by three orders of magnitude.

The right procedure for a parallel bayDo not replace cells one at a time. A weak cell is masked by the good ones, so there is no usable causal signal between swapping any particular cell and the fault disappearing — and throughout the mixed period the new cell is charging the old one. The correct procedure is to remove every depleted cell at once. In a parallel bay a missing cell costs capacity only and does not affect operating voltage, so an empty slot is preferable to an old cell left in it.

07 · How internal resistance causes Bluetooth dropouts

Everything above is steady state. What actually drops the link is the transient: peak current Ipeak during an RF transmit burst is far above the standby current, and the instantaneous drop across the internal resistance scales with it. If the terminal voltage falls below the chip’s brownout reset threshold Vbo, the keyboard loses power and restarts, taking the Bluetooth link down with it.

Dropout criterion
VocIpeak · Rint / n < Vbo  ⟹  reset
All three variables push the system across this line: Rint rises with depletion, n falls as cells are removed, and Ipeak is set by transmit power. Note that a healthy steady-state reading does not guarantee freedom from dropouts — the criterion contains Ipeak, not the standby current.
n = 4 (effective resistance Rint/4) n = 1 (effective resistance Rint) brownout reset threshold Vbo
RF transmittimeV₍ₒc₎V₍bo₎ brownout reset thresholdshallow droop · stays above V₍bo₎crosses V₍bo₎ · keyboard resetsslow recovery after load
Same open-circuit voltage, same peak current — only the effective internal resistance differs. Fewer cells in parallel means higher Reff, so the same transmit burst produces a proportionally deeper droop. This also accounts for another observation: once the load is removed the terminal voltage recovers slowly, over tens of seconds to minutes, which is characteristic of high-internal-resistance cells. Measurements therefore have to record the time since the last load, or the same configuration will give different readings.

The logged reports show both the droop and the recovery directly. Readings collapse and return within a single two-minute sampling interval:

17 Aug  14:30   35%  →  14:32   75%
17 Aug  19:16   50%  →  19:18   85%
18 Aug  10:23   60%  →  10:25   85%
20 Aug  17:48   55%  →  17:50   70%

The swing also widens over time. On 17–18 August the readings sit between 85% and 90%; by 20 August the same cells under the same use swing between 55% and 85%. Those cells did not lose thirty points of charge in three days — Rint rose, so identical transmit bursts produced deeper droops. Nothing was inserted or removed during this window (the swapping described in §08 began only on 21 August), so the widening cannot be attributed to contact disturbance. It is visible without any additional instrumentation.

08 · Where the model stops

The model accounts for most of the observations, but two points have to be stated plainly, or this write-up would read as more certain than the evidence supports.

The 1/n rate form does not hold

The saturation value of 85% is solid, and it rests on observation rather than on the model. It is where n=3 and n=4 settle in the controlled test; it is the most frequent value across four days of ordinary use (48 of the 150 reports below); and it is the mode of the longer log kept before the cells were replaced (85%, 62 samples). The first two come from the same capture and are not independent of one another, but the third is a separate record — and none of the three needs a model.

The rate is a different matter. 1/n puts n=3 at 71.7% and n=4 at 75%, while both measure 85% — the readings reach the saturation value faster than 1/n and then stop. The fitted A = 85% does coincide with the observed saturation, but that agreement cannot be read backwards as support for the model, because the fit’s other term is what fails.

The mapping f is why. This write-up treats it as linear, and it is not. Four days of HCI capture recorded 150 battery reports from this keyboard; their distribution shows what the firmware actually does:

reading   25  30  35  40  45  50  55  60  65  70  75  80  85  90  95  100
count      1   1   1   2   3   2   1  17  11  21  11  16  48   9   0    6

All 150 values are multiples of 5, and every step from 25% to 90% is occupied — a fine-grained mapping quantised to 5% at the output, not a handful of coarse levels. Above the top step it clamps, which is why 95% never appears while 100% does. A straight line fitted in percentage space cannot be extrapolated across a range shaped like that, and extrapolating it is precisely what the n=3 and n=4 predictions did.

This locates the failure in f, not in the circuit. Reff = Rint/n follows from the parallel resistance formula and is not in doubt — but it is not tested here either, because these measurements recorded only percentages. Separating the two layers requires measuring Vterm directly, which was not done. Nor is there an account of why a straight line through 45% and 65% should extrapolate to the right intercept while getting the shape wrong; that coincidence is recorded, not explained.

Contact reliability is an uncontrolled variable

One contact failure was observed directly during the session: removing a cell disturbed the shared metal strip and triggered 8 disconnect/reconnect cycles within 50 seconds, with the reading collapsing to 40% — roughly the single-cell level — until the mechanical state settled. This means any insertion or removal can leave a cell not actually connected, and the magnitude of that effect (20 to 45 percentage points) exceeds the effect being measured.

Because of this, an earlier record of “3 cells = 65%” contradicts the later “3 cells = 85%”. The earlier figure is more plausibly a case of one cell not making contact, effectively n=2. But that is a post-hoc hypothesis — observing the expected value first, then invoking a bad contact to explain the deviation. That form of reasoning can explain away any inconvenient data point and has to be labelled as such. Its only independent support is that contact failure is a directly observed failure mode on this device, not a mechanism invented to rescue the data. Even so, it falls short of confirmation.

Reliable conclusions are limited to these three

One. The parallel masking effect is real and large: for the same set of cells, one alone reads 45% while several together read 85% — a 40-point gap. This conclusion is unaffected by the contact problem, because with a single cell present it either conducts or it does not; there is no partially-connected middle state.

Two. This set of cells has high internal resistance. Readings with several cells in parallel are markedly higher than with one, which can only come from a reduced voltage drop. Historical logs reading 85% idle and 70% under load corroborate this independently.

Three. This set of cells is genuinely depleted. Lightly loaded and with enough cells in parallel that the drop no longer moves the reading, they settle at 85%, while two new cells read 100%. Those 15 points are a real difference in state of charge, and neither figure depends on the model.

09 · What carries over

  • Do not service a parallel bay one cell at a time. Weak cells are masked, so no diagnostic signal is available, and during the mixed period the new cell reverse-charges the old one, with a leakage risk. Remove all the old cells together.
  • A parallel bay may be run under-filled. Missing cells cost capacity and internal-resistance headroom, not operating voltage. Two new cells beat two new plus two old.
  • Do not read this percentage as a fuel gauge. It is a voltage proxy: blind to cell count, blind to capacity, and heavily optimistic across the flat section of the discharge curve.
  • Record time since last load when measuring. High-internal-resistance cells recover slowly once unloaded, so the same configuration gives different readings at different moments.

References

  1. Microsoft Support — Use Microsoft Designer Compact Keyboard. Confirms four coin cells and a single orientation for all four slots (“make sure the positive end is facing up”), which is what identifies the bay as parallel. support.microsoft.com
  2. Texas Instruments, White Paper SWRA349 — Coin cells and peak current draw (Mathias Jensen). Measured internal resistance of CR2032 cells against used capacity under pulsed BLE loads; gives the IR limits at which 15 mA and 30 mA peak draws stop being sustainable. Underpins §03 and §07. ti.com
  3. Energizer CR2032 Product Datasheet. Nominal 3.0 V, typical capacity 235 mAh to a 2.0 V cutoff, and the 1 µA maximum reverse-charge rating cited in §06. data.energizer.com
  4. FCC filing, ID C3K1954 (Microsoft model 1954; test report RFBBXY-WTW-P20060146, Bureau Veritas). Internal photographs show the four battery contact assemblies and the main board; the RF section reports a peak output of 0.74 mW (−1.32 dBm) at 2402 MHz. fccid.io
  5. Bluetooth SIG, Battery Service (BAS) v1.1. Defines Battery Level (0x2A19) as a uint8 from 0 to 100 at 1% resolution, establishing that the 5% steps observed here originate in the keyboard firmware. bluetooth.com
Device under testMicrosoft Designer Compact Keyboard (21Y-00001) — BLE HID, 4-slot parallel coin-cell bay
Data channelBlueZ org.bluez.Battery1.Percentage, sourced from the GATT Battery Service, quantised to 5%
SamplingEach configuration confirmed as a fresh sample by disconnect/reconnect, then sampled for over 30 s to confirm it had settled
Longitudinal data150 Battery Level reports (ATT handle 0x000d) extracted from four days of continuous HCI capture, 17–21 August 2026
Date2026-08-21