Zum Hauptinhalt springen

Schrittzähler

Was dieses Beispiel zeigt​

Schritte zählen mit dem eingebauten Schrittzähler des BMA400, der außerdem meldet, ob Sie gehen, laufen oder stillstehen. Der Chip erkennt und zählt die Schritte selbst; bei einem Schritt setzt er INT1, und Ihr Board liest den Zählerstand aus.

Verbinden Sie zusätzlich zur I2C-Verdrahtung (im Beispiel GPIO 9 für SCL und GPIO 8 für SDA) den Pin INT1 des Breakout mit GPIO 5, oder ändern Sie INT1_PIN auf den Pin, den Sie verwenden.

Der Beispielcode​

# FILE: bma400-stepCounter.py
# AUTHOR: Soldered Electronics
# BRIEF: Uses the BMA400's built-in step counter and activity type detection
# (running/walking/still)
# WORKS WITH: BMA400 Accelerometer breakout: www.solde.red/333419
# LAST UPDATED: 2026-09-17

from machine import I2C, Pin
from bma400 import (
BMA400,
BMA400_OK,
BMA400_INT_CHANNEL_1,
BMA400_INT_PUSH_PULL_ACTIVE_1,
BMA400_STEP_COUNTER_INT_EN,
BMA400_ASSERTED_STEP_INT,
BMA400_RUN_ACT,
BMA400_WALK_ACT,
BMA400_STILL_ACT,
)

# Hardware setup: connect the breakout board's INT1 pin to INT1_PIN below
INT1_PIN = 5

mems_event = False


def int1_callback(pin):
global mems_event
mems_event = True


# Change these to match how your board wires I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8))
sensor = BMA400(i2c)

if sensor.status != BMA400_OK:
raise Exception("Failed to initialize BMA400: " + sensor.status_string())

# Configure the step counter feature. Step detection and counting is handled
# entirely by the sensor; the count is a 24-bit value that can be read at any
# time
sensor.set_step_counter_interrupt({"int_chan": BMA400_INT_CHANNEL_1})

# Configure INT1 pin to push/pull mode, active high
sensor.set_interrupt_pin_mode(BMA400_INT_CHANNEL_1, BMA400_INT_PUSH_PULL_ACTIVE_1)

# Enable the step counter interrupt condition. This must be enabled for step
# counting to work at all, even without using the interrupt pin
sensor.enable_interrupt(BMA400_STEP_COUNTER_INT_EN, True)

int1 = Pin(INT1_PIN, Pin.IN)
int1.irq(trigger=Pin.IRQ_RISING, handler=int1_callback)

print("Waiting for steps...")

activity_names = {
BMA400_RUN_ACT: "Running",
BMA400_WALK_ACT: "Walking",
BMA400_STILL_ACT: "Standing still",
}

while True:
if mems_event:
mems_event = False
status = sensor.get_interrupt_status()
if status is not None and (status & BMA400_ASSERTED_STEP_INT):
count, activity = sensor.get_step_count()
if count is not None:
print(
"Step detected! Step count: {}, activity: {}".format(
count, activity_names.get(activity, "Unknown")
)
)

🔗Das vollständige Beispiel öffnen

bma400-stepCounter.py bei Commit 484a5be

→

Dieses Beispiel verwendet außerdem machine.I2C (MicroPython-Referenz) und machine.Pin mit der Methode irq() (MicroPython-Referenz), die zur MicroPython-Firmware gehören und nicht Teil des Moduls bma400 sind.

Erwartetes Ergebnis:

ShellMicroPython
Waiting for steps...

Danach gibt jeder Schritt-Interrupt eine Zeile aus: Step detected! Step count: mit dem Gesamtzählerstand, dann , activity: gefolgt von Running, Walking, Standing still oder Unknown.

Verwendete Funktionen​

BMA400(i2c=None, address=BMA400_I2C_ADDRESS_SDO_LOW)returns BMA400

