mirror of
https://github.com/utkumaden/esp-idf-bmx280
synced 2025-01-23 05:26:33 +01:00
Implement missing functions and document them.
This commit is contained in:
parent
a9902750c2
commit
7468a0322c
97
bmx280.c
97
bmx280.c
@ -381,6 +381,47 @@ esp_err_t bmx280_configure(bmx280_t* bmx280, bmx280_config_t *cfg)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t bmx280_setMode(bmx280_t* bmx280, bmx280_mode_t mode)
|
||||
{
|
||||
uint8_t ctrl_mes;
|
||||
esp_err_t err;
|
||||
|
||||
if ((err = bmx280_read(bmx280, BMX280_REG_MESCTL, &ctrl_mes, 1)) != ESP_OK)
|
||||
return err;
|
||||
|
||||
ctrl_mes = (ctrl_mes & (~3)) | mode;
|
||||
|
||||
return bmx280_write(bmx280, BMX280_REG_MESCTL, &ctrl_mes, 1);
|
||||
}
|
||||
|
||||
esp_err_t bmx280_getMode(bmx280_t* bmx280, bmx280_mode_t* mode)
|
||||
{
|
||||
uint8_t ctrl_mes;
|
||||
esp_err_t err;
|
||||
|
||||
if ((err = bmx280_read(bmx280, BMX280_REG_MESCTL, &ctrl_mes, 1)) != ESP_OK)
|
||||
return err;
|
||||
|
||||
ctrl_mes &= 3;
|
||||
|
||||
switch (ctrl_mes)
|
||||
{
|
||||
default:
|
||||
return ctrl_mes;
|
||||
case (BMX280_MODE_FORCE + 1):
|
||||
return BMX280_MODE_FORCE;
|
||||
}
|
||||
}
|
||||
|
||||
bool bmx280_isSampling(bmx280_t* bmx280)
|
||||
{
|
||||
uint8_t status;
|
||||
if (bmx280_read(bmx280, BMX280_REG_STATUS, &status, 1) == ESP_OK)
|
||||
return (status & (1 << 3)) != 0;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
// HERE BE DRAGONS
|
||||
// This code is revised from the Bosch code within the datasheet of the BME280.
|
||||
// I do not understand it enough to tell you what it does.
|
||||
@ -438,3 +479,59 @@ uint32_t bme280_compensate_H_int32(bmx280_t *bmx280, int32_t adc_H)
|
||||
#endif
|
||||
|
||||
// END OF DRAGONS
|
||||
|
||||
esp_err_t bmx280_readout(bmx280_t *bmx280, int32_t *temperature, uint32_t *pressure, uint32_t *humidity)
|
||||
{
|
||||
if (bmx280 == NULL) return ESP_ERR_INVALID_ARG;
|
||||
if (!bmx280_validate(bmx280)) return ESP_ERR_INVALID_STATE;
|
||||
|
||||
uint8_t buffer[3];
|
||||
esp_err_t error;
|
||||
|
||||
if (temperature)
|
||||
{
|
||||
if ((error = bmx280_read(bmx280, BMX280_REG_TEMP_MSB, buffer, 3)) != ESP_OK)
|
||||
return error;
|
||||
|
||||
*temperature = BME280_compensate_T_int32(bmx280,
|
||||
(buffer[0] << 12) | (buffer[1] << 4) | (buffer[0] >> 4)
|
||||
);
|
||||
}
|
||||
|
||||
if (pressure)
|
||||
{
|
||||
if ((error = bmx280_read(bmx280, BMX280_REG_PRES_MSB, buffer, 3)) != ESP_OK)
|
||||
return error;
|
||||
|
||||
*pressure = BME280_compensate_P_int64(bmx280,
|
||||
(buffer[0] << 12) | (buffer[1] << 4) | (buffer[0] >> 4)
|
||||
);
|
||||
}
|
||||
|
||||
#if !(CONFIG_BMX280_EXPECT_BMP280)
|
||||
#if CONFIG_BMX280_EXPECT_DETECT
|
||||
if (bmx280_isBME(bmx280->chip_id))
|
||||
#elif CONFIG_BMX280_EXPECT_BME280
|
||||
#endif
|
||||
{
|
||||
if (humidity)
|
||||
{
|
||||
if ((error = bmx280_read(bmx280, BMX280_REG_HUMI_MSB, buffer, 2)) != ESP_OK)
|
||||
return error;
|
||||
|
||||
*humidity = bme280_compensate_H_int32(bmx280,
|
||||
(buffer[0] << 8) | buffer[0]
|
||||
);
|
||||
}
|
||||
}
|
||||
#if CONFIG_BMX280_EXPECT_DETECT
|
||||
else if (humidity)
|
||||
*humidity = UINT32_MAX;
|
||||
#endif
|
||||
#else
|
||||
if (humidity)
|
||||
*humidity = UINT32_MAX;
|
||||
#endif
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
@ -42,8 +42,23 @@ esp_err_t bmx280_init(bmx280_t* bmx280);
|
||||
*/
|
||||
esp_err_t bmx280_configure(bmx280_t* bmx280, bmx280_config_t *cfg);
|
||||
|
||||
/**
|
||||
* Set the sensor mode of operation.
|
||||
* @param bmx280 Driver structure.
|
||||
* @param mode The mode to set the sensor to.
|
||||
*/
|
||||
esp_err_t bmx280_setMode(bmx280_t* bmx280, bmx280_mode_t mode);
|
||||
/**
|
||||
* Get the sensor current mode of operation.
|
||||
* @param bmx280 Driver structure.
|
||||
* @param mode Pointer to write current mode to.
|
||||
*/
|
||||
esp_err_t bmx280_getMode(bmx280_t* bmx280, bmx280_mode_t* mode);
|
||||
|
||||
/**
|
||||
* Returns true if sensor is currently sampling environment conditions.
|
||||
* @param bmx280 Driver structure.
|
||||
*/
|
||||
bool bmx280_isSampling(bmx280_t* bmx280);
|
||||
|
||||
/**
|
||||
@ -55,13 +70,29 @@ bool bmx280_isSampling(bmx280_t* bmx280);
|
||||
*/
|
||||
esp_err_t bmx280_readout(bmx280_t *bmx280, int32_t *temperature, uint32_t *pressure, uint32_t *humidity);
|
||||
|
||||
static inline void bmx280_readout2float(bmx280_t *bmx280, int32_t* tin, uint32_t *pin, uint32_t *hin, float *tout, float *pout, float *hout)
|
||||
/**
|
||||
* Convert sensor readout to floating point values.
|
||||
* @param tin Input temperature.
|
||||
* @param pin Input pressure.
|
||||
* @param hin Input humidity.
|
||||
* @param tout Output temperature. (C)
|
||||
* @param pout Output pressure. (Pa)
|
||||
* @param hout Output humidity. (%Rh)
|
||||
*/
|
||||
static inline void bmx280_readout2float(int32_t* tin, uint32_t *pin, uint32_t *hin, float *tout, float *pout, float *hout)
|
||||
{
|
||||
*tout = (float)*tin * 0.1f;
|
||||
*tout = (float)*tin * 0.01f;
|
||||
*pout = (float)*pin * (1.0f/256.0f);
|
||||
*hout = (*hin == UINT32_MAX) ? -1.0f : (float)*hin * (1.0f/1024.0f);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read sensor values as floating point numbers.
|
||||
* @param bmx280 Driver structure.
|
||||
* @param temperature The temperature in C.
|
||||
* @param pressure The pressure in Pa.
|
||||
* @param humidity The humidity in %RH.
|
||||
*/
|
||||
static inline esp_err_t bmx280_readoutFloat(bmx280_t *bmx280, float* temperature, float* pressure, float* humidity)
|
||||
{
|
||||
int32_t t; uint32_t p, h;
|
||||
@ -69,7 +100,7 @@ static inline esp_err_t bmx280_readoutFloat(bmx280_t *bmx280, float* temperature
|
||||
|
||||
if (err == ESP_OK)
|
||||
{
|
||||
bmx280_readout2float(bmx280, &t, &p, &h, temperature, pressure, humidity);
|
||||
bmx280_readout2float(&t, &p, &h, temperature, pressure, humidity);
|
||||
}
|
||||
|
||||
return err;
|
||||
|
@ -57,11 +57,11 @@ typedef enum bmx280_iirf_t {
|
||||
|
||||
typedef enum bmx280_mode_t {
|
||||
/** Sensor does no measurements. */
|
||||
BMX280_MODE_SLEEP,
|
||||
BMX280_MODE_SLEEP = 0,
|
||||
/** Sensor is in a forced measurement cycle. Sleeps after finishing. */
|
||||
BMX280_MODE_FORCE,
|
||||
BMX280_MODE_FORCE = 1,
|
||||
/** Sensor does measurements. Never sleeps. */
|
||||
BMX280_MODE_CYCLE,
|
||||
BMX280_MODE_CYCLE = 3,
|
||||
} bmx280_mode_t;
|
||||
|
||||
typedef struct bmx280_config_t {
|
||||
|
Loading…
Reference in New Issue
Block a user