Skip to main content

BNO055 BMP280 Sensors

This module combines two sensors on a single board:

  • BNO055: 9-DOF absolute orientation sensor (accelerometer, gyroscope, magnetometer) with on-board sensor fusion.
  • BMP280: high-precision barometric pressure and temperature sensor.

Perfect for robotics, inertial navigation, drones, environmental monitoring and IoT projects.

Features

  • BNO055

    FeatureDescription
    On-chip sensor fusionquaternions, Euler angles, gravity vectors, etc.
    Accelerometer ranges±2/4/8/16 g
    Gyroscope ranges±125/250/500/1000/2000 °/s
    Magnetometer ranges±1.3/1.9/2.5/4.0/4.7/5.6/8.1 gauss
    ProtocolI²C, UART (select via PS0/PS1)
  • BMP280

    FeatureDescription
    Pressure range300…1100 hPa (±10…+1 m)
    Temperature accuracy±1 °C
    ProtocolI²C, UART, SWD

Module Applications

ApplicationDescription
📈 Portable weather stationMeasures temperature, humidity, and pressure accurately.
🪂 Altimeter / variometerCalculates altitude based on atmospheric pressure.
🧍 Posture trackingDetects body tilt or rotation.
🛰️ Inertial navigationTracks movement and orientation without GPS.
🕹️ Augmented / virtual realityProvides orientation for 3D environments.
🚁 Flight controllerStabilization for drones or robots.
🤖 Gesture interfaceUses motion to control devices.
🌐 IoT environmental loggingCollects and transmits environmental conditions.

Example Code


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <Adafruit_BMP280.h>
#include <utility/imumaths.h>

// BNO055: orientación y movimiento
Adafruit_BNO055 bno(55, 0x28, &Wire);

// BMP280: temperatura y presión
Adafruit_BMP280 bmp;
Adafruit_Sensor* bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor* bmp_pressure = bmp.getPressureSensor();

void setup() {
Serial.begin(115200);
while (!Serial);

// Inicializar BNO055
if (!bno.begin()) {
Serial.println("{\"error\":\"BNO055 not detected\"}");
while (1);
}
delay(1000); // Estabilizar BNO055

// Inicializar BMP280 en dirección 0x76
if (!bmp.begin(0x76)) {
Serial.println("{\"error\":\"BMP280 not detected at 0x76\"}");
while (1);
}

bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}

void loop() {
// Eventos del BNO055
sensors_event_t orientation, gyro, linearAccel, magnetometer, accel, gravity;
bno.getEvent(&orientation, Adafruit_BNO055::VECTOR_EULER);
bno.getEvent(&gyro, Adafruit_BNO055::VECTOR_GYROSCOPE);
bno.getEvent(&linearAccel, Adafruit_BNO055::VECTOR_LINEARACCEL);
bno.getEvent(&magnetometer, Adafruit_BNO055::VECTOR_MAGNETOMETER);
bno.getEvent(&accel, Adafruit_BNO055::VECTOR_ACCELEROMETER);
bno.getEvent(&gravity, Adafruit_BNO055::VECTOR_GRAVITY);

// BMP280: temperatura y presión
sensors_event_t temp_event, pressure_event;
bmp_temp->getEvent(&temp_event);
bmp_pressure->getEvent(&pressure_event);

// Calibración BNO055
int8_t temp_bno = bno.getTemp();
uint8_t sys, gyroCal, accelCal, magCal;
bno.getCalibration(&sys, &gyroCal, &accelCal, &magCal);

// JSON OUTPUT
Serial.print("{");

// BMP280
Serial.print("\"bmp280\":{\"temperature\":"); Serial.print(temp_event.temperature, 2);
Serial.print(",\"pressure\":"); Serial.print(pressure_event.pressure, 2); Serial.print("},");

// BNO055 - orientación
Serial.print("\"orientation\":{\"x\":"); Serial.print(orientation.orientation.x, 2);
Serial.print(",\"y\":"); Serial.print(orientation.orientation.y, 2);
Serial.print(",\"z\":"); Serial.print(orientation.orientation.z, 2); Serial.print("},");

// BNO055 - giroscopio
Serial.print("\"gyroscope\":{\"x\":"); Serial.print(gyro.gyro.x, 2);
Serial.print(",\"y\":"); Serial.print(gyro.gyro.y, 2);
Serial.print(",\"z\":"); Serial.print(gyro.gyro.z, 2); Serial.print("},");

// BNO055 - aceleración lineal
Serial.print("\"linear_accel\":{\"x\":"); Serial.print(linearAccel.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(linearAccel.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(linearAccel.acceleration.z, 2); Serial.print("},");

// BNO055 - magnetómetro
Serial.print("\"magnetometer\":{\"x\":"); Serial.print(magnetometer.magnetic.x, 2);
Serial.print(",\"y\":"); Serial.print(magnetometer.magnetic.y, 2);
Serial.print(",\"z\":"); Serial.print(magnetometer.magnetic.z, 2); Serial.print("},");

// BNO055 - aceleración total
Serial.print("\"acceleration\":{\"x\":"); Serial.print(accel.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(accel.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(accel.acceleration.z, 2); Serial.print("},");

// BNO055 - gravedad
Serial.print("\"gravity\":{\"x\":"); Serial.print(gravity.acceleration.x, 2);
Serial.print(",\"y\":"); Serial.print(gravity.acceleration.y, 2);
Serial.print(",\"z\":"); Serial.print(gravity.acceleration.z, 2); Serial.print("},");

// Temperatura interna y calibración
Serial.print("\"bno055_temp\":"); Serial.print(temp_bno); Serial.print(",");
Serial.print("\"calibration\":{\"sys\":"); Serial.print(sys);
Serial.print(",\"gyro\":"); Serial.print(gyroCal);
Serial.print(",\"accel\":"); Serial.print(accelCal);
Serial.print(",\"mag\":"); Serial.print(magCal); Serial.print("}");

Serial.println("}");
delay(500);
}