packages/sensors/firmware/pedometer.ts sets the accelerometer’s own step detector going, with the register writes of Espruino’s puckjsv2-accel-steps module inlined, and the firmware counts each step it reports. The detector runs only while an activity does, which a gesture or a reader starts and stops (Gestures). Each minute of it the count becomes one record on the Steps channel, 0 included, and stopping writes the last partial minute, as Sensor Data Format lays out; outside an activity the accelerometer is off and no steps record is written. With DS.live(true) each step is sent as it is counted, so a reader can watch the count climb while the Puck is carried in different places.

How well it counts

It counts handling as steps: on 2026-10-20 it recorded 58 steps for the hour from 16:03 to 17:00 while the Puck sat on a desk and was picked up for button tests, and nobody walked.

Each walk was counted by hand against the Puck’s count, on a Puck.js v2.1, normal walking:

DateWornWalkedCountedOff by
2026-10-20At the ankleAbout 100 (give or take 2 or 3)88About 12% under
2026-10-22In a trouser pocket5005081.6% over

Two walks are not enough to say whether the ankle undercounts or that walk was miscounted. Undercounting is the safer error. Slow walking and stairs are unmeasured. Counting a long walk by hand is hard; counting only the left foot and doubling halves the work, and a phone’s pedometer in the same pocket gives a second count to compare. The detector’s sensitivity is set in the accelerometer’s registers, which packages/sensors/firmware/pedometer.ts writes as Espruino’s module did; other values may count closer.