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:
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 BMA400Konstruktor. 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
| Typ | Name | Beschreibung |
|---|---|---|
I2C | i2c | Ein initialisiertes machine.I2C-Objekt. Nur bei Firmware optional, die sich als esp32, esp8266 oder als eine ältere Soldered-Board-Firmware meldet. |
int | address | I2C-Adresse. BMA400_I2C_ADDRESS_SDO_LOW (0x14, der Standardwert) oder BMA400_I2C_ADDRESS_SDO_HIGH (0x15). |
status_string()returns strBeschreibt 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 NoneLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
dict | config | Schlüssel int_chan, hier BMA400_INT_CHANNEL_1 für INT1. |
set_interrupt_pin_mode(channel, mode)returns NoneStellt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | channel | BMA400_INT_CHANNEL_1 oder BMA400_INT_CHANNEL_2. |
int | mode | BMA400_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 NoneSchaltet 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
| Typ | Name | Beschreibung |
|---|---|---|
int | int_type | Eine der BMA400_*_INT_EN-Konstanten, hier BMA400_STEP_COUNTER_INT_EN. |
bool | enable | True zum Aktivieren, False zum Deaktivieren. |
get_interrupt_status()returns int or NoneLiest 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 tupleLiest 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.