摘 要
本课题以恩智浦(NXP)FRDM-MCXN236 开发板为控制核心,通过板载 FlexComm5 LPI2C5 总线(对应Arduino 扩展头 P1_16/P1_17)外接 Bosch BME688 四合一环境传感器,实时采集温度、湿度、气压和气体电阻四项数据。软件基于Zephyr 4.4 RTOS,使用上游 bosch,bme680 传感器驱动,通过标准 sensor API 完成采样、补偿计算和数据上报。板载 RGBLED 兼任状态指示:温度正常时绿灯以 1 Hz 闪烁;当温度超过 32 ℃ 阈值时,系统判定为超温异常,立即切换为红灯常亮,直至温度回落至阈值以下后自动恢复绿灯闪烁状态。经测试,系统在100 kHz I²C 总线速率下稳定运行,FLASH 占用 88.9 KB(8.48 %),RAM 占用 18.3 KB(9.32 %),能够满足室内环境监测与异常告警的实时性要求。
1 引言
随着智慧家居、智慧工厂、智慧农业等场景对环境感知要求的不断提高,温湿度与空气质量的一体化采集成为嵌入式系统的常见任务。BoschBME688 是一款集成温度、相对湿度、气压与挥发性有机物(VOC)气体检测的四合一环境传感器,在小封装、低功耗的前提下可输出经过工厂校准的补偿值,广泛应用于HVAC、空气净化器、可穿戴设备等产品中。
在控制器层面,NXP 推出的 MCX N236 系列基于 ARM Cortex-M33 内核,搭配 FRDM 生态开发板(FRDM-MCXN236),为开发者提供了丰富的外设接口(包括多个FlexComm 接口,可灵活配置为 UART、SPI、I²C 等多种通信模式)以及 Arduino 兼容扩展头。结合 Zephyr 实时操作系统及其上游的bosch,bme680 驱动,可在短时间内搭建可量产化的环境监测样机。
本设计以此为切入点,设计并实现一套完整的软硬件方案:硬件上完成 BME688 与 FRDM-MCXN236 的接线,软件上基于Zephyr 4.4 完成设备树、应用工程、传感器调用与LED 状态机,并给出调试过程与最终测试结果。
2 需求分析
2.1 功能需求
(1)通过 I²C 总线与 BME688 通信,周期性采集温度、湿度、气压、气体电阻四项参数。
(2)通过 UART(FlexComm4 LPUART4,115200 bps)将测量数据实时上报到上位机串口。
(3)通过板载 RGB LED 提供状态指示:正常运行 → 绿灯闪烁;超温异常 → 红灯常亮;恢复后 → 自动回到绿灯闪烁。
2.2 性能需求
(1)采样周期 1 s(可在 menuconfig 中修改)。
(2)I²C 速率 100 kHz(Standard Mode),保证与 BME688 兼容。
(3)FLASH 占用 < 10 %、RAM 占用 < 15 %,保留升级空间。
3 总体方案设计
系统总体结构如图 :
BME688 通过 I²C 总线连接到 FRDM-MCXN236 的FlexComm5 模块(Arduino 扩展头 P1_16/P1_17 分别为 SDA/SCL),MCU 通过 Zephyr 的 sensor API 周期性地触发强制测量并获取补偿后数据;与此同时,板载RGB LED(红/绿/蓝三色)在 GPIO 控制下实现状态指示功能。整个系统由 Zephyr 内核统一调度,通过 UART 输出调试信息。
3.1 硬件方案

