Schrittzähler
Was dieses Beispiel zeigt
Schritte zählen mit dem integrierten 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 Controller liest den Zählerstand aus.
Verbinden Sie zusätzlich zu Qwiic oder den I2C-Header-Pins den INT1-Pin des Breakouts
mit dem digitalen Pin 2 Ihres Controllers, oder ändern Sie interruptPin im Sketch auf den
Pin, den Sie verwenden. Der Pin muss Interrupts unterstützen.
Der Beispielcode
/**
**************************************************
*
* @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;
}
}
}
}
Dieses Beispiel verwendet außerdem attachInterrupt() und digitalPinToInterrupt()
(Arduino-Referenz),
die zum Arduino-Core gehören und nicht Teil der Soldered-BMA400-Accelerometer-Bibliothek sind.
Erwartetes Ergebnis:
BMA400 Example - Step Counter
BMA400 connected!
Nach dem Start gibt jeder Schritt-Interrupt eine Zeile aus: Step detected! Step count: mit dem Gesamtzählerstand, einem Tabulator, dann Detected activity: gefolgt von
Running, Walking, Standing still oder Unknown.
Verwendete Funktionen
Soldered_BMA400()returns noneKonstruktor. Erzeugt das Sensorobjekt; es kommuniziert erst mit dem Sensor, wenn Sie begin() aufrufen.
ReturnsKonstruktor; kein Rückgabewert.
int8_t begin(uint8_t address = BMA400_I2C_ADDRESS_DEFAULT, TwoWire &wirePort = Wire)returns int8_tStartet den Sensor über I2C: setzt den BMA400 per Soft-Reset zurück, prüft seine Chip-ID und versetzt ihn in den normalen Energiemodus.
ReturnsBMA400_OK (0) bei Erfolg, sonst ein negativer Fehlercode. Eine andere Adresse als 0x14 oder 0x15 liefert BMA400_E_INVALID_CONFIG zurück.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | address | I2C-Adresse. BMA400_I2C_ADDRESS_DEFAULT (0x14, der Standardwert) oder BMA400_I2C_ADDRESS_SECONDARY (0x15). |
TwoWire & | wirePort | Zu verwendender I2C-Bus. Standardmäßig Wire. |
int8_t setStepCounterInterrupt(bma400_step_int_conf* config)returns int8_tLegt fest, über welchen Interrupt-Pin der Schrittzähler signalisiert.
Returns0 bei Erfolg, negativ bei Fehler.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
bma400_step_int_conf* | config | Zeiger auf die Konfiguration. Das Beispiel setzt int_chan auf BMA400_INT_CHANNEL_1 für INT1. |
int8_t setInterruptPinMode(bma400_int_chan channel, uint8_t mode)returns int8_tStellt einen Interrupt-Pin auf Push-Pull oder Open-Drain sowie active high oder active low ein.
Returns0 bei Erfolg, negativ bei Fehler.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
bma400_int_chan | channel | Der zu konfigurierende Pin, zum Beispiel BMA400_INT_CHANNEL_1 für INT1. |
uint8_t | 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. |
int8_t enableInterrupt(bma400_int_type intType, bool enable)returns int8_tSchaltet 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.
Returns0 bei Erfolg, negativ bei Fehler.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
bma400_int_type | intType | Die Bedingung, zum Beispiel BMA400_STEP_COUNTER_INT_EN für den Schrittzähler. |
bool | enable | true zum Aktivieren, false zum Deaktivieren. |
int8_t getInterruptStatus(uint16_t* status)returns int8_tLiest aus, welche Interrupt-Bedingungen ausgelöst sind. Prüfen Sie das Ergebnis gegen Flags wie BMA400_ASSERTED_STEP_INT.
Returns0 bei Erfolg, negativ bei Fehler.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint16_t* | status | Erhält die Status-Flags, eine Kombination aus BMA400_ASSERTED_*-Werten. |
int8_t getStepCount(uint32_t* count, uint8_t* activityType)returns int8_tLiest den Gesamtschrittzählerstand und die vom Chip erkannte Aktivität aus.
Returns0 bei Erfolg, negativ bei Fehler.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint32_t* | count | Erhält den Schrittzählerstand, einen 24-Bit-Wert. |
uint8_t* | activityType | Erhält BMA400_STILL_ACT, BMA400_WALK_ACT oder BMA400_RUN_ACT. |
Alles zusammengesetzt
Der Schrittzähler braucht in diesem Beispiel keine Feinabstimmung: setStepCounterInterrupt()
leitet seinen Interrupt nur an INT1 weiter, und enableInterrupt() schaltet ihn ein.
INT1 ist Push-Pull und active high, daher wird der Handler bei einer RISING-Flanke angehängt
und setzt nur ein volatile-Flag. loop() prüft dann den Status auf
BMA400_ASSERTED_STEP_INT und liest Zählerstand und Aktivität mit
getStepCount() aus.
Da der Zählerstand im Chip gespeichert ist, können Sie getStepCount() auch jederzeit
aufrufen, ohne auf den Interrupt zu warten.