#include #include #include "bme280.h" #include "bme280_interface.h" /* for debugging */ #include "uart_debug.h" #include #include #include void user_delay_ms(uint32_t period); int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len); int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len); struct bme280_dev deviceStructure; uint32_t req_delay; int8_t Initialize_BME280(void) { int8_t rslt = BME280_OK; uint8_t settings_sel; char debugString[20] = ""; /* Setup the SPI interface */ BME_CSN_DDR |= (1 << BME_CSN_PIN); BME_CSN_PORT |= (1 << BME_CSN_PIN); /* Sensor_0 interface over SPI with native chip select line */ deviceStructure.dev_id = 0; deviceStructure.intf = BME280_SPI_INTF; deviceStructure.read = user_spi_read; deviceStructure.write = user_spi_write; deviceStructure.delay_ms = user_delay_ms; rslt = bme280_init(&deviceStructure); /* Settings for mode of operation: weather monitorint */ deviceStructure.settings.osr_h = BME280_OVERSAMPLING_1X; deviceStructure.settings.osr_p = BME280_OVERSAMPLING_1X; deviceStructure.settings.osr_t = BME280_OVERSAMPLING_1X; deviceStructure.settings.filter = BME280_FILTER_COEFF_OFF; settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL; rslt = bme280_set_sensor_settings(settings_sel, &deviceStructure); /* calculate minimum delay required between consecutive measurments */ req_delay = bme280_cal_meas_delay(&deviceStructure.settings); sprintf(debugString, "req delay: %ld\r\n", req_delay); Print_Debug_String(debugString); return rslt; } /* Get one measurement in forced mode */ void BME280_Get_Measurement(void) { int8_t rslt = BME280_OK; struct bme280_data comp_data; char debugString[30] = ""; rslt = bme280_set_sensor_mode(BME280_FORCED_MODE, &deviceStructure); /* Wait for the measurement to complete and print data @25Hz */ deviceStructure.delay_ms(req_delay); rslt = bme280_get_sensor_data(BME280_ALL, &comp_data, &deviceStructure); sprintf(debugString, "rslt: %d\r\n", rslt); Print_Debug_String(debugString); sprintf(debugString, "temp: %ld\r\n", comp_data.temperature); Print_Debug_String(debugString); sprintf(debugString, "hum: %ld\r\n", comp_data.humidity); Print_Debug_String(debugString); sprintf(debugString, "pres: %ld\r\n", comp_data.pressure); Print_Debug_String(debugString); } /* Implementation of the interface function needed by the BME280 library */ void user_delay_ms(uint32_t period) { while (period--) { _delay_ms(1); } } int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len) { int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */ /* unused parameters */ (void)dev_id; /* SPI routine */ /* TODO pack into spi byte transfer function */ BME_CSN_PORT &= ~(1<