Example Code for Arduino-Reading Accumulated Step Count via I2C

This tutorial demonstrates how to configure the built-in hardware pedometer of the BMI323 six-axis sensor using the ESP32-C5 microcontroller, and stably read the accumulated step count by polling once per second.

Hardware Preparation

Software Preparation

Wiring Diagram

SEN0693-Accumulated Step Count wiring diagram

Connect the 6 DOF IMU sensor to the ESP32-C5 as shown in the diagram. The main connections are:

  • Sensor pin “3V3” → ESP32-C5 3.3V
  • Sensor pin “GND” → ESP32-C5 GND
  • Sensor pin “INT1” → ESP32-C5 GPIO27
  • Sensor I2C pin “SCL” → ESP32-C5 SCL (default GPIO10)
  • Sensor I2C pin “SDA” → ESP32-C5 SDA (default GPIO9)
  • I2C address pad configuration: Leave the pad open, the I2C address will be 0x69 (factory default mode)

Sample Code

#include "DFRobot_BMI323.h"

#define BMI323_I2C_ADDR 0x69  

DFRobot_BMI323 bmi323(&Wire, BMI323_I2C_ADDR);
volatile bool gStepReady = false;

// ESP32 interrupt function must be placed in IRAM
void IRAM_ATTR interrupt() {
  gStepReady = true;
}

void setup() {
  Serial.begin(115200);
  while (!Serial) {
  delay(10);   // Wait for serial initialization
}

  Serial.println("BMI323 Step Counter Demo");
  Serial.println("========================");

  // Initialize BMI323, retry on failure
  while (!bmi323.begin()) {
    Serial.println("I2C init failed, retry in 1s");
    delay(1000);
  }

  // Configure accelerometer: 50Hz sampling rate, ±8g range, normal mode
  bmi323.configAccel(bmi323.eAccelODR50Hz, bmi323.eAccelRange8G, bmi323.eAccelModeNormal);

  // Enable step counter interrupt on INT1 pin
  if (!bmi323.enableStepCounterInt(bmi323.eINT1)) {
    Serial.println("Enable step counter interrupt failed!");
    while (1) delay(1000);
  }

  // Connect BMI323 INT1 to ESP32 GPIO 27 (can be modified as needed)
  attachInterrupt(digitalPinToInterrupt(27), interrupt, RISING);

/* Correspondence table of AVR series Arduino interrupt pins and terminal numbers
 * ---------------------------------------------------------------------------------------
 * |                                        | Digital Pin | 2  | 3  |                   |
 * |    Uno, Nano, Mini, and other 328-based boards       |--------------------------------|
 * |                                        | Interrupt No| 0  | 1  |                   |
 * |-------------------------------------------------------------------------------------|
 * |                                        |    Pin      | 2  | 3  | 21 | 20 | 19 | 18 |
 * |               Mega2560                 |--------------------------------------------|
 * |                                        | Interrupt No| 0  | 1  | 2  | 3  | 4  | 5  |
 * |-------------------------------------------------------------------------------------|
 * |                                        |    Pin      | 3  | 2  | 0  | 1  | 7  |    |
 * |    Leonardo and other 32u4-based boards |--------------------------------------------|
 * |                                        | Interrupt No| 0  | 1  | 2  | 3  | 4  |    |
 * |--------------------------------------------------------------------------------------
 * ---------------------------------------------------------------------------------------------------------------------------------------------
 *                 Correspondence table of micro:bit interrupt pins and terminal numbers
 * ---------------------------------------------------------------------------------------------------------------------------------------------
 * |             micro:bit                       | Digital Pin | P0-P20 can be used as external interrupt          |
 * |  (When used as an external interrupt,        |---------------------------------------------------------------------------------------------|
 * |  no need to set it to input mode with pinMode)| Interrupt No| Interrupt number is the pin's digital value, e.g., P0 interrupt number 0, P1 is 1 |
 * |-------------------------------------------------------------------------------------------------------------------------------------------|
 */

  Serial.println("Connect BMI323 INT1 to the defined MCU pin.");
  Serial.println("Every step will trigger an interrupt and update the counter.\n");
}

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

    uint16_t status = bmi323.getIntStatus();
    if (status & BMI3_INT_STATUS_STEP_DETECTOR) {
      uint16_t steps = 0;
      if (bmi323.readStepCounter(&steps) == BMI3_OK) {
        Serial.print("Steps: ");
        Serial.println(steps);
      }
    }
  }
}

Result

SEN0693-Accumulated Step Count Result

Note:

  • When restarting step counting after startup or standby, the device requires a buffer of 3 to 5 steps (approximately 1 to 3 seconds) to stabilize signals and verify steps. It is normal that the displayed step count remains 0 or unchanged during this period, and the actual steps will be updated automatically later.
  • Avoid shaking the device frequently at the initial startup stage (such as casual swinging), otherwise it may prolong the buffering time or cause incorrect step counting.

Was this article helpful?

TOP