work on bme280 drivers, the name of files was corrected

pull/2/head
Mateusz Lubecki 2020-06-24 00:17:59 +02:00
rodzic b47a25a821
commit 9b58d3ad2a
8 zmienionych plików z 263 dodań i 92 usunięć

Wyświetl plik

@ -6,7 +6,7 @@
C_SRCS += \
../system/src/drivers/_dht22.c \
../system/src/drivers/analog_anemometer.c \
../system/src/drivers/bma150.c \
../system/src/drivers/bme280.c \
../system/src/drivers/dallas.c \
../system/src/drivers/dma_helper_functions.c \
../system/src/drivers/gpio_conf.c \
@ -19,7 +19,7 @@ C_SRCS += \
OBJS += \
./system/src/drivers/_dht22.o \
./system/src/drivers/analog_anemometer.o \
./system/src/drivers/bma150.o \
./system/src/drivers/bme280.o \
./system/src/drivers/dallas.o \
./system/src/drivers/dma_helper_functions.o \
./system/src/drivers/gpio_conf.o \
@ -32,7 +32,7 @@ OBJS += \
C_DEPS += \
./system/src/drivers/_dht22.d \
./system/src/drivers/analog_anemometer.d \
./system/src/drivers/bma150.d \
./system/src/drivers/bme280.d \
./system/src/drivers/dallas.d \
./system/src/drivers/dma_helper_functions.d \
./system/src/drivers/gpio_conf.d \

Wyświetl plik

@ -8,7 +8,7 @@
#include "drivers/_dht22.h"
#include "drivers/dallas.h"
#include "drivers/ms5611.h"
#include "drivers/bma150.h"
#include "drivers/bme280.h"
#include "../umb_master/umb_master.h"
#include "../umb_master/umb_qf_t.h"
@ -51,7 +51,7 @@ extern dht22Values rte_wx_dht, rte_wx_dht_valid;
extern dallas_qf_t rte_wx_current_dallas_qf, rte_wx_error_dallas_qf;
extern dallas_average_t rte_wx_dallas_average;
extern ms5611_qf_t rte_wx_ms5611_qf;
extern bma150_qf_t rte_wx_bma150_qf;
extern bme280_qf_t rte_wx_bma150_qf;
#ifdef _UMB_MASTER

Wyświetl plik

