Funpack5-4 - 基于 FRDM-MCXN236 实现多传感器环境数据采集与显示系统
该项目使用了FRDM-MCXN236,实现了多传感器环境数据采集与显示系统的设计,它的主要功能为:四路传感器 I2C 总线自动探测、ST7789 彩屏 7 页面多图表呈现、SW2/SW3 双键翻页与消音、Flash 掉电安全配置与环形日志。
标签
嵌入式系统
Funpack活动
I2C 总线
FRDM-MCXN236
tft屏幕图表
BOBOEMS
更新2026-10-19
10

Funpack5-4 - 基于 FRDM-MCXN236 实现多传感器环境数据采集与显示系统


一、项目介绍

本项目为硬禾学堂 Funpack 第五季第四期 (S5 #4) 任务二——环境数据采集与显示系统,基于恩智浦 (NXP) 全新高性能微控制器开发板 FRDM-MCXN236 进行设计与实物实现,并完成了全部四项扩展功能要求。

MCXN236 搭载主频高达 150 MHz 的 ARM Cortex-M33 双核架构内核(本设计运行主核),内置 1 MB 片上 Flash 与 352 KB SRAM,板载 MCU-Link CMSIS-DAP 调试器与高速外设总线。系统通过单组 LPI2C2 硬件总线连接 4 路环境与姿态传感器:

  • AHT21:高精度环境温度与相对湿度测量;
  • ENS160:室内空气品质监测,实时解算出等效二氧化碳浓度 ()、总挥发性有机物 () 与空气质量等级 ();
  • LTR390:高灵敏度环境光照强度 () 与太阳紫外线指数 ();
  • FXLS8974:板载 12 位三轴线性加速度计,实时感知空间姿态倾角与重力分量 ()。

系统采用高内聚、低耦合的非阻塞前后台超级循环架构,每秒执行一次全参数采集与滤波计算,数据通过三大出口输出:

  1. ST7789 1.14 英寸 IPS 彩色屏幕:经过专属适配的 7 大显示页面(包含多参数平滑趋势折线图、三轴双向中心零位柱状量表与系统状态);
  2. 调试串口 (LPUART4 / VCOM 115200):每秒输出单行实时格式化结构体数据,并提供完备的交互式命令行(CLI);
  3. 板载 RGB 状态指示灯:以特定颜色与闪烁节拍指示运行心跳、传感器预热、硬件故障及阈值报警。

四项扩展功能实现要点:

  • 多传感器与在线热插拔回退:任意传感器掉线只置位自身无效标记,不影响其余物理量采集;后台以 5 秒为周期无损重扫总线,插回后自动在线恢复。
  • 复合数字滤波管道:每个模拟通道先经 中值滤波 (Median-5) 彻底滤除偶然脉冲毛刺,再经 EMA 一阶指数移动平均 平滑高频抖动。
  • 回差防抖报警:阈值越限判定采用双向回差滞环比较与持续时间锁定,杜绝临界值频繁振荡闪烁。
  • 高可靠性掉电安全存储与统计:
  • 系统配置采用 A/B 双扇区轮替追加写入,避免擦写中途掉电损坏;
  • 片上 Flash 划分 6 扇区环形日志缓冲区(最多持久化 1530 条记录),严格遵循 16 字节 Phrase 单次写入约束;
  • Welford 单遍递推算法在线计算均值与标准差,支持通过串口一键导出全量 CSV 历史数据。

二、硬件介绍

2.1 硬件组件清单

部件名称

芯片 / 规格

通信接口

硬件用途与特性

主控开发板

NXP FRDM-MCXN236 (MCXN236VDF)

—

Cortex-M33 @150 MHz,1 MB Flash,板载 MCU-Link 调试器、RGB LED、SW2/SW3 按键

温湿度+气体模块

AHT21 + ENS160 组合小板

LPI2C2 (0x38 / 0x52)

AHT21 测温湿;ENS160 ADD 接地设为 0x52,测 eCO2 / TVOC / AQI

环境光与紫外模块

LTR390-UV-01

LPI2C2 (0x53)

测量可见光强度 (Lux) 与紫外线指数 (UVI)

板载加速度计

FXLS8974CF

LPI2C2 (0x18)

板载三轴重力加速度,实时姿态感知

显示屏幕

ST7789 1.14" 240×135 IPS 彩屏

LPSPI3 + GPIO

硬件 SPI 8 MHz 驱动,7 个独立多功能数据与图表界面

2.2 引脚分配与实际接线表

全部外设统一采用 3.3 V 供电(共地连接):

外设模块引脚

FRDM-MCXN236 引脚

硬件复用定义

物理排针位置

功能说明

传感器 SDA

P4_0

LPI2C2_SDA (ALT2)

J5-6

4 路 I2C 传感器共用数据线

传感器 SCL

P4_1

LPI2C2_SCL (ALT2)

J5-5

4 路 I2C 传感器共用时钟线 (100 kHz)

LCD SCL

P1_1

LPSPI3_SCK (ALT2)

Arduino D13 (J2-12)

硬件 SPI 时钟,配置 8 MHz

LCD SDA

P1_0

LPSPI3_SDO (ALT2)

Arduino D11 (J2-8)

硬件 SPI 主机输出 (MOSI)

LCD RES

P1_2

GPIO1_2 (ALT0 + 上拉)

Arduino D12 (J2-10)

复位引脚(标准 Active-Low,空闲高电平)

LCD DC

P1_3

GPIO1_3 (ALT0)

Arduino D10 (J2-6)

数据 / 命令选择(高数据,低命令)

LCD CS

P3_14

GPIO3_14 (ALT0)

Arduino D9 (J2-4)

软件片选控制(低电平选通)

LCD BLK

P0_23

GPIO0_23 (ALT0 强驱动)

Arduino D8 (J2-2)

背光使能控制(高电平点亮)

调试串口 TX/RX

P1_9 / P1_8

LPUART4 (ALT2)

板载 MCU-Link

USB-C 虚拟串口 (115200 8-N-1)

RGB LED

P4_18/19/17

GPIO4 (ALT0)

板载 LED

红 / 绿 / 蓝 低电平驱动

板载按键

P0_20 / P0_6

GPIO0 (ALT0 + IBE)

板载 SW2 / SW3

内部上拉输入


三、方案框图与设计思路

3.1 硬件架构框图

硬件拓扑围绕 MCXN236 的高集成度总线外设展开,包含四路 I2C 传感器并联小总线、8 MHz 高速 SPI 显示链路、片上持久化存储以及 USB-C 调试链路。

3.2 软件架构与设计思路

系统秉持“高内聚、易测试、零阻塞”原则开发:

  1. 非阻塞时间片调度:AHT21 转换需 80 ms,LTR390 测光需 100 ms。若采用阻塞延时,屏幕与串口响应将严重卡顿。因此驱动层全部拆分为“发起触发 状态机延时等待 异步取回数据”非阻塞推进模式,由主循环通过 SysTick 时间戳协同分发。
  2. 纯 C 逻辑与平台抽象分层:
  • app/ 目录:包含滤波、统计、阈值报警、存储序列化、UI 渲染、按键消抖等核心纯 C 代码,不依赖任何特定芯片库,支持在 PC 端通过 GCC 编译运行全部 289 项单元测试;
  • drivers/ 目录:各外设芯片协议状态机;
  • platform/ 目录:针对 NXP MCUXpresso SDK 的硬件抽象层适配(hal_i2c, hal_lcd_io, hal_flash 等)。
  1. 显示分块增量刷新机制:ST7789 240×135 分辨率全屏 RGB565 缓存高达 64.8 KB,直接开辟会严重挤占 SRAM。系统在 128×64 紧凑位图画布(仅 1 KB)上完成抗锯齿缩放渲染,并采用每次主循环增量发送 16 行(ST7789_ROWS_PER_CHUNK)的流式 SPI 分块传输方案,CPU 占用率低于 5%。

四、调试软件与环境

  • 编译与构建工具链:arm-none-eabi-gcc 14.2 + CMake 3.28 + Ninja,基于 NXP 官方 MCUXpresso SDK 纯净独立构建,无需安装庞大的重型 IDE。
  • 烧录与调试工具:pyOCD(搭配 NXP.MCXN236_DFP 官方器件包)或 NXP LinkServer。
  • 串口与上位机分析:MCU-Link USB 虚拟串口(波特率 115200 8-N-1)。配套提供 Python 工具脚本 6.Tools/host/serial_log.py,支持实时数据绘图与 Flash 历史日志批量导出为 CSV。
  • 自动化仿真与回归套件:位于 6.Tools/sim。内置 Mock Flash 硬件掉电注入引擎与图形边界哨兵保护,在电脑端一键执行全部 289 项用例(-O0 与 -O2 均通过)。

五、软件流程图及关键代码

5.1 软件执行流程图

系统由前后台超级循环驱动,各业务逻辑按严格的时间片解耦轮询:

5.2 核心代码实现

1. 带回差与保持时间的阈值报警算法 (1.Software/app/app_core.c)

有效防止临界扰动引起的状态抖动:

static uint16_t hyst_high(uint16_t prev, uint16_t bit, float v, float hi, float hyst)
{
if ((prev & bit) != 0u) {
return (v > hi - hyst) ? bit : 0u; /* 处于报警态:数值跌落至 (hi - hyst) 以下才恢复 */
}
return (v > hi) ? bit : 0u; /* 处于正常态:数值超过 hi 严格触发报警 */
}

2. 中值-5 + EMA 级联数字滤波算法 (1.Software/app/filter.c)

先通过 5 样本窗口快速选取中位数去除奇异孤立尖峰,再通过指数加权平滑:

float filter_ch_push(filter_ch_t *f, float x)
{
if (!is_finite_f(x)) {
filter_ch_invalid(f);
return f->ema;
}
f->win[f->head] = x;
f->head = (uint8_t)((f->head + 1u) % APP_FILTER_MEDIAN_N);
if (f->count < APP_FILTER_MEDIAN_N) f->count++;

float med = filter_median(f->win, (int)f->count); /* 阶数5中值选取 */
if (!f->ema_init) {
f->ema = med;
f->ema_init = true;
} else {
f->ema += f->alpha * (med - f->ema); /* EMA 一阶惯性平滑 */
}
return f->ema;
}

3. 7 大多参数专属趋势图与三轴姿态量表渲染 (1.Software/app/ui.c)

针对 128×64 点阵精心设计的折线趋势与三轴双向柱状图渲染函数:

static void render_trend_generic(const ui_model_t *m, gfx_canvas_t *c,
const trend_t *tr, const char *title,
const char *unit, int decimals)
{
float ordered[APP_UI_TREND_POINTS];
float vmin, vmax, vavg;
draw_header(c, title, m->filter_on ? "FILT" : "RAW");
int n = trend_ordered(tr, ordered, APP_UI_TREND_POINTS);
trend_stats(tr, &vmin, &vmax, &vavg);

gfx_rect(c, 0, 11, GFX_WIDTH, 36, true);
if (n >= 2) {
gfx_sparkline(c, 1, 12, GFX_WIDTH - 2, 34, ordered, n, vmin, vmax); /* 64点线型图 */
} else {
gfx_text_centered(c, 0, 24, GFX_WIDTH, "COLLECTING...", 1, true);
}
/* 格式化输出 min/max/avg 动态标尺与当前样本数 */
}

六、功能展示与实测验证

6.1 LCD 7 个专属页面规划与视觉呈现

系统支持通过开发板 SW2 按键单击(下一页) 与 SW3 按键单击(上一页) 双向循环切换以下 7 个界面:

  1. Page 0: 综合实时测量卡 (OVERVIEW)
  • 8 大核心环境参数以规整网格形式集中呈现:温度 ()、湿度 ()、光照 ()、气压 ()、 空气等级、 浓度 ()、 () 与紫外线指数 ()。
  • 底栏显示当前样本序号、开机运行时长(精确至十分之一秒以直观体现 10 Hz 界面刷新)以及 Flash 存储状态。

  1. Page 1: 温度专属趋势折线图 (TEMP TREND)
  • 64 点历史温度折线图,右侧动态标注 FILT 滤波状态,底部实时计算并显示最小值、最大值与平均值标尺。

  1. Page 2: 湿度专属趋势折线图 (HUMID TREND)
  • 展现环境相对湿度()变化趋势与极值统计。

  1. Page 3: 光照度专属趋势折线图 (LIGHT TREND)
  • 针对光照强度的大动态范围(0~10000+ Lux)做平滑绘制;手部遮挡光敏器件时,屏幕折线即时产生下降响应。

  1. Page 4: 二氧化碳浓度专属趋势折线图 (CO2 TREND)
  • 室内空气质量核心指标 (,400~2000+ ppm) 的时间累积波形;对传感器呼气可直观观测到平滑上升曲线。

  1. Page 5: 三轴加速度专属双向水平量表 (ACCEL GAUGE)
  • 针对板载 FXLS8974 传感器输出的 X、Y、Z 空间矢量重力加速度(),设计了以中间为 0 点的双向伸缩条形柱状图。手持板卡前后左右倾斜或翻转时,柱状条直观左右伸长与缩短。

  1. Page 6: 系统状态与存储监控 (SYSTEM STATUS)
  • 集中展示各传感器在线健康状态(OK / ERROR / ABSENT)、Flash 记录总数、已写配置版本号及看门狗运行参数。

6.2 串口实测诊断与连续运行日志

实测中上电终端输出完整自检与四路传感器探测结果:

Funpack5-4 FRDM-MCXN236 env monitor  v1.0.0 (ae0873d)
built Oct 11 2026 21:21:40, core 150000000 Hz, reset=SW, dev_id=0x0540006A
sample 1000 ms, UI 100 ms, log period 10 s, filter median-5 + EMA
log: 69 records, boot #12
i2c: 0x18 0x38 0x52 0x53 (4)
sensors found: 4
lcd: ST7789 init ok
> #1 t=1.027s T=28.59 H=30.40 L=402.6 UV=0.00 CO2=421 VOC=33 AQI=1 AX=0 AY=-19 AZ=1013 ALM=0x0000
#2 t=2.027s T=28.58 H=30.42 L=402.9 UV=0.00 CO2=418 VOC=32 AQI=1 AX=-7 AY=0 AZ=1028 ALM=0x0000
#3 t=3.027s T=28.58 H=30.43 L=403.2 UV=0.00 CO2=419 VOC=32 AQI=1 AX=14 AY=-3 AZ=1024 ALM=0x0000

在控制台输入 status 诊断命令,状态显示完备:

uptime 136 s, samples 136, alarm events 0, loop max 19530 us
AHT21 OK @0x38 fail_run=0
ENS160 OK @0x52 fail_run=0
LTR390 OK @0x53 fail_run=0
FXLS8974 OK @0x18 fail_run=0
sensor ok=136 err=0 rescans=27 recovered=0, i2c errors=0
alarm idle flags=0x0000 (NORMAL)
led warmup(cyan), lcd ok page 0 (LIVE), stream 1, uart rx overflow 0
storage ok: 51/1530 records, boot #11, cfg writes 0, corrupt 0
latest: T=28.58 H=30.42 L=402.9 UV=0.00 CO2=418 VOC=32 AQI=1

七、调试难题及关键解决方法

  1. ST7789 屏幕硬件复位引脚 (RES) 电平逻辑与抗干扰锁定
  • 问题现象:实物接线后屏幕不亮,拔出 RES 脚后复位板卡才能点亮,但运行一段时间后容易黑屏。
  • 原因分析:ST7789 芯片的复位脚为标准低电平有效(Active-Low)。拔掉插针时,小板自带的 10kΩ 上拉电阻将其拉到 3.3V 释放了复位,但长飞线悬空极易拾取周围 8 MHz SPI 时钟的电磁偶合噪声,偶尔跌落触发意外复位导致黑屏。
  • 解决措施:将 MCU GPIO1_2 的空闲输出严格配置为高电平(1),并在底层使能了芯片内部弱上拉(kPORT_PullUp)形成双重硬件钳位;同时将 BLK 引脚升级为强驱动模式(kPORT_HighDriveStrength),并在刷屏循环前加入 0x29 (Display On) 硬件保活指令,彻底根除了黑屏隐患。
  1. 长杜邦飞线下的 SPI 高频信号完整性适配
  • 问题现象:在 12 MHz 极限时钟下,杜邦线上的反射与寄生电容导致小概率像素错位。
  • 解决措施:将 LPSPI3 SCK 速率平滑调整为 8 MHz。在 8 MHz 下单帧传输耗时仅约 65 ms,主循环分块发送机制下 CPU 占用微乎其微,但抗干扰能力与信号上升沿质量得到质的提升。
  1. MCXN236 片上 Flash ECC 16 字节 Phrase 单次写入与掉电撕裂防御
  • 解决措施:MCXN 系列 Flash 带有硬件 ECC 校验,同一 Phrase 严禁二次改写。存储引擎将所有日志结构体按 32 字节(2 个 Phrase)严格对齐,配置采用 A/B 双扇区轮替追加序号机制,确保即便在编程写入瞬间断电,上电后也能无损回滚至上一版本有效配置。
  1. 小尺寸屏幕下多参数图表的合理性与排版选择
  • 设计考量:在 128×64 物理有限点阵上,若将离散等级(如 1~5 级的 AQI、0~11 级的 UVI)强行绘制折线图,会出现大量平直死线,信息密度极低;而若将 X/Y/Z 三轴加速度画在同一折线图中,3 条折线交织会严重混淆。因此确立了“连续环境量做平滑趋势折线图、姿态矢量做中心零位双向条形柱状图、离散等级保留在概览卡集中展示”的视觉架构,大幅提升了 UI 表现力。

八、总结与心得体会

通过本次 Funpack 活动对 NXP FRDM-MCXN236 开发板的深入实战,系统地完成了从底层微控制器驱动、复杂 I2C/SPI 总线调度,到上层数字信号滤波与持久化存储系统的完整闭环研发:

  1. 模块化与纯逻辑分层的巨大收益:将滤波、存储与图形逻辑解耦为纯 C 架构并在 PC 侧构建 289 项单元测试,使得所有业务算法在实物调试前就已经被 100% 验证,极大缩减了硬件联调时的试错成本。
  2. 时间片非阻塞调度对用户体验的决定性作用:通过将耗时各异的传感器采集与屏幕大块数据流分解为时间片推进,系统在单片机无操作系统(Bare-metal)环境下实现了顺滑的 10 Hz 界面刷新和即时按键响应。
  3. 恩智浦新一代 MCXN 系列芯片卓越的处理性能(150 MHz Cortex-M33)与丰富灵活的外设(LP_FLEXCOMM)令人印象深刻,为工业物联与边缘智能监测设备提供了极具竞争力的硬件支撑。

附件下载
Funpack_S5_4-2.7z
项目源码
团队介绍
电子开发爱好者
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号