Konstruktor. Setzt den Sensor per Soft-Reset zurück, prüft seine Chip-ID (0x90) und versetzt ihn in den normalen Leistungsmodus. Löst eine Ausnahme aus, wenn der Sensor nicht antwortet oder ein anderer Chip antwortet.

ReturnsDas Sensorobjekt.

Parameter

TypNameBeschreibung
I2Ci2cEin initialisiertes machine.I2C-Objekt. Nur bei Firmware optional, die sich als esp32, esp8266 oder als eine ältere Soldered-Board-Firmware meldet.
intaddressI2C-Adresse. BMA400_I2C_ADDRESS_SDO_LOW (0x14, der Standardwert) oder BMA400_I2C_ADDRESS_SDO_HIGH (0x15).
status_string()returns str

Beschreibt den aktuellen sensor.status-Code, zum Beispiel Communication failure oder Sensor not found.

ReturnsDie Beschreibung oder ein leerer String, wenn der Status BMA400_OK ist.

set_step_counter_interrupt(config)returns None

Legt fest, an welchem Interrupt-Pin der Schrittzähler signalisiert. Der Schrittzähler selbst braucht keine weitere Konfiguration. Das Ergebnis wird in sensor.status gespeichert.

ReturnsNichts; prüfen Sie sensor.status.

Parameter

TypNameBeschreibung
dictconfigSchlüssel int_chan, hier BMA400_INT_CHANNEL_1 für INT1.
set_interrupt_pin_mode(channel, mode)returns None

Stellt einen Interrupt-Pin auf Push-Pull oder Open-Drain und auf aktiv high oder aktiv low ein. Das Ergebnis wird in sensor.status gespeichert.

ReturnsNichts; prüfen Sie sensor.status.

Parameter

TypNameBeschreibung
intchannelBMA400_INT_CHANNEL_1 oder BMA400_INT_CHANNEL_2.
intmodeBMA400_INT_PUSH_PULL_ACTIVE_0, BMA400_INT_PUSH_PULL_ACTIVE_1 (Standard), BMA400_INT_OPEN_DRIVE_ACTIVE_0 oder BMA400_INT_OPEN_DRIVE_ACTIVE_1.
enable_interrupt(int_type, enable)returns None

Schaltet eine Interrupt-Bedingung ein oder aus. Der Schrittzähler zählt nur, solange BMA400_STEP_COUNTER_INT_EN aktiviert ist, auch wenn Sie den Interrupt-Pin nie verwenden.

ReturnsNichts; prüfen Sie sensor.status.

Parameter

TypNameBeschreibung
intint_typeEine der BMA400_*_INT_EN-Konstanten, hier BMA400_STEP_COUNTER_INT_EN.
boolenableTrue zum Aktivieren, False zum Deaktivieren.
get_interrupt_status()returns int or None

Liest aus, welche Interrupt-Bedingungen ausgelöst sind. Prüfen Sie das Ergebnis gegen Flags wie BMA400_ASSERTED_STEP_INT.

ReturnsEine Bitmaske aus BMA400_ASSERTED_*-Flags oder None bei einem Busfehler.

get_step_count()returns tuple

Liest den Gesamtzählerstand der Schritte und die vom Chip erkannte Aktivität aus.

Returns(count, activity_type), wobei activity_type BMA400_STILL_ACT, BMA400_WALK_ACT oder BMA400_RUN_ACT ist; (None, None) bei einem Busfehler.

Alles zusammen​

Der Schrittzähler braucht in diesem Beispiel keine Feinabstimmung: set_step_counter_interrupt() leitet seinen Interrupt nur an INT1 weiter, und enable_interrupt() schaltet ihn ein. INT1 ist Push-Pull und aktiv high, daher löst der Pin-Interrupt bei Pin.IRQ_RISING aus, und der Callback setzt nur mems_event. Die Hauptschleife prüft dann den Status auf BMA400_ASSERTED_STEP_INT und liest den Zählerstand und die Aktivität mit get_step_count() aus.

Da der Zählerstand im Chip liegt, können Sie get_step_count() auch jederzeit aufrufen, ohne auf den Interrupt zu warten.