上传坐垫场景照片
AI 将结合实时压力数据给出精准坐姿建议









FSR402 是 Interlink Electronics 生产的力敏电阻传感器,感应区域约 12.7mm 直径。本系统使用两根长条型 FSR402,纵向放置于坐垫左右两侧。传感器与 10kΩ 电阻构成分压电路,连接 STM32 PA4(左)/PA5(右) ADC 通道。压力越大 → 电阻越小 → ADC 读数越低。闲置时 ADC≈4095,满载时 ADC 可降至数百。左右压力差 >15% 即触发姿势偏移提醒。
ARM Cortex-M3 内核,72MHz 主频,64KB Flash。片上集成 2 路 12-bit ADC(PA4/PA5 扫描模式),每路采样后通过 USART1 (PA9 TX, 115200bps) 输出交替行文本(左值换行、右值换行)。固件使用 Keil MDK 开发,源码位于本地工程目录。
CH340C USB 转 TTL 串口芯片,连接 STM32 PA9(TX)/PA10(RX),115200 bps。配合 Chrome 浏览器内置的 Web Serial API,无需安装任何驱动或软件,浏览器直接读取串口数据并驱动 3D 可视化面板。真正实现"插线即用"。
SWD 接口 (SWCLK/SWDIO/GND/3.3V) 连接 STM32,Keil MDK 一键编译下载。支持断点调试与变量监视。4 根杜邦线即可完成全部连接。
SSD1306 驱动,128×64 分辨率,I2C 接口。本地实时显示左右压力原始值和平衡状态,无需电脑也能查看压力读数。
MB-102 面包板、跳线、杜邦线(母对母)、飞线,用于搭建 FSR402 分压电路与 STM32 的传感器信号采集电路原型。无需焊接,方便快速迭代。
| STM32 引脚 | 连接外设 | 类型 | 说明 |
|---|---|---|---|
| PA4 | FSR402 左侧 (AO) | ADC1_IN4 | 左压力模拟采样,12-bit 分辨率 |
| PA5 | FSR402 右侧 (AO) | ADC1_IN5 | 右压力模拟采样,12-bit 分辨率 |
| PA9 | CH340 RX | USART1_TX | 串口发送交替压力值 (115200bps) |
| PA10 | CH340 TX | USART1_RX | 串口接收 (预留,当前未使用) |
| PA13 | ST-LINK SWDIO | SWD | 程序下载 / 调试数据线 |
| PA14 | ST-LINK SWCLK | SWD | 程序下载 / 调试时钟线 |
| 3.3V | FSR402 VCC (×2) | 电源 | 传感器供电 3.3V |
| GND | FSR402 GND (×2) | 地 | 分压电路共地 |
ADC1 初始化 (12MHz/12bit)
USART1 初始化 (115200/8N1)
PA4/PA5 设为模拟输入
SysTick 1ms 定时器启动
扫描模式读取 PA4→PA5
交替串口发送: 左值\r\n右值\r\n
循环间隔 ~10ms
≈50Hz 等效采样频率
ADC 超时无数据 → 发送 0\r\n0\r\n
串口断开 → 等待 CH340 重连
连续 3 秒无数据 → 看门狗复位
SysTick 毫秒定时器 — 主循环用 SysTick 中断产生 1ms 基准,HAL_GetTick() 提供毫秒级时间戳。ADC 双通道扫描 + 串口发送的完整周期约 10ms,等效 100Hz 采样率。浏览器端每收到一对 L/R 值立即更新 3D 模型和仪表盘。
PA4 (ADC1_IN4) 和 PA5 (ADC1_IN5) 配置为扫描模式,一次触发自动转换两路。12 位分辨率 (0-4095)。FSR402 传感器与 10kΩ 电阻组成分压电路:压力↑ → 电阻↓ → 电压↓ → ADC↓。闲置时 ADC≈4095,满载可降至数百。连续采样 4 次取平均值,滤除电源纹波。
USART1 (PA9 TX, PA10 RX), 115200 bps, 8N1。协议极简:每行一个整数值 + \r\n,左右交替发送。接收端配对两个连续行 = 一组 L/R 帧。浏览器 Web Serial API 逐行解析,无需 JSON 封装,开销为零。
// 串口输出示例 2847 2910 2835 2924 2821 2938 // 浏览器配对: (2847,2910) (2835,2924) (2821,2938) ...
u16 ADC_ReadChannel(u8 channel) { u32 sum = 0; for (int i = 0; i < 4; i++) { // 4次采样取均值 ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 启动转换 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待完成 sum += ADC_GetConversionValue(ADC1); // 读12bit结果 } return (u16)(sum / 4); } u16 ReadLeftPressure(void) { return ADC_ReadChannel(ADC_Channel_4); } // PA4 u16 ReadRightPressure(void) { return ADC_ReadChannel(ADC_Channel_5); } // PA5
int main(void) { System_Init(); // 时钟 72MHz ADC_Init(); UART1_Init(115200); // 外设初始化 u16 left, right; char buf[16]; while (1) { left = ReadLeftPressure(); // PA4 ADC right = ReadRightPressure(); // PA5 ADC // 串口交替发送: 左值\r\n右值\r\n sprintf(buf, "%d\r\n", left); UART1_SendString(buf); sprintf(buf, "%d\r\n", right); UART1_SendString(buf); delay_ms(10); // ~100Hz 采样率 } }
async function readSerialLoop() { const reader = port.readable.getReader(); let buf = '', expected = 'L', curL = 0, curR = 0; while (true) { const { value, done } = await reader.read(); if (done) break; buf += new TextDecoder().decode(value); const lines = buf.split('\n'); buf = lines.pop(); // 保留不完整行 for (const line of lines) { const v = parseInt(line.trim()); if (isNaN(v)) continue; if (expected === 'L') { curL = v; expected = 'R'; } else { curR = v; expected = 'L'; onFrame(curL, curR); } } } }
每个通道连续采样 4 次取平均值,消除电源纹波和随机噪声。等效采样率降为 ~25Hz,人坐姿变化频率 <5Hz,满足奈奎斯特采样定理。
Web Serial API 检测到串口断开后,自动释放端口 (reader.cancel + port.close + port.forget),用户点击按钮即可重新连接,无需刷新页面。
parseInt 解析每行,NaN 值自动跳过。左右配对机制确保 L/R 数据严格对应,避免错位导致平衡度计算失真。
浏览器不支持 Web Serial API 时 (Firefox/Safari),可切到 AI 建议 Tab 直接上传坐姿照片,由千问 VL-Plus 根据图像判断舒适度。
浏览器原生串口通信,零驱动、零安装。替代传统 pyserial + EXE 方案,无需安装任何软件,Chrome 打开网页即用。
3D 坐垫模型实时热力映射 (蓝→绿→黄→红),压力越大颜色越暖、形变越大。OrbitControls 支持旋转/缩放观察。
上传坐姿照片 + 实时压力数据,AI 综合分析场景类型、坐姿偏差、压力分布,给出精准到厘米的坐姿调整建议。
Balance (平衡) + Level (压力) + Stability (稳定) 三因子加权评分,20 帧滑动窗口计算稳定性变异系数。
千问 API Key 仅存于服务端 web_server.py,前端通过 POST /api/analyze 代理调用,密钥永不暴露。
每行一个整数 + 换行符,左右交替发送。零 JSON 开销,STM32 端仅需 sprintf + 串口发送,固件体积 <10KB。
| IDE | Keil MDK v5 (uVision V5.06) |
| 编译器 | ARMCC V5.06 update 5 (build 528) |
| 主控芯片 | STM32F103C8T6 (Cortex-M3, 64KB Flash, 20KB SRAM) |
| 时钟 | HSE 8MHz → PLL 9x → 72MHz |
| 标准库 | STM32F10x Standard Peripheral Library V3.5.0 |
| C 语言标准 | C99 (--c99) |
| MicroLIB | 已启用 (精简 printf/math 库) |
| 工程定义 | STM32F10X_MD, USE_STDPERIPH_DRIVER |
| 启动文件 | startup_stm32f10x_md.s (中等密度) |
| 编程器 | ST-LINK/V2 (SWD 接口) |
| 开发语言 | Python 3.10+ (服务端), JavaScript ES6+ (前端), C99 (固件) |
| 前端框架 | Three.js 0.160 (3D), Chart.js 4.4 (曲线), 原生 JS (无框架) |
| 后端框架 | Flask 3.x + Pillow (图片压缩), 千问 VL-Plus API |