68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
#include "bmp280.hpp"
|
|
#include "pico/stdlib.h"
|
|
|
|
namespace pimoroni {
|
|
bool BMP280::init() {
|
|
int8_t result;
|
|
|
|
if(interrupt != PIN_UNUSED) {
|
|
gpio_set_function(interrupt, GPIO_FUNC_SIO);
|
|
gpio_set_dir(interrupt, GPIO_IN);
|
|
gpio_pull_up(interrupt);
|
|
}
|
|
|
|
device.intf_ptr = new i2c_intf_ptr{.i2c = i2c, .address = address};
|
|
device.intf = BMP280_I2C_INTF;
|
|
device.read = (bmp280_com_fptr_t)&read_bytes;
|
|
device.write = (bmp280_com_fptr_t)&write_bytes;
|
|
device.delay_ms = (bmp280_delay_fptr_t)&delay_ms;
|
|
|
|
result = bmp280_init(&device);
|
|
if(result != BMP280_OK) return false;
|
|
|
|
result = bmp280_set_config(&conf, &device);
|
|
if(result != BMP280_OK) return false;
|
|
|
|
configure(BMP280_FILTER_COEFF_2, BMP280_ODR_1000_MS, BMP280_OS_4X, BMP280_OS_4X);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool BMP280::configure(uint8_t filter, uint8_t odr, uint8_t os_pressure, uint8_t os_temp, uint8_t mode) {
|
|
int8_t result;
|
|
|
|
conf.filter = filter;
|
|
conf.odr = odr;
|
|
conf.os_pres = os_pressure;
|
|
conf.os_temp = os_temp;
|
|
|
|
result = bmp280_set_config(&conf, &device);
|
|
if(result != BMP280_OK) return false;
|
|
|
|
result = bmp280_set_power_mode(mode, &device);
|
|
if(result != BMP280_OK) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
BMP280::bmp280_reading BMP280::read() {
|
|
bmp280_reading result;
|
|
bmp280_get_uncomp_data(&ucomp_data, &device);
|
|
|
|
int32_t temperature;
|
|
result.status = bmp280_get_comp_temp_32bit(&temperature, ucomp_data.uncomp_temp, &device);
|
|
result.temperature = 0.01f * temperature;
|
|
|
|
result.status &= bmp280_get_comp_pres_32bit(&result.pressure, ucomp_data.uncomp_press, &device);
|
|
|
|
return result;
|
|
}
|
|
|
|
I2C* BMP280::get_i2c() const {
|
|
return i2c;
|
|
}
|
|
|
|
int BMP280::get_int() const {
|
|
return interrupt;
|
|
}
|
|
} |