Verify battery readings

Build the cat with bat and read its BatteryReport values: the BAT? keycode types the last one per hand on any Coordinator, the T-Dongle shows it on its screen, and a tower-console receiver logs every one (Vial settings). See build and flash for commands. The divider sits on GPIO14, which no mouse variant uses.

The default BATTERY_VFS_MV = 0 selects per-chip eFuse calibration in battery/task.rs. Its comments explain the ADC2/Wi-Fi initialization order. The on-board 470 kΩ / 470 kΩ divider is noisy; this is indicator-grade state of charge, not a precision voltmeter.

  1. Disconnect the charger, boot, and wait at least 15 seconds.
  2. Measure at the battery connector with a DMM and compare with the next reported millivolts. Reports arrive every 30 seconds (protocol::battery::BATTERY_REPORT_PERIOD_MS); BAT? shows the age of the one it types.
  3. Take at least five paired readings for each cat. The bench acceptance target is mean absolute error ≤50 mV and maximum ≤75 mV.
  4. Compare state of charge and LED 2 with the functions in cat-rules/battery.rs. White means invalid reading.

For a blank-eFuse chip or historical reproduction only: set BATTERY_VFS_MV = 3100, measure a cell at least 40% charged without the charger, then compute Vfs = 3100 × meter_mV / firmware_mV. Set the result, rebuild and remeasure. Do not share a hand-calibrated constant between devices.

If error grows with voltage, averaging cannot fix the divider's settling error; the recorded hardware follow-up is a 100 nF filter capacitor at GPIO14. If voltage is accurate but charge/color is wrong, investigate the LUT/animator separately.