kopia lustrzana https://github.com/pimoroni/pimoroni-pico
				
				
				
			
		
			
				
	
	
		
			86 wiersze
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			86 wiersze
		
	
	
		
			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);
 | |
|         }
 | |
| 
 | |
|         i2c_interface.i2c = i2c;
 | |
|         i2c_interface.address = address;
 | |
| 
 | |
|         device.intf_ptr = &i2c_interface;
 | |
|         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;
 | |
| 
 | |
|         device.settings.filter = filter;
 | |
|         device.settings.standby_time = standby_time;
 | |
|         device.settings.osr_p = os_pressure;
 | |
|         device.settings.osr_t = os_temp;
 | |
|         device.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;
 | |
|     }
 | |
| } |