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:
| Date | Worn | Walked | Counted | Off by |
|---|---|---|---|---|
| 2026-10-20 | At the ankle | About 100 (give or take 2 or 3) | 88 | About 12% under |
| 2026-10-22 | In a trouser pocket | 500 | 508 | 1.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.