void setup(void) { // Get particulars for board i2cInit(I2CDEV_2); // Not sure why the ms5611 needs this, but without this line it doesn't work i2cWrite(0,0,0); // attempt to initialize barometer available = bmp280_init(); }
int main(int argc, char **argv) { signal(SIGINT, sig_handler); //! [Interesting] // Instantiate a BME280 instance using default i2c bus and // address. We use the BMP280 driver to do all of our work, since // the BMP280 and the BME280 are identical except for the fact // that the BME280 includes a humidity sensor. bmp280_context sensor = bmp280_init(BME280_DEFAULT_I2C_BUS, BME280_DEFAULT_ADDR, -1); if (!sensor) { printf("bmp280_init() failed\n"); return 1; } // For SPI, bus 0, you would pass -1 as the address, and a valid pin for CS: // bmp280_init(BME280_DEFAULT_SPI_BUS, // -1, 10) while (shouldRun) { // update our values from the sensor if (bmp280_update(sensor)) { printf("bmp280_update() failed\n"); bmp280_close(sensor); return 1; } printf("Compensation Temperature: %f C\n", bmp280_get_temperature(sensor)); printf("Pressure: %f Pa\n", bmp280_get_pressure(sensor)); printf("Computed Altitude: %f m\n", bmp280_get_altitude(sensor)); printf("Relative Humidity: %f %%\n\n", bmp280_get_humidity(sensor)); upm_delay(1); } //! [Interesting] printf("Exiting...\n"); bmp280_close(sensor); return 0; }
static void sensorsDeviceInit(void) { if (isInit) return; bstdr_ret_t rslt; isBarometerPresent = false; // Wait for sensors to startup vTaskDelay(M2T(SENSORS_STARTUP_TIME_MS)); /* BMI160 */ // assign bus read function bmi160Dev.read = (bmi160_com_fptr_t)bstdr_burst_read; // assign bus write function bmi160Dev.write = (bmi160_com_fptr_t)bstdr_burst_write; // assign delay function bmi160Dev.delay_ms = (bmi160_delay_fptr_t)bstdr_ms_delay; bmi160Dev.id = BMI160_I2C_ADDR+1; // I2C device address rslt = bmi160_init(&bmi160Dev); // initialize the device if (rslt == BSTDR_OK) { DEBUG_PRINT("BMI160 I2C connection [OK].\n"); /* Select the Output data rate, range of Gyroscope sensor * ~92Hz BW by OSR4 @ODR=800Hz */ bmi160Dev.gyro_cfg.odr = BMI160_GYRO_ODR_800HZ; bmi160Dev.gyro_cfg.range = SENSORS_BMI160_GYRO_FS_CFG; bmi160Dev.gyro_cfg.bw = BMI160_GYRO_BW_OSR4_MODE; /* Select the power mode of Gyroscope sensor */ bmi160Dev.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; /* Select the Output data rate, range of accelerometer sensor * ~92Hz BW by OSR4 @ODR=800Hz */ bmi160Dev.accel_cfg.odr = BMI160_ACCEL_ODR_1600HZ; bmi160Dev.accel_cfg.range = SENSORS_BMI160_ACCEL_FS_CFG; bmi160Dev.accel_cfg.bw = BMI160_ACCEL_BW_OSR4_AVG1; /* Select the power mode of accelerometer sensor */ bmi160Dev.accel_cfg.power = BMI160_ACCEL_NORMAL_MODE; /* Set the sensor configuration */ rslt |= bmi160_set_sens_conf(&bmi160Dev); bmi160Dev.delay_ms(50); /* read sensor */ struct bmi160_sensor_data gyr; rslt |= bmi160_get_sensor_data(BMI160_GYRO_ONLY, NULL, &gyr, &bmi160Dev); struct bmi160_sensor_data acc; rslt |= bmi160_get_sensor_data(BMI160_ACCEL_ONLY, &acc, NULL, &bmi160Dev); } else { DEBUG_PRINT("BMI160 I2C connection [FAIL].\n"); } /* BMI055 */ bmi055Dev.accel_id = BMI055_ACCEL_I2C_ADDR; bmi055Dev.gyro_id = BMI055_GYRO_I2C_ADDR; bmi055Dev.interface = BMI055_I2C_INTF; bmi055Dev.read = (bmi055_com_fptr_t)bstdr_burst_read; bmi055Dev.write = (bmi055_com_fptr_t)bstdr_burst_write; bmi055Dev.delay_ms = (bmi055_delay_fptr_t)bstdr_ms_delay; /* BMI055 GYRO */ rslt = bmi055_gyro_init(&bmi055Dev); // initialize the device if (rslt == BSTDR_OK) { DEBUG_PRINT("BMI055 Gyro I2C connection [OK].\n"); /* set power mode of gyro */ bmi055Dev.gyro_cfg.power = BMI055_GYRO_PM_NORMAL; rslt |= bmi055_set_gyro_power_mode(&bmi055Dev); /* set bandwidth and range of gyro */ bmi055Dev.gyro_cfg.bw = BMI055_GYRO_BW_116_HZ; bmi055Dev.gyro_cfg.range = SENSORS_BMI055_GYRO_FS_CFG; rslt |= bmi055_set_gyro_sensor_config(CONFIG_ALL, &bmi055Dev); bmi055Dev.delay_ms(50); struct bmi055_sensor_data gyr; rslt |= bmi055_get_gyro_data(&gyr, &bmi055Dev); } else { DEBUG_PRINT("BMI055 Gyro I2C connection [FAIL].\n"); } /* BMI055 ACCEL */ rslt = bmi055_accel_init(&bmi055Dev); // initialize the device if (rslt == BSTDR_OK) { DEBUG_PRINT("BMI055 Accel I2C connection [OK].\n"); /* set power mode of accel */ bmi055Dev.accel_cfg.power = BMI055_ACCEL_PM_NORMAL; rslt |= bmi055_set_accel_power_mode(&bmi055Dev); /* set bandwidth and range of accel */ bmi055Dev.accel_cfg.bw = BMI055_ACCEL_BW_125_HZ; bmi055Dev.accel_cfg.range = SENSORS_BMI055_ACCEL_FS_CFG; rslt |= bmi055_set_accel_sensor_config(CONFIG_ALL, &bmi055Dev); bmi055Dev.delay_ms(10); struct bmi055_sensor_data acc; rslt |= bmi055_get_accel_data(&acc, &bmi055Dev); } else { DEBUG_PRINT("BMI055 Accel I2C connection [FAIL].\n"); } /* BMM150 */ rslt = BSTDR_E_GEN_ERROR; /* Sensor interface over I2C */ bmm150Dev.id = BMM150_DEFAULT_I2C_ADDRESS; bmm150Dev.interface = BMM150_I2C_INTF; bmm150Dev.read = (bmm150_com_fptr_t)bstdr_burst_read; bmm150Dev.write = (bmm150_com_fptr_t)bstdr_burst_write; bmm150Dev.delay_ms = bstdr_ms_delay; rslt = bmm150_init(&bmm150Dev); if (rslt == BMM150_OK){ bmm150Dev.settings.pwr_mode = BMM150_NORMAL_MODE; rslt |= bmm150_set_op_mode(&bmm150Dev); bmm150Dev.settings.preset_mode = BMM150_PRESETMODE_HIGHACCURACY; rslt |= bmm150_set_presetmode(&bmm150Dev); DEBUG_PRINT("BMM150 I2C connection [OK].\n"); isMagnetometerPresent = true; } /* BMP280 */ rslt = BSTDR_E_GEN_ERROR; bmp280Dev.bus_read = bstdr_burst_read; bmp280Dev.bus_write = bstdr_burst_write; bmp280Dev.delay_ms = bstdr_ms_delay; bmp280Dev.dev_addr = BMP280_I2C_ADDRESS1; rslt = bmp280_init(&bmp280Dev); if (rslt == BSTDR_OK) { isBarometerPresent = true; DEBUG_PRINT("BMP280 I2C connection [OK].\n"); bmp280_set_filter(BMP280_FILTER_COEFF_OFF); bmp280_set_oversamp_temperature(BMP280_OVERSAMP_2X); bmp280_set_oversamp_pressure(BMP280_OVERSAMP_8X); bmp280_set_power_mode(BMP280_NORMAL_MODE); bmp280Dev.delay_ms(20); // wait before first read out // read out data int32_t v_temp_s32; uint32_t v_pres_u32; bmp280_read_pressure_temperature(&v_pres_u32, &v_temp_s32); baroMeasDelayMin = SENSORS_DELAY_BARO; } varianceSampleTime = -GYRO_MIN_BIAS_TIMEOUT_MS + 1; sensorsAccLpfAttFactor = IMU_ACC_IIR_LPF_ATT_FACTOR; cosPitch = cosf(configblockGetCalibPitch() * (float) M_PI / 180); sinPitch = sinf(configblockGetCalibPitch() * (float) M_PI / 180); cosRoll = cosf(configblockGetCalibRoll() * (float) M_PI / 180); sinRoll = sinf(configblockGetCalibRoll() * (float) M_PI / 180); isInit = true; }