Updates BME280 sample to new async sensor API. Signed-off-by: Lauren Murphy <lauren.murphy@intel.com>
105 lines
2.5 KiB
C
105 lines
2.5 KiB
C
/*
|
|
* Copyright (c) 2012-2014 Wind River Systems, Inc.
|
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/device.h>
|
|
#include <zephyr/devicetree.h>
|
|
#include <zephyr/drivers/sensor.h>
|
|
#include <zephyr/drivers/sensor_data_types.h>
|
|
#include <zephyr/rtio/rtio.h>
|
|
#include <zephyr/dsp/print_format.h>
|
|
|
|
/*
|
|
* Get a device structure from a devicetree node with compatible
|
|
* "bosch,bme280". (If there are multiple, just pick one.)
|
|
*/
|
|
const struct device *const dev = DEVICE_DT_GET_ANY(bosch_bme280);
|
|
|
|
SENSOR_DT_READ_IODEV(iodev, DT_COMPAT_GET_ANY_STATUS_OKAY(bosch_bme280),
|
|
{SENSOR_CHAN_AMBIENT_TEMP, 0},
|
|
{SENSOR_CHAN_HUMIDITY, 0},
|
|
{SENSOR_CHAN_PRESS, 0});
|
|
|
|
RTIO_DEFINE(ctx, 1, 1);
|
|
|
|
static const struct device *check_bme280_device(void)
|
|
{
|
|
if (dev == NULL) {
|
|
/* No such node, or the node does not have status "okay". */
|
|
printk("\nError: no device found.\n");
|
|
return NULL;
|
|
}
|
|
|
|
if (!device_is_ready(dev)) {
|
|
printk("\nError: Device \"%s\" is not ready; "
|
|
"check the driver initialization logs for errors.\n",
|
|
dev->name);
|
|
return NULL;
|
|
}
|
|
|
|
printk("Found device \"%s\", getting sensor data\n", dev->name);
|
|
return dev;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
const struct device *dev = check_bme280_device();
|
|
|
|
if (dev == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
while (1) {
|
|
uint8_t buf[128];
|
|
|
|
int rc = sensor_read(&iodev, &ctx, buf, 128);
|
|
|
|
if (rc != 0) {
|
|
printk("%s: sensor_read() failed: %d\n", dev->name, rc);
|
|
return rc;
|
|
}
|
|
|
|
const struct sensor_decoder_api *decoder;
|
|
|
|
rc = sensor_get_decoder(dev, &decoder);
|
|
|
|
if (rc != 0) {
|
|
printk("%s: sensor_get_decode() failed: %d\n", dev->name, rc);
|
|
return rc;
|
|
}
|
|
|
|
uint32_t temp_fit = 0;
|
|
struct sensor_q31_data temp_data = {0};
|
|
|
|
decoder->decode(buf,
|
|
(struct sensor_chan_spec) {SENSOR_CHAN_AMBIENT_TEMP, 0},
|
|
&temp_fit, 1, &temp_data);
|
|
|
|
uint32_t press_fit = 0;
|
|
struct sensor_q31_data press_data = {0};
|
|
|
|
decoder->decode(buf,
|
|
(struct sensor_chan_spec) {SENSOR_CHAN_PRESS, 0},
|
|
&press_fit, 1, &press_data);
|
|
|
|
uint32_t hum_fit = 0;
|
|
struct sensor_q31_data hum_data = {0};
|
|
|
|
decoder->decode(buf,
|
|
(struct sensor_chan_spec) {SENSOR_CHAN_HUMIDITY, 0},
|
|
&hum_fit, 1, &hum_data);
|
|
|
|
printk("temp: %s%d.%d; press: %s%d.%d; humidity: %s%d.%d\n",
|
|
PRIq_arg(temp_data.readings[0].temperature, 6, temp_data.shift),
|
|
PRIq_arg(press_data.readings[0].pressure, 6, press_data.shift),
|
|
PRIq_arg(hum_data.readings[0].humidity, 6, hum_data.shift));
|
|
|
|
k_sleep(K_MSEC(1000));
|
|
}
|
|
return 0;
|
|
}
|