用STM32F103打造智能护眼台灯:光敏+超声波坐姿监测实战指南
当孩子趴在书桌前写作业时,你是否担心不良坐姿会影响他们的脊椎发育?当室内光线忽明忽暗时,你是否忧虑不稳定的照明会损害孩子的视力?现在,只需一块STM32F103开发板和几个常见传感器,就能亲手打造一款会"思考"的智能台灯。这不仅仅是一个照明工具,更是融合了环境感知与行为干预的智能助手。
1. 项目核心设计理念
传统护眼台灯往往只关注光线调节,而忽视了使用姿势这一关键因素。我们设计的智能台灯系统采用双维度监测策略:通过光敏电阻实时感知环境亮度,同时利用超声波模块监测用户头部与台灯的距离。当检测到坐姿不良或光线不适时,系统会通过LED亮度调节和蜂鸣器报警进行双重干预。
选择STM32F103C8T6作为主控芯片主要基于三点考量:
- 性价比突出:ARM Cortex-M3内核,72MHz主频,完全满足实时控制需求
- 丰富外设:内置12位ADC、多个定时器,可直接驱动PWM调光
- 开发生态完善:支持PlatformIO、Keil等多种开发环境,资料丰富
与市面上常见的HC-SR501红外感应方案相比,超声波测距(HC-SR04)具有明显优势:
| 传感器类型 | 检测原理 | 有效距离 | 精度 | 受环境影响 | 成本 |
|---|---|---|---|---|---|
| HC-SR501 | 红外热释电 | 0-7米 | ±10cm | 温度变化 | 约8元 |
| HC-SR04 | 超声波回波检测 | 2-400cm | ±3mm | 空气密度 | 约12元 |
| VL53L0X | 激光TOF | 0-2米 | ±1mm | 环境光 | 约45元 |
特别在坐姿监测场景中,超声波模块能准确测量实际距离而非只是感知存在,这对纠正驼背等不良姿势更为有效。
2. 硬件系统搭建
2.1 核心元件清单
构建这个项目需要以下关键组件:
- 主控制器:STM32F103C8T6最小系统板(蓝色药丸版)
- 环境感知模块:
- 光敏电阻(GL5528)
- 10KΩ精密电阻(分压电路用)
- 距离检测模块:HC-SR04超声波传感器
- 执行机构:
- 5V有源蜂鸣器
- LED灯带(WS2812B可寻址)
- 供电系统:AMS1117-3.3稳压芯片+5V/2A电源适配器
- 辅助工具:3D打印灯罩(可选)
2.2 电路连接详解
核心电路连接遵循以下原则:
// STM32与各模块的引脚对应关系 #define TRIG_PIN PA1 // 超声波触发 #define ECHO_PIN PA2 // 超声波回波 #define BUZZER_PIN PA3 // 蜂鸣器控制 #define LIGHT_SENSOR_PIN PA4 // 光敏分压输入 #define LED_PIN PA6 // PWM调光输出光敏检测电路采用经典分压设计:
VCC(3.3V) → [光敏电阻] → [10KΩ固定电阻] → GND ↓ ADC输入引脚超声波模块的驱动需要注意时序控制。HC-SR04工作时序如下:
- 给TRIG引脚至少10μs的高电平脉冲
- 模块自动发送8个40kHz超声波脉冲
- 通过ECHO引脚高电平持续时间计算距离(每58μs对应1cm)
提示:超声波模块应安装在灯臂前端,朝向使用者头部位置,检测角度建议控制在15°以内以获得最佳指向性。
2.3 3D打印结构设计
为使项目更具实用性,我们设计了模块化灯体结构:
- 灯座部分:容纳控制电路和电源模块
- 可调灯臂:内嵌导线通道,末端固定超声波传感器
- 散射灯罩:采用半透明PLA材料,内置LED灯带
使用FreeCAD设计的STL文件关键参数:
{ "灯罩直径": 120mm, "灯臂长度": 250mm, "安装孔径": M3螺丝规格, "壁厚": 2mm, "填充率": 15% }3. 软件开发环境配置
3.1 PlatformIO环境搭建
告别传统的Keil MDK,我们选择更现代的PlatformIO作为开发环境:
- 安装VSCode扩展
- 创建新项目,选择STM32F103C8平台
- 添加必要库依赖:
libopencm3(硬件抽象层)Adafruit_NeoPixel(WS2812B驱动)
platformio.ini关键配置:
[env:bluepill_f103c8] platform = ststm32 board = bluepill_f103c8 framework = libopencm3 monitor_speed = 1152003.2 核心算法实现
系统采用多任务调度架构,主要功能模块包括:
光线自适应算法
void auto_brightness_control() { uint16_t adc_val = adc_read(LIGHT_SENSOR_PIN); float voltage = adc_val * 3.3 / 4096; float lux = 500 * pow(10, (2.5 - voltage)/0.6); // 转换公式 // 根据照度等级调整PWM占空比 if(lux < 100) pwm_set_duty(90); // 昏暗环境 else if(lux < 300) pwm_set_duty(70); // 正常室内 else if(lux < 500) pwm_set_duty(50); // 明亮环境 else pwm_set_duty(30); // 强光环境 }坐姿监测逻辑
#define MIN_SAFE_DISTANCE 30 // 单位:cm void posture_monitor() { float distance = ultrasonic_measure(); static uint8_t warning_count = 0; if(distance < MIN_SAFE_DISTANCE) { warning_count++; if(warning_count > 3) { // 连续3次检测不合格才触发 buzzer_alert(2); // 2次短鸣 set_led_color(255,0,0); // 红色警示 } } else { warning_count = 0; set_led_color(255,255,240); // 恢复暖白光 } }主控制循环
int main() { hardware_init(); while(1) { static uint32_t last_tick = 0; if(hal_get_tick() - last_tick > 200) { // 每200ms检测一次 auto_brightness_control(); posture_monitor(); last_tick = hal_get_tick(); } handle_uart_cmd(); // 处理调试指令 } }4. 功能优化与扩展
4.1 校准模式实现
为适应不同使用环境,我们增加传感器校准功能:
- 长按按键3秒进入校准模式
- 按照提示依次进行:
- 环境光基准校准(覆盖传感器5秒)
- 标准坐姿距离校准(保持正确姿势按下按键)
- 参数自动保存到Flash
校准数据结构:
typedef struct { uint16_t dark_level; // 全暗环境ADC值 uint16_t bright_level; // 强光环境ADC值 uint16_t std_distance; // 标准坐姿距离 uint8_t checksum; // 校验和 } CalibParams;4.2 无线控制扩展
通过添加ESP-01S WiFi模块,可实现远程监控:
- 实时上传光照和距离数据
- 接收手机APP控制指令
- OTA固件升级功能
AT指令配置示例:
AT+CWMODE=1 // 设置为Station模式 AT+CWJAP="SSID","PASSWORD" // 连接WiFi AT+CIPSTART="TCP","iot.server.com",1883 // 连接MQTT服务器4.3 能耗优化策略
为延长便携使用时的电池续航:
- 动态调整检测频率(无人时降低至1Hz)
- 采用PWM软开关控制电源模块
- 开启STM32低功耗模式
电源管理状态机:
graph TD A[正常模式] -->|无动作超时| B[轻度睡眠] B -->|超声波触发| A B -->|超时30分钟| C[深度睡眠] C -->|按键唤醒| A5. 常见问题解决方案
在实际组装和调试过程中,可能会遇到以下典型问题:
问题1:超声波测距不稳定
- 检查电源滤波(建议增加100μF电容)
- 避免测量表面吸音材料(如绒布)
- 软件端添加中值滤波算法:
#define SAMPLE_SIZE 5 float get_filtered_distance() { static float buf[SAMPLE_SIZE]; // 滑动窗口采样 for(int i=0; i<SAMPLE_SIZE-1; i++) buf[i] = buf[i+1]; buf[SAMPLE_SIZE-1] = ultrasonic_measure(); // 排序找中值 float temp[SAMPLE_SIZE]; memcpy(temp, buf, sizeof(temp)); bubble_sort(temp); // 实现简单的冒泡排序 return temp[SAMPLE_SIZE/2]; }
问题2:PWM调光闪烁
- 确保PWM频率≥200Hz(人眼临界闪烁频率)
- 检查LED驱动电流是否充足
- 在LED两端并联104电容消除毛刺
问题3:光敏响应迟滞
- 修改ADC采样为连续模式
- 增加指数加权移动平均滤波:
float ema_filter(float new_val) { static float filtered = 0; const float alpha = 0.2; // 平滑系数 filtered = alpha * new_val + (1-alpha) * filtered; return filtered; }
经过完整测试,系统各项指标达到预期:
- 距离检测响应时间:<100ms
- 光照适应调整时间:<500ms
- 整机待机功耗:<0.5W
- 最大照明亮度:300lux(距离50cm)
这个项目最让我惊喜的是超声波模块的精准度——在实际测试中,它能可靠地区分孩子是正常阅读还是趴着写字。将3D打印部件与电子控制结合,不仅降低了成本,也让每个成品都能根据个人喜好定制外观。