#pragma once #include "hardware/i2c.h" #include "hardware/gpio.h" #include "src/bme280.h" #include "src/bme280_defs.h" #include "stdio.h" #include "common/pimoroni_i2c.hpp" namespace pimoroni { class BME280 { public: static const uint8_t DEFAULT_I2C_ADDRESS = 0x76; static const uint8_t ALTERNATE_I2C_ADDRESS = 0x77; static const uint8_t DEFAULT_INT_PIN = I2C_DEFAULT_INT; struct i2c_intf_ptr { I2C *i2c; int8_t address; }; struct bme280_reading { float temperature; float pressure; float humidity; bool status; }; bool debug = false; bool init(); bool configure(uint8_t filter, uint8_t standby_time, uint8_t os_pressure, uint8_t os_temp, uint8_t os_humidity, uint8_t mode=BME280_NORMAL_MODE); BME280() : BME280(new I2C()) {} BME280(uint8_t address) : BME280(new I2C(), address) {} BME280(I2C *i2c, uint8_t address = DEFAULT_I2C_ADDRESS, uint interrupt = PIN_UNUSED) : i2c(i2c), address(address), interrupt(interrupt) {} // For print access in micropython I2C* get_i2c() const; int get_int() const; bme280_reading read(); BME280::bme280_reading read_forced(); // Bindings for bme280_dev static int8_t write_bytes(uint8_t reg_addr, uint8_t *reg_data, uint16_t length, void *intf_ptr) { BME280::i2c_intf_ptr* i2c = (BME280::i2c_intf_ptr *)intf_ptr; uint8_t buffer[length + 1]; buffer[0] = reg_addr; for(int x = 0; x < length; x++) { buffer[x + 1] = reg_data[x]; } int result = i2c->i2c->write_blocking(i2c->address, buffer, length + 1, false); return result == PICO_ERROR_GENERIC ? BME280_E_COMM_FAIL : BME280_OK; }; static int8_t read_bytes(uint8_t reg_addr, uint8_t *reg_data, uint16_t length, void *intf_ptr) { BME280::i2c_intf_ptr* i2c = (BME280::i2c_intf_ptr *)intf_ptr; int result = i2c->i2c->write_blocking(i2c->address, ®_addr, 1, true); result = i2c->i2c->read_blocking(i2c->address, reg_data, length, false); return result == PICO_ERROR_GENERIC ? BME280_E_COMM_FAIL : BME280_OK; }; static void delay_us(uint32_t period, void *intf_ptr) { sleep_us(period); } private: bme280_dev device; bme280_settings settings; I2C *i2c; // interface pins with our standard defaults where appropriate int8_t address = DEFAULT_I2C_ADDRESS; uint interrupt = DEFAULT_INT_PIN; }; }