Skip to main content

Brojač koraka

Što prikazuje ovaj primjer​

Brojanje koraka pomoću ugrađenog brojača koraka čipa BMA400, koji također javlja hodate li, trčite ili mirujete. Čip sam otkriva i broji korake; pri svakom koraku postavlja INT1, a vaša pločica čita broj koraka.

Osim I2C spoja (u primjeru GPIO 9 za SCL i GPIO 8 za SDA), spojite pin INT1 pločice na GPIO 5 ili promijenite INT1_PIN na pin koji koristite.

Kôd primjera​

# 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")
)
)

🔗Otvorite cijeli primjer

bma400-stepCounter.py u commitu 484a5be

→

Ovaj primjer također koristi machine.I2C (MicroPython referenca) i machine.Pin s metodom irq() (MicroPython referenca), koji dolaze s MicroPython firmverom i nisu dio modula bma400.

Očekivani rezultat:

ShellMicroPython
Waiting for steps...

Nakon toga svaki prekid zbog koraka ispisuje jedan redak: Step detected! Step count: s ukupnim brojem koraka, zatim , activity: iza čega slijedi Running, Walking, Standing still ili Unknown.

Korištene funkcije​

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

Konstruktor. Softverski resetira senzor, provjerava ID čipa (0x90) i prebacuje ga u normalni način rada. Baca iznimku kada senzor ne odgovara ili odgovori drugi čip.

ReturnsObjekt senzora.

Parametri

TipNazivOpis
I2Ci2cInicijalizirani objekt machine.I2C. Neobavezan samo na firmveru koji se prijavljuje kao esp32, esp8266 ili jedan stariji firmver Soldered pločice.
intaddressI2C adresa. BMA400_I2C_ADDRESS_SDO_LOW (0x14, zadano) ili BMA400_I2C_ADDRESS_SDO_HIGH (0x15).
status_string()returns str

Opisuje trenutni kôd sensor.status, na primjer Communication failure ili Sensor not found.

ReturnsOpis ili prazan niz kada je status BMA400_OK.

set_step_counter_interrupt(config)returns None

Postavlja na kojem pinu za prekid brojač koraka signalizira. Sam brojač koraka ne treba nikakvu drugu konfiguraciju. Rezultat se sprema u sensor.status.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
dictconfigKljuč int_chan, ovdje BMA400_INT_CHANNEL_1 za INT1.
set_interrupt_pin_mode(channel, mode)returns None

Postavlja pin za prekid kao push-pull ili open drain, aktivan u visokom ili niskom stanju. Rezultat se sprema u sensor.status.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
intchannelBMA400_INT_CHANNEL_1 ili BMA400_INT_CHANNEL_2.
intmodeBMA400_INT_PUSH_PULL_ACTIVE_0, BMA400_INT_PUSH_PULL_ACTIVE_1 (zadano), BMA400_INT_OPEN_DRIVE_ACTIVE_0 ili BMA400_INT_OPEN_DRIVE_ACTIVE_1.
enable_interrupt(int_type, enable)returns None

Uključuje ili isključuje jedan uvjet prekida. Brojač koraka broji samo dok je BMA400_STEP_COUNTER_INT_EN uključen, čak i ako nikad ne koristite pin za prekid.

ReturnsNišta; provjerite sensor.status.

Parametri

TipNazivOpis
intint_typeJedna od konstanti BMA400_*_INT_EN, ovdje BMA400_STEP_COUNTER_INT_EN.
boolenableTrue za uključivanje, False za isključivanje.
get_interrupt_status()returns int or None

Čita koji su uvjeti prekida aktivni. Rezultat provjerite u odnosu na zastavice kao što je BMA400_ASSERTED_STEP_INT.

ReturnsBitmaska zastavica BMA400_ASSERTED_* ili None kod pogreške sabirnice.

get_step_count()returns tuple

Čita ukupan broj koraka i aktivnost koju je čip otkrio.

Returns(count, activity_type), pri čemu je activity_type BMA400_STILL_ACT, BMA400_WALK_ACT ili BMA400_RUN_ACT; (None, None) kod pogreške sabirnice.

Sve zajedno​

Brojač koraka u ovom primjeru ne treba podešavanje: set_step_counter_interrupt() samo usmjerava njegov prekid na INT1, a enable_interrupt() ga uključuje. INT1 je push-pull, aktivan u visokom stanju, pa se prekid na pinu okida na Pin.IRQ_RISING, a povratna funkcija samo postavlja mems_event. Glavna petlja zatim provjerava status za BMA400_ASSERTED_STEP_INT te čita broj koraka i aktivnost pomoću get_step_count().

Budući da se broj koraka nalazi u čipu, get_step_count() možete pozvati i u bilo kojem trenutku, bez čekanja na prekid.