pimoroni-pico/drivers/bme280/bme280.cpp

83 lines
2.6 KiB
C++

#include "bme280.hpp"
#include "pico/stdlib.h"
namespace pimoroni {
bool BME280::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 = bme280_intf::BME280_I2C_INTF;
device.read = (bme280_read_fptr_t)&read_bytes;
device.write = (bme280_write_fptr_t)&write_bytes;
device.delay_us = (bme280_delay_us_fptr_t)&delay_us;
result = bme280_init(&device);
if(result != BME280_OK) return false;
configure(BME280_FILTER_COEFF_2, BME280_STANDBY_TIME_0_5_MS, BME280_OVERSAMPLING_16X, BME280_OVERSAMPLING_2X, BME280_OVERSAMPLING_1X);
return true;
}
bool BME280::configure(uint8_t filter, uint8_t standby_time, uint8_t os_pressure, uint8_t os_temp, uint8_t os_humidity, uint8_t mode) {
int8_t result;
settings.filter = filter;
settings.standby_time = standby_time;
settings.osr_p = os_pressure;
settings.osr_t = os_temp;
settings.osr_h = os_humidity;
result = bme280_set_sensor_settings(BME280_ALL_SETTINGS_SEL, &device);
if(result != BME280_OK) return false;
result = bme280_set_sensor_mode(mode, &device);
if(result != BME280_OK) return false;
return true;
}
BME280::bme280_reading BME280::read_forced() {
bme280_reading reading;
int8_t result;
reading.status = false;
result = bme280_set_sensor_mode(BME280_FORCED_MODE, &device);
if(result != BME280_OK) return reading;
uint32_t req_delay = bme280_cal_meas_delay(&device.settings);
device.delay_us(req_delay, device.intf_ptr);
bme280_data data;
reading.status = bme280_get_sensor_data(BME280_ALL, &data, &device) == BME280_OK;
reading.temperature = data.temperature;
reading.pressure = data.pressure;
reading.humidity = data.humidity;
return reading;
}
BME280::bme280_reading BME280::read() {
bme280_reading reading;
bme280_data data;
reading.status = bme280_get_sensor_data(BME280_ALL, &data, &device) == BME280_OK;
reading.temperature = data.temperature;
reading.pressure = data.pressure;
reading.humidity = data.humidity;
return reading;
}
I2C* BME280::get_i2c() const {
return i2c;
}
int BME280::get_int() const {
return interrupt;
}
}