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:
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 BMA400Konstruktor. 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
| Tip | Naziv | Opis |
|---|---|---|
I2C | i2c | Inicijalizirani objekt machine.I2C. Neobavezan samo na firmveru koji se prijavljuje kao esp32, esp8266 ili jedan stariji firmver Soldered pločice. |
int | address | I2C adresa. BMA400_I2C_ADDRESS_SDO_LOW (0x14, zadano) ili BMA400_I2C_ADDRESS_SDO_HIGH (0x15). |
status_string()returns strOpisuje 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 NonePostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
dict | config | Ključ int_chan, ovdje BMA400_INT_CHANNEL_1 za INT1. |
set_interrupt_pin_mode(channel, mode)returns NonePostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
int | channel | BMA400_INT_CHANNEL_1 ili BMA400_INT_CHANNEL_2. |
int | mode | BMA400_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 NoneUključ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
| Tip | Naziv | Opis |
|---|---|---|
int | int_type | Jedna od konstanti BMA400_*_INT_EN, ovdje BMA400_STEP_COUNTER_INT_EN. |
bool | enable | True 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.