nordic caf sensor manager 学习

本文使用的硬件如下所示
1、传感器:bme280(环境传感器)
bmi270(六轴传感器)
2、屏幕: ssd1306驱动的1.3寸oled
3、开发板: nordic52840DK
开发环境为windows+vscode开发,使用ncs v3.0.1版本

首先阅读此文章之前先要确保你已经完成了vscode的安装和ncs环境打搭建,如果都搞定了,下面正文开始

我最近在学习了一些nordic的例子后,想要开始学习一些难一点的例子,比如如何将多个传感器组合起来的例子,于是我去看了nordic的nrf_desktop例子,发现对于我来说太难理解了,所以我最终选择了caf_sensor_manager这个例子

这个例子,我们可以使用ncs轻松copy a sample下来,我们烧录到开发板后,发现只会打印两句话,我的传感器数据呢?哦原来要在这里添加打印才会有传感器数据

点击查看代码
static void simulated_work_handler(struct k_work *work)
{
	struct workload *workload = CONTAINER_OF(work, struct workload, work);

	 // 打印聚合后的传感器数据
    for (uint8_t i = 0; i < workload->sample_cnt; i++) {
        printk("Sample %d: ", i);
        for (uint8_t j = 0; j < workload->values_in_sample; j++) {
            struct sensor_value *val = &workload->samples[i * workload->values_in_sample + j];
            LOG_INF("%d.%06d ", val->val1, val->val2);
        }
        LOG_INF("\n");
    }

	/* Simulate processing of received data. */
	k_busy_wait(BUSY_TIME * workload->sample_cnt);
	struct sensor_data_aggregator_release_buffer_event *release_evt =
		new_sensor_data_aggregator_release_buffer_event();
	release_evt->samples = workload->samples;
	release_evt->sensor_descr = workload->sensor_descr;
	atomic_clear_bit(&workload->busy, 0);
	APP_EVENT_SUBMIT(release_evt);
}

简单来说,这个例子就是把传感器分为一个个模块,再通过传感器的整合模块aggregator把它们整合在一起进行处理,然后你可以不用去编写太多的管理代码

了解这个例子后,我们可以开始编写自己的例子了,首先我们需要开始删掉我们不需要的东西,让整个代码更加简洁,因为我用的是52840,所以压根不用考虑多核的情况,最终代码架构如图所示
image

代码链接在这里
https://github.com/lizhaoming634/nordic_zephyr_learn 里面的sensor_oled_demo
然后讲一下我遇到的两个坑吧
1、nordic的52840的 SPI(N), I2C(N)是不能同时使用的,我最终选择了使用I2C0去驱动bmi270, I2C1驱动OLED, SPI2驱动bme280, 然后你不使用的SPI1,SPI0也必须设置status为disabled, 否则会报错
2、bmi270必须先进行初始化,才有正确的数值显示,我刚开始看了下日志怎么全是0,后面想起了之前学习的课程才发现忘记设置初始的参数了

posted @ 2025-07-20 17:30  lizhaoming634  阅读(44)  评论(0)    收藏  举报