@ -48,7 +48,7 @@
#endif
#ifdef _SENSOR_BMA150
#include "drivers/bma150.h"
#include <drivers/bme280.h>
#endif
#ifdef _UMB_MASTER
@ -378,9 +378,9 @@ int main(int argc, char* argv[]){
#endif
#if (defined _METEO && defined _SENSOR_BMA150)
bma150_reset(&rte_wx_bma150_qf);
bma150_setup();
bma150_read_calibration(&bma150_data_buffer, &rte_wx_bma150_qf);
bme280_reset(&rte_wx_bma150_qf);
bme280_setup();
bme280_read_calibration(bme280_calibration_data, &rte_wx_bma150_qf);
#endif
// preparing initial beacon which will be sent to host PC using KISS protocol via UART

Wyświetl plik

@ -37,7 +37,7 @@ dht22Values rte_wx_dht, rte_wx_dht_valid; // quality factor inside this structu
dallas_qf_t rte_wx_current_dallas_qf, rte_wx_error_dallas_qf = DALLAS_QF_UNKNOWN;
dallas_average_t rte_wx_dallas_average;
ms5611_qf_t rte_wx_ms5611_qf;
bma150_qf_t rte_wx_bma150_qf;
bme280_qf_t rte_wx_bma150_qf;
#ifdef _UMB_MASTER
umb_frame_t rte_wx_umb;

Wyświetl plik

@ -54,18 +54,18 @@ void wx_get_all_measurements(void) {
#if (defined _METEO && defined _SENSOR_BMA150)
// reading raw values
return_value = bma150_read_raw_data(bma150_data_buffer, &rte_wx_bma150_qf);
return_value = bme280_read_raw_data(bme280_data_buffer, &rte_wx_bma150_qf);
if (return_value == BMA150_OK) {
// converting raw values to humidity
bma150_get_humidity(&rte_wx_humidity, bma150_data_buffer);
if (return_value == BME280_OK) {
// converting raw values to temperature
bma150_get_temperature(&rte_wx_temperature_ms_valid, bma150_data_buffer);
bme280_get_temperature(&rte_wx_temperature_ms_valid, bme280_get_adc_t());
// converting raw values to pressure
bma150_get_pressure(&rte_wx_pressure, bma150_data_buffer);
bme280_get_pressure(&rte_wx_pressure, bme280_get_adc_p());
// converting raw values to humidity
bme280_get_humidity(&rte_wx_humidity, bme280_get_adc_h());
{
// add the current pressure into buffer

Wyświetl plik

@ -1,38 +0,0 @@
/*
* bma150.h
*
* Created on: 21.06.2020
* Author: mateusz
*/
#ifndef INCLUDE_DRIVERS_BMA150_H_
#define INCLUDE_DRIVERS_BMA150_H_
#include "stdint.h"
#define BMA150_OK 0
#define BMA150_SENSOR_NOT_RESPONDING -1
#define BMA150_SENSOR_NOT_AVALIABLE -2
#define BMA150_LN_CALIBRATION 41
#define BMA150_LN_RAW_DATA 8
typedef enum bma150_qf {
BMA150_QF_FULL,
BMA150_QF_NOT_AVAILABLE
}bma150_qf_t;
extern uint8_t bma150_data_buffer[BMA150_LN_CALIBRATION + 1];
extern uint8_t bma150_calibration_data[BMA150_LN_RAW_DATA + 1];
int32_t bma150_reset(bma150_qf_t* qf);
int32_t bma150_setup(void);
int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf);
int32_t bma150_read_raw_data(uint8_t* raw_data, bma150_qf_t* qf);
int32_t bma150_get_pressure(float* out, uint8_t* raw_data);
int32_t bma150_get_temperature(float* out, uint8_t* raw_data);
int32_t bma150_get_humidity(int8_t* out, uint8_t* raw_data);
#endif /* INCLUDE_DRIVERS_BMA150_H_ */

Wyświetl plik

@ -0,0 +1,149 @@
/*
* bma150.h
*
* Created on: 21.06.2020
* Author: mateusz
*/
#ifndef INCLUDE_DRIVERS_BME280_H_
#define INCLUDE_DRIVERS_BME280_H_
#include "stdint.h"
#define BME280_OK 0
#define BME280_SENSOR_NOT_RESPONDING -1
#define BME280_SENSOR_NOT_AVALIABLE -2
#define BME280_LN_CALIBRATION 41
#define BME280_LN_RAW_DATA 8
typedef enum bme280_qf {
BMA150_QF_FULL,
BMA150_QF_NOT_AVAILABLE
}bme280_qf_t;
extern uint8_t bme280_data_buffer[BME280_LN_RAW_DATA + 1];
extern uint8_t bme280_calibration_data[BME280_LN_CALIBRATION + 1];
int32_t bme280_reset(bme280_qf_t* qf);
int32_t bme280_setup(void);
int32_t bme280_read_calibration(uint8_t* calibration, bme280_qf_t* qf);
int32_t bme280_read_raw_data(uint8_t* raw_data, bme280_qf_t* qf);
int32_t bme280_get_pressure(float* out, uint32_t raw_data);
int32_t bme280_get_temperature(float* out, uint32_t raw_data);
int32_t bme280_get_humidity(int8_t* out, uint16_t raw_data);
//#define BME280_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
inline uint32_t bme280_get_adc_t(void) {
return (bme280_data_buffer[3] << 12) | (bme280_data_buffer[4] << 4) | (bme280_data_buffer[5] >> 4);
}
inline uint32_t bme280_get_adc_p(void) {
return (bme280_data_buffer[0] << 12) | (bme280_data_buffer[1] << 4) | (bme280_data_buffer[2] >> 4);
}
inline uint16_t bme280_get_adc_h(void) {
return (bme280_data_buffer[6] << 8) | (bme280_data_buffer[7] );
}
inline uint16_t bme280_get_dig_T1(void) {
return ((uint16_t)bme280_calibration_data[0] | (uint16_t)bme280_calibration_data[1] << 8);
}
inline int16_t bme280_get_dig_T2(void) {
return (uint16_t)bme280_calibration_data[2] | (uint16_t)bme280_calibration_data[3] << 8;
}
inline int16_t bme280_get_dig_T3(void) {
return (uint16_t)bme280_calibration_data[4] | (uint16_t)bme280_calibration_data[5] << 8;
}
inline uint16_t bme280_get_dig_P1(void) {
return ((uint16_t)bme280_calibration_data[6] | (uint16_t)bme280_calibration_data[7] << 8);
}
inline int16_t bme280_get_dig_P2(void) {
return ((uint16_t)bme280_calibration_data[8] | (uint16_t)bme280_calibration_data[9] << 8);
}
inline int16_t bme280_get_dig_P3(void) {
return ((uint16_t)bme280_calibration_data[10] | (uint16_t)bme280_calibration_data[11] << 8);
}
inline int16_t bme280_get_dig_P4(void) {
return ((uint16_t)bme280_calibration_data[12] | (uint16_t)bme280_calibration_data[13] << 8);
}
inline int16_t bme280_get_dig_P5(void) {
return ((uint16_t)bme280_calibration_data[14] | (uint16_t)bme280_calibration_data[15] << 8);
}
inline int16_t bme280_get_dig_P6(void) {
return ((uint16_t)bme280_calibration_data[16] | (uint16_t)bme280_calibration_data[17] << 8);
}
inline int16_t bme280_get_dig_P7(void) {
return ((uint16_t)bme280_calibration_data[18] | (uint16_t)bme280_calibration_data[19] << 8);
}
inline int16_t bme280_get_dig_P8(void) {
return ((uint16_t)bme280_calibration_data[20] | (uint16_t)bme280_calibration_data[21] << 8);
}
inline int16_t bme280_get_dig_P9(void) {
return ((uint16_t)bme280_calibration_data[22] | (uint16_t)bme280_calibration_data[23] << 8);
}
inline uint8_t bme280_get_dig_H1(void) {
return bme280_calibration_data[25];
}
inline int16_t bme280_get_dig_H2(void) { //
return ((uint16_t)bme280_calibration_data[26] | (uint16_t)bme280_calibration_data[27] << 8);
}
inline uint8_t bme280_get_dig_H3(void) {
return bme280_calibration_data[28];
}
inline int16_t bme280_get_dig_H4(void) {
int16_t dig_h4_lsb;
int16_t dig_h4_msb;
dig_h4_msb = (int16_t)(int8_t)bme280_calibration_data[29] * 16;
dig_h4_lsb = (int16_t)(bme280_calibration_data[30] & 0x0F);
return (dig_h4_msb | dig_h4_lsb);
}
inline int16_t bme280_get_dig_H5(void) {
int16_t dig_h5_lsb;
int16_t dig_h5_msb;
dig_h5_msb = (int16_t)(int8_t)bme280_calibration_data[31] * 16;
dig_h5_lsb = (int16_t)(bme280_calibration_data[30] >> 4);
return (dig_h5_msb | dig_h5_lsb);
}
inline int8_t bme280_get_dig_H6(void) {
return bme280_calibration_data[32];
}
#endif /* INCLUDE_DRIVERS_BME280_H_ */

Wyświetl plik

@ -6,7 +6,7 @@
*/
#include "../drivers/bma150.h"
#include <drivers/bme280.h>
#include "../drivers/i2c.h"
#include <string.h>
@ -38,17 +38,19 @@
#define CALIB26_ADDR 0xE1
#define CALIB26_READ_LN 0x10
uint8_t bma150_sensor_avaliable = 0;
uint8_t bme280_sensor_avaliable = 0;
uint8_t bma150_data_buffer[BMA150_LN_CALIBRATION + 1];
uint8_t bma150_calibration_data[BMA150_LN_RAW_DATA + 1];
uint8_t bme280_data_buffer[BME280_LN_RAW_DATA + 1];
uint8_t bme280_calibration_data[BME280_LN_CALIBRATION + 1];
int32_t t_fine = 0;
/**
* This function resets the BMA150 sensor to initial state. After it is called
* the sensor must be reconfigured once again.
*/
int32_t bma150_reset(bma150_qf_t* qf) {
int32_t out = BMA150_OK;
int32_t bme280_reset(bme280_qf_t* qf) {
int32_t out = BME280_OK;
// i2c transmit buffer
uint8_t tx_buf[] = {RESET_ADDR, RESET_MAGIC_WORD, 0};
@ -62,7 +64,7 @@ int32_t bma150_reset(bma150_qf_t* qf) {
// If reset was successfull enable a driver
if (i2c_state == I2C_IDLE) {
// Enable sensor comms
bma150_sensor_avaliable = 1;
bme280_sensor_avaliable = 1;
// wait for sensor reset
delay_fixed(50);
@ -74,22 +76,22 @@ int32_t bma150_reset(bma150_qf_t* qf) {
// Return with keeping 'ms5611_sensor_abaliable' set to zero which will
// disable comms
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
return out;
}
int32_t bma150_setup(void) {
int32_t out = BMA150_OK;
int32_t bme280_setup(void) {
int32_t out = BME280_OK;
// local variables to represent the data wrote to configuration registers
uint8_t ctrl_meas = 0;
uint8_t ctrl_hum = 0;
uint8_t config = 0;
if (bma150_sensor_avaliable == 0) {
return BMA150_SENSOR_NOT_AVALIABLE;
if (bme280_sensor_avaliable == 0) {
return BME280_SENSOR_NOT_AVALIABLE;
}
// setting humidity measurement configutation
@ -115,17 +117,17 @@ int32_t bma150_setup(void) {
;
}
else {
out = BMA150_SENSOR_NOT_RESPONDING;
out = BME280_SENSOR_NOT_RESPONDING;
}
return out;
}
int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
int32_t out = BMA150_OK;
int32_t bme280_read_calibration(uint8_t* calibration, bme280_qf_t* qf) {
int32_t out = BME280_OK;
if (bma150_sensor_avaliable == 0) {
return BMA150_SENSOR_NOT_AVALIABLE;
if (bme280_sensor_avaliable == 0) {
return BME280_SENSOR_NOT_AVALIABLE;
}
// transmit buffer
@ -144,11 +146,11 @@ int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// clearing receive buffer
memset(calibration, 0x00, BMA150_LN_CALIBRATION);
memset(calibration, 0x00, BME280_LN_CALIBRATION);
// reading first segment of calibration data
i2c_receive_data(RX_ADDR, CALIB00_READ_LN);
@ -163,7 +165,7 @@ int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// copying read data
@ -185,7 +187,7 @@ int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// reading second segment of calibration data
@ -201,7 +203,7 @@ int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// copying read data
@ -210,11 +212,11 @@ int32_t bma150_read_calibration(uint8_t* calibration, bma150_qf_t* qf) {
return out;
}
int32_t bma150_read_raw_data(uint8_t* raw_data, bma150_qf_t* qf) {
int32_t out = BMA150_OK;
int32_t bme280_read_raw_data(uint8_t* raw_data, bme280_qf_t* qf) {
int32_t out = BME280_OK;
if (bma150_sensor_avaliable == 0) {
return BMA150_SENSOR_NOT_AVALIABLE;
if (bme280_sensor_avaliable == 0) {
return BME280_SENSOR_NOT_AVALIABLE;
}
// transmit buffer
@ -233,14 +235,14 @@ int32_t bma150_read_raw_data(uint8_t* raw_data, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// clearing receive buffer
memset(raw_data, 0x00, BMA150_LN_RAW_DATA);
memset(raw_data, 0x00, BME280_LN_RAW_DATA);
// reading first segment of calibration data
i2c_receive_data(RX_ADDR, VALUES_LN);
i2c_receive_data(RX_ADDR, BME280_LN_RAW_DATA);
// Wait until receiving will finish or fail (due to timeout or any other error)
while (i2c_state != I2C_IDLE && i2c_state != I2C_ERROR);
@ -252,29 +254,87 @@ int32_t bma150_read_raw_data(uint8_t* raw_data, bma150_qf_t* qf) {
else {
*qf = BMA150_QF_NOT_AVAILABLE;
return BMA150_SENSOR_NOT_RESPONDING;
return BME280_SENSOR_NOT_RESPONDING;
}
// copying read data
memcpy(raw_data, (uint8_t*)i2c_rx_data, VALUES_LN);
memcpy(raw_data, (uint8_t*)i2c_rx_data, BME280_LN_RAW_DATA);
return out;
}
int32_t bma150_get_pressure(float* out, uint8_t* raw_data) {
int32_t ret = BMA150_OK;
int32_t bme280_get_pressure(float* out, uint32_t raw_data) {
int32_t ret = BME280_OK;
int32_t var1, var2;
uint32_t p;
uint32_t adc_P = raw_data;
var1 = (((int32_t)t_fine)>>1) - (int32_t)64000;
var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)bme280_get_dig_P6());
var2 = var2 + ((var1*((int32_t)bme280_get_dig_P5()))<<1);
var2 = (var2>>2)+(((int32_t)bme280_get_dig_P4())<<16);
var1 = (((bme280_get_dig_P3() * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)bme280_get_dig_P2()) * var1)>>1))>>18;
var1 =((((32768+var1))*((int32_t)bme280_get_dig_P1()))>>15);
if (var1 == 0)
{
return 0; // avoid exception caused by division by zero
}
p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;
if (p < 0x80000000)
{
p = (p << 1) / ((uint32_t)var1);
}
else
{
p = (p / (uint32_t)var1) * 2;
}
var1 = (((int32_t)bme280_get_dig_P9()) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;
var2 = (((int32_t)(p>>2)) * ((int32_t)bme280_get_dig_P8()))>>13;
p = (uint32_t)((int32_t)p + ((var1 + var2 + bme280_get_dig_P7()) >> 4));
*out = p / 100.0f;
return ret;
}
int32_t bma150_get_temperature(float* out, uint8_t* raw_data) {
int32_t ret = BMA150_OK;
int32_t bme280_get_temperature(float* out, uint32_t raw_data) {
int32_t ret = BME280_OK;
uint32_t adc_T = raw_data;
int32_t var1, var2, T;
var1 = (((( adc_T >> 3 ) - ((int32_t)bme280_get_dig_T1() << 1))) * ((int32_t)bme280_get_dig_T2())) >> 11;
var2 = (((((adc_T >> 4 ) - ((int32_t)bme280_get_dig_T1())) * ((adc_T>>4) - ((int32_t)bme280_get_dig_T1()))) >> 12) * ((int32_t)bme280_get_dig_T3())) >> 14;
t_fine = var1 + var2;
T = (t_fine * 5 + 128) >> 8;
*out = (T / 100.0f);
return ret;
}
int32_t bma150_get_humidity(int8_t* out, uint8_t* raw_data) {
int32_t ret = BMA150_OK;
int32_t bme280_get_humidity(int8_t* out, uint16_t raw_data) {
int32_t ret = BME280_OK;
int32_t v_x1_u32r;
uint32_t val = 0;
int32_t adc_H = raw_data;
v_x1_u32r = (t_fine - ((int32_t)76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t)bme280_get_dig_H4()) << 20) - (((int32_t)bme280_get_dig_H5()) * v_x1_u32r)) +
((int32_t)16384)) >> 15) * (((((((v_x1_u32r * ((int32_t)bme280_get_dig_H6())) >> 10) * (((v_x1_u32r *
((int32_t)bme280_get_dig_H3())) >> 11) + ((int32_t)32768))) >> 10) + ((int32_t)2097152)) *
((int32_t)bme280_get_dig_H2()) + 8192) >> 14));
v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((int32_t)bme280_get_dig_H1())) >> 4));
v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r);
v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r);
val = (uint32_t)(v_x1_u32r>>12);
*out = (val / 1024);
return ret;
}