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 detektira i broji korake; pri koraku postavlja INT1, a vaš kontroler čita broj koraka.

Osim Qwiic konektora ili I2C pinova headera, spojite INT1 pin pločice na digitalni pin 2 na vašem kontroleru ili u skici promijenite interruptPin na pin koji koristite. Pin mora podržavati prekide.

Primjer koda​

Select Board
stepCounter.ino
/**
**************************************************
*
* @file stepCounter.ino
*
* @brief Example showing how to use the BMA400's built-in step
* counter and activity type detection (running/walking/still)
*
* @link solde.red/333419 : Soldered BMA400 Accelerometer breakout
*
* @authors SparkFun Electronics, modified by Soldered Electronics
***************************************************/
#include <BMA400-SOLDERED.h>

// Create an instance of the BMA400 sensor
Soldered_BMA400 accelerometer;

// Pin connected to the sensor's INT1 pin, change to match your wiring
int interruptPin = 2;

// Flag to know when an interrupt occurs
volatile bool interruptOccurred = false;

void bma400InterruptHandler()
{
interruptOccurred = true;
}

void setup()
{
// Initialize serial for output
Serial.begin(115200);
Serial.println("BMA400 Example - Step Counter");

// Initialize I2C bus
Wire.begin();

// Check if sensor is connected and initialize it.
// Address is optional, defaults to 0x14
while (accelerometer.begin() != BMA400_OK)
{
Serial.println("Error: BMA400 not connected, check wiring and I2C address!");
delay(1000);
}

Serial.println("BMA400 connected!");

// 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
bma400_step_int_conf config = {
.int_chan = BMA400_INT_CHANNEL_1 // Route interrupt to INT1 pin
};
accelerometer.setStepCounterInterrupt(&config);

// Configure INT1 pin to push/pull mode, active high
accelerometer.setInterruptPinMode(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
accelerometer.enableInterrupt(BMA400_STEP_COUNTER_INT_EN, true);

// Attach the interrupt handler to the microcontroller pin wired to INT1
attachInterrupt(digitalPinToInterrupt(interruptPin), bma400InterruptHandler, RISING);
}

void loop()
{
if (interruptOccurred)
{
interruptOccurred = false;

// Check which interrupt condition triggered
uint16_t interruptStatus = 0;
accelerometer.getInterruptStatus(&interruptStatus);

if (interruptStatus & BMA400_ASSERTED_STEP_INT)
{
// Get total step count and detected activity type
uint32_t stepCount = 0;
uint8_t activityType = 0;
accelerometer.getStepCount(&stepCount, &activityType);

Serial.print("Step detected! Step count: ");
Serial.print(stepCount);
Serial.print("\t");

Serial.print("Detected activity: ");
switch (activityType)
{
case BMA400_RUN_ACT:
Serial.println("Running");
break;
case BMA400_WALK_ACT:
Serial.println("Walking");
break;
case BMA400_STILL_ACT:
Serial.println("Standing still");
break;
default:
Serial.println("Unknown");
break;
}
}
}
}

Ovaj primjer koristi i attachInterrupt() i digitalPinToInterrupt() (Arduino referenca), koje dolaze s Arduino jezgrom i nisu dio biblioteke Soldered BMA400 Accelerometer.

Očekivani rezultat:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
BMA400 Example - Step Counter
BMA400 connected!

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

Korištene funkcije​

Soldered_BMA400()returns none

Konstruktor. Stvara objekt senzora; ne komunicira sa senzorom dok ne pozovete begin().

ReturnsKonstruktor; nema povratne vrijednosti.

int8_t begin(uint8_t address = BMA400_I2C_ADDRESS_DEFAULT, TwoWire &wirePort = Wire)returns int8_t

Pokreće senzor preko I2C-a: softverski resetira BMA400, provjerava ID čipa i postavlja ga u normalni način rada.

ReturnsBMA400_OK (0) u slučaju uspjeha, inače negativan kod pogreške. Adresa različita od 0x14 ili 0x15 vraća BMA400_E_INVALID_CONFIG.

Parametri

TipNazivOpis
uint8_taddressI2C adresa. BMA400_I2C_ADDRESS_DEFAULT (0x14, zadano) ili BMA400_I2C_ADDRESS_SECONDARY (0x15).
TwoWire &wirePortI2C sabirnica koja se koristi. Zadano je Wire.
int8_t setStepCounterInterrupt(bma400_step_int_conf* config)returns int8_t

Određuje na kojem pinu za prekid brojač koraka signalizira.

Returns0 u slučaju uspjeha, negativna vrijednost u slučaju greške.

Parametri

TipNazivOpis
bma400_step_int_conf*configPokazivač na konfiguraciju. Primjer postavlja int_chan na BMA400_INT_CHANNEL_1 za INT1.
int8_t setInterruptPinMode(bma400_int_chan channel, uint8_t mode)returns int8_t

Postavlja pin za prekid kao push-pull ili open drain, aktivan u visokom ili niskom stanju.

Returns0 u slučaju uspjeha, negativna vrijednost u slučaju greške.

Parametri

TipNazivOpis
bma400_int_chanchannelPin koji se konfigurira, na primjer BMA400_INT_CHANNEL_1 za INT1.
uint8_tmodeBMA400_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.
int8_t enableInterrupt(bma400_int_type intType, bool enable)returns int8_t

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

Returns0 u slučaju uspjeha, negativna vrijednost u slučaju greške.

Parametri

TipNazivOpis
bma400_int_typeintTypeUvjet, na primjer BMA400_STEP_COUNTER_INT_EN za brojač koraka.
boolenabletrue za uključivanje, false za isključivanje.
int8_t getInterruptStatus(uint16_t* status)returns int8_t

Čita koji su uvjeti prekida aktivni. Rezultat provjerite zastavicama kao što je BMA400_ASSERTED_STEP_INT.

Returns0 u slučaju uspjeha, negativna vrijednost u slučaju greške.

Parametri

TipNazivOpis
uint16_t*statusPrima zastavice statusa, kombinaciju BMA400_ASSERTED_* vrijednosti.
int8_t getStepCount(uint32_t* count, uint8_t* activityType)returns int8_t

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

Returns0 u slučaju uspjeha, negativna vrijednost u slučaju greške.

Parametri

TipNazivOpis
uint32_t*countPrima broj koraka, 24-bitnu vrijednost.
uint8_t*activityTypePrima BMA400_STILL_ACT, BMA400_WALK_ACT ili BMA400_RUN_ACT.

Sve zajedno​

Brojač koraka u ovom primjeru ne treba podešavanje: setStepCounterInterrupt() samo usmjerava njegov prekid na INT1, a enableInterrupt() ga uključuje. INT1 je push-pull, aktivan u visokom stanju, pa se rukovatelj prekida veže na RISING brid i samo postavlja volatile zastavicu. loop() zatim provjerava status za BMA400_ASSERTED_STEP_INT te čita broj koraka i aktivnost pomoću getStepCount().

Budući da se broj koraka čuva u čipu, getStepCount() možete pozvati i u bilo kojem trenutku, bez čekanja prekida.