主控选用 NXP FRDM-MCXN236 开发板(板载 MCX N236 Cortex-M33 MCU,1MB Flash / 192 KB SRAM)。
传感器选用 Bosch BME688,焊接在面包板上,通过杜邦线连接到 Arduino 扩展头P1_16/P1_17。BME688 的 CS 引脚通过 gpio-hog 在系统启动时自动拉高,确保器件进入 I²C 模式。
3.2 软件方案
软件栈采用 Zephyr 4.4 RTOS + MCUXpresso 工具链。在设备树层通过frdm_mcxn236.overlay 挂载 BME688 与 gpio-hog;在 Kconfig 层通过 prj.conf 启用 I2C、SENSOR、SHELL、LOG等子系统;在应用层以单线程主循环方式调用标准 sensor API 完成测量与上报,并使用一个 k_timer 周期任务驱动 LED 闪烁。
4 硬件设计
硬件连接关系如下:
4.1 主控板资源
FRDM-MCXN236 板载资源丰富,包括多路 FlexComm 接口、USB-C 调试口、板载 RGBLED、Arduino 兼容扩展头等。本课题使用到的资源如下表所示。
资源 | 用途 | 引脚 |
FlexComm5 LPI2C5 | I²C 总线接 BME688 | P1_16 (SDA) / P1_17 (SCL) |
FlexComm4 LPUART4 | 调试串口 / shell | (板级已默认) |
GPIO4 P4_19 | 板载绿灯 (led1) | &gpio4 19 |
GPIO4 P4_18 | 板载红灯 (led0) | &gpio4 18 |
GPIO3 P3_14 | BME688 CS (gpio-hog) | &gpio3 14 |
4.2 传感器接线
BME688 引脚 | 信号 | 连接到 (FRDM-MCXN236) | 备注 |
VCC | 电源 | 3.3 V | Arduino 头 3V3 |
GND | 地 | GND | Arduino 头 GND |
SDA | I²C 数据 | P1_16 | FC5_P0_PIO1_16 |
SCL | I²C 时钟 | P1_17 | FC5_P1_PIO1_17 |
SDO | 地址选择 | 3.3 V | 地址 = 0x77 |
CS | 模式选择 | P3_14 | 由 gpio-hog 拉高,选 I²C 模式 |
I²C 地址选择:SDO 接 3.3 V 时地址为 0x77;SDO 接 GND 时为 0x76。本系统使用SDO=3.3 V 的典型接线,对应 overlay 中的 reg = <0x77>。
4.3 板载 RGB LED 电路分析
板载 RGB LED 型号为 MHPA2525RGBDT-S,采用共阳接法:三色 LED 的公共阳极经限流电阻R166 接到 VDD_BOARD;三个阴极分别经 680 Ω (红) / 470 Ω (绿) / 470 Ω (蓝) 限流电阻接至 MCU 引脚 P4_18/ P4_19 / P4_17。因此 MCU 引脚拉低时 LED 点亮、拉高时熄灭,即 ACTIVE_LOW 极性,与板级设备树中的GPIO_ACTIVE_LOW 标记一致。
5 软件设计
5.1 软件架构
软件整体由三层组成:
① 设备树层(frdm_mcxn236.overlay)—— 声明 BME688 与gpio-hog;② 配置层(Kconfig + prj.conf)—— 启用 I²C、SENSOR、SHELL、LOG 子系统;③ 应用层(src/main.c)——sensor API 采样、串口上报、LED 状态机。
5.2 设备树设计
在 frdm_mcxn236.overlay 中通过 &flexcomm5_lpi2c5 节点添加BME688:
&flexcomm5_lpi2c5{ status = "okay"; pinctrl-0 =<&pinmux_flexcomm5_lpi2c>; pinctrl-names = "default"; clock-frequency =<I2C_BITRATE_STANDARD>; bme688: bme688@77 { compatible ="bosch,bme680"; reg = <0x77>; label = "BME688"; };};&gpio3 { status = "okay"; bme688_cs_hog: bme688-cs-hog { gpio-hog; gpios = <14GPIO_ACTIVE_HIGH>; output-high; line-name = "BME688CS"; };};&flexcomm5_lpi2c5 {
status = "okay";
pinctrl-0 = <&pinmux_flexcomm5_lpi2c>;
pinctrl-names = "default";
clock-frequency = <I2C_BITRATE_STANDARD>;
bme688: bme688@77 {
compatible = "bosch,bme680";
reg = <0x77>;
label = "BME688";
};
};
&gpio3 {
status = "okay";
bme688_cs_hog: bme688-cs-hog {
gpio-hog;
gpios = <14 GPIO_ACTIVE_HIGH>;
output-high;
line-name = "BME688 CS";
};
};
Zephyr 4.x 已不再识别工程根目录下的 app.overlay,overlay 文件名必须与当前BOARD 一致,因此本工程命名为 frdm_mcxn236.overlay。
5.3 Kconfig 与 prj.conf
Kconfig 新增 3 项用户可调参数:
config BME688_MEASUREMENT_PERIOD_MS
int "Period between two forced-mode BME688 measurements (ms)"
default 1000
config BME688_OVERTEMP_THRESHOLD_C
int "Over-temperature threshold (degrees Celsius)"
default 32
config BME688_LED_BLINK_PERIOD_MS
int "Green LED blink period (ms; one full on/off cycle)"
default 1000
help "1000 ms = 1 Hz blink, 500 ms on / 500 ms off."
prj.conf 启用关键子系统:
CONFIG_I2C=y
CONFIG_SENSOR=y
CONFIG_SENSOR_SHELL=y
CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_SERIAL=y
CONFIG_LOG=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_GPIO=y
CONFIG_GPIO_HOGS=y
CONFIG_BME688_MEASUREMENT_PERIOD_MS=1000
CONFIG_BME688_OVERTEMP_THRESHOLD_C=32
CONFIG_BME688_LED_BLINK_PERIOD_MS=1000
5.4 应用层主循环
static const struct device *const bme688 = DEVICE_DT_GET(BME688_NODE);
int main(void)
{
if (!device_is_ready(bme688)) { return -ENODEV; }
while (1) {
sensor_sample_fetch(bme688);
process_sample(bme688); /* 读 T/P/H/Gas 并打印 */
k_sleep(K_MSEC(CONFIG_BME688_MEASUREMENT_PERIOD_MS));
}
}
5.5 LED 状态机
为避免测量循环阻塞 LED 闪烁,闪烁节拍由独立 k_timer 驱动,周期为BME688_LED_BLINK_PERIOD_MS(半周期翻转一次,因此 1 Hz 闪烁实际定时器周期为 500 ms)。超温标志 overtemp 在process_sample 末尾根据最新温度与阈值对比更新。
static void led_timer_expired(struct k_timer *timer)
{
if (overtemp) {
gpio_pin_set_dt(&led_green, 0); /* off (ACTIVE_LOW) */
gpio_pin_set_dt(&led_red, 1); /* ON (ACTIVE_LOW) */
return;
}
static bool green_phase = false;
green_phase = !green_phase;
gpio_pin_set_dt(&led_green, green_phase ? 1 : 0);
gpio_pin_set_dt(&led_red, 0);
}
6 系统测试
这里实际上包括了动态报警效果和串口输出效果,动态效果建议去视频中观看,下面数串口输出效果:
7 总结
本项目完成了基于 FRDM-MCXN236 与 BME688 的环境监测与异常告警系统的软硬件设计与实现。系统能够稳定采集温度、湿度、气压与气体电阻四类参数,并通过板载RGB LED 提供可视化的状态指示:绿灯闪烁表示工作正常,红灯常亮表示超温异常。在 Zephyr 4.4 平台上通过标准 sensor API 完成了数据采集与补偿,无需直接操作寄存器;通过设备树overlay 与 gpio-hog 完成了硬件抽象,具备良好的可移植性与可扩展性。