基于STM32的多功能视力保护仪系统设计
本文设计了一款基于STM32单片机的智能视力保护仪,通过超声波测距、光照检测和人体感应技术实时监测用眼状态,结合语音提醒和远程监控功能,旨在纠正青少年不良用眼习惯。系统采用模块化设计,集成坐姿监测、环境光调节、用眼计时等功能,并通过Wi-Fi实现家长远程监督。测试表明,该系统能有效改善用眼行为,具有实用价值。未来可升级为AI识别坐姿、光谱分析等技术,进一步提升保护效果。
若该文为原创文章,转载请注明原文出处。
一、引言
(一)研究背景及意义
近年来,我国青少年近视率居高不下,且呈现低龄化、重度化发展趋势,已成为关系国家和民族未来的重大公共卫生问题。除遗传因素外,不良的用眼习惯是导致近视的主要原因,其中过近的用眼距离、不充足的环境光照、过长的连续用眼时间被称为危害视力的“三大杀手”。传统的口头提醒和自律方式效果有限。因此,开发一款集实时监测、智能提醒、数据记录与远程监督于一体的智能视力保护仪迫在眉睫。本项目基于STM32单片机,融合超声波测距、光照检测、人体感应与语音播报技术,并通过物联网实现家长远程监控,旨在从源头纠正不良用眼习惯,培养健康用眼行为,对保护青少年视力健康具有重大的现实意义和社会价值。
(二)国内外研究现状
目前市场上已有一些所谓的“防近视”产品,如简单的坐姿矫正器、定时器等,但功能单一、体验较差且缺乏有效性验证。高端产品多为国外品牌,价格昂贵。现有研究多集中于单一功能的实现,如仅进行距离报警或仅做定时提醒。将坐姿距离监测、环境光强调节、用眼时长管理与云端远程督导通过一个系统有机结合起来,并加入人性化的语音交互,是目前该领域产品创新的主要方向。本研究旨在设计一个高集成度、高可靠性、用户体验好的综合性解决方案,填补市场空白。
二、系统总体设计
(一)系统架构
本系统采用“前端智能感知与执行 + 后端云端协同监督”的架构。
-
感知层:由超声波模块、光敏电阻、红外人体传感器、DS1302时钟芯片构成,精确采集用户的使用状态和环境数据。
-
控制与执行层:STM32作为核心处理器,运行核心逻辑算法;语音播报模块和LED灯作为执行单元,提供声光提醒与反馈。
-
人机交互层:OLED显示屏和按键,用于本地信息展示和参数设置。
-
云协同层:ESP8266模块将数据上传至云平台,使家长可通过手机App远程查看孩子的用眼数据(距离、时长、光照)并设置保护规则,实现异地、异时的协同监督。
(二)功能模块划分
-
坐姿监测模块:超声波模块(HC-SR04)检测人眼与书本/屏幕的距离。
-
光照管理模块:光敏电阻检测环境光照强度,自动控制LED灯补光。
-
计时管理模块:DS1302提供精准计时,实现学习时长统计与休息提醒。
-
人体感应模块:红外传感器(HC-SR501)判断用户是否在位,实现无人时自动暂停计时。
-
语音提醒模块:语音芯片(如SYN6288或JQ8900)播报个性化提醒信息。
-
显示与设置模块:OLED显示屏 + 按键。
-
数据通信模块:ESP8266 Wi-Fi模块。
三、硬件设计与实现
(一)系统硬件框架图
-
STM32F103C8T6 (主控核心)
-
HC-SR04超声波模块:Trig接
PA0
, Echo接PA1
-
光敏电阻:接至
PA2
(ADC_IN2) -
HC-SR501人体红外传感器:输出接
PA3
-
DS1302时钟模块:RST接
PA4
, DAT接PA5
, CLK接PA6
-
语音播报模块 (如SYN6288): RX接
PA9
(USART1_TX) -
OLED (SSD1306) : I2C接口,接
PB6
(SCL),PB7
(SDA) -
按键 x 4:设置、加、减、确认/开关 接至
PB0
,PB1
,PB2
,PB3
-
LED灯 (补光灯):通过MOS管驱动,栅极接
PB4
-
ESP-01S (ESP8266) : 接USART2
PA2
(TX),PA3
(RX)
(二)主控模块选型及介绍
主控芯片选用STM32F103C8T6。其资源分配完美契合本项目需求:
-
定时器:用于产生超声波模块所需的10us以上脉冲(Trig),并测量Echo引脚的高电平时间(用于计算距离)。
-
ADC:用于采集光敏电阻的模拟电压值。
-
多个GPIO:用于连接DS1302(模拟时序)、驱动LED、按键输入和人体传感器。
-
两个UART:一个用于与语音模块通信,另一个用于与ESP8266通信。
-
I2C:用于驱动OLED显示屏。
(三)传感器模块选型及电路设计
-
HC-SR04超声波模块:最常用的测距模块,精度可满足本项目需求。工作时,STM32向Trig引脚发送一个10us的高脉冲,模块自动发送8个40kHz方波,并检测回波。Echo引脚输出高电平的持续时间即为超声波往返时间。
-
光敏电阻:与一个10kΩ定值电阻组成分压电路,输出接STM32的ADC引脚。
-
HC-SR501人体红外传感器:数字输出型,检测到人体移动时输出高电平。直接连接STM32 GPIO。
-
DS1302时钟模块:低功耗时钟芯片,包含实时时钟/日历和31字节静态RAM。采用三线接口(SPI变种)与STM32通信,即使系统主电源掉电,其后备电池也能保证时间持续运行。
(四)通信模块选型及配置
选用ESP-01S模块。配置其连接家庭路由器,并通过MQTT协议与云平台(如OneNET、阿里云)通信,定时上报用眼数据(当前距离、光照、本次学习时长)并接收来自App的指令(如设置学习时间阈值)。
(五)执行模块选型及驱动电路
-
语音播报模块:推荐使用SYN6288(中文语音合成芯片)或JQ8900(MP3语音芯片)。SYN6288可通过串口直接发送文本进行合成播报,灵活度高;JQ8900需要预先录制好语音片段,通过串口指令触发播放,音质更优。两者均通过串口与STM32连接。
-
LED补光灯:选用暖白光LED灯板,通过一个N沟道MOS管(如2N7002)驱动,由STM32的PWM输出控制其亮度,实现无级调光。
(六)显示模块选型及接口电路
选用0.96寸I2C接口的OLED显示屏,用于显示实时时间、当前测量距离、环境光强、本次学习时长、设置菜单等信息。
(七)电源模块设计
系统可采用USB供电(5V)。使用AMS1117-3.3稳压芯片将5V转换为3.3V,为STM32、传感器、OLED、ESP8266等供电。LED补光灯如需更大电流,可考虑单独供电。
四、软件设计与实现
(一)开发环境搭建
-
IDE: Keil uVision5
-
库: STM32HAL库
-
协议: cJSON库用于拼接MQTT数据包。
(二)系统软件流程图
(三)系统初始化(代码片段)
// main.c
#include "ds1302.h"
#include "hc-sr04.h"
#include "ssd1306.h"
#include "syn6288.h"
#include "esp8266_mqtt.h"
TIM_HandleTypeDef htim3; // For ultrasonic and PWM
UART_HandleTypeDef huart1; // For SYN6288
UART_HandleTypeDef huart2; // For ESP8266
I2C_HandleTypeDef hi2c1;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_I2C1_Init();
MX_ADC1_Init();
OLED_Init();
DS1302_Init();
ULTRASONIC_Init(&htim3);
SYN6288_Init();
ESP8266_MQTT_Init();
// Load thresholds from EEPROM
study_time_threshold = ...;
distance_threshold = ...;
light_threshold = ...;
while (1) {
Main_Task();
HAL_Delay(200); // 主循环周期200ms
}
}
(四)传感器数据采集与处理(代码片段)
void Sensor_ReadTask(void) {
// 1. 读取超声波距离
current_distance = ULTRASONIC_GetDistance();
// 2. 读取光照强度 (ADC值 -> 光照强度百分比)
light_value = HAL_ADC_GetValue(&hadc1);
// 3. 读取人体红外传感器
human_present = (HAL_GPIO_ReadPin(PIR_GPIO_Port, PIR_Pin) == GPIO_PIN_SET);
// 4. 读取DS1302时间
DS1302_GetTime(&hour, &minute, &second);
}
(五)控制功能实现(代码片段)
void Control_Task(void) {
static uint32_t study_timer = 0;
static uint32_t last_remind_time = 0;
// 1. 人体在位判断与计时逻辑
if (human_present) {
study_timer += 200; // 主循环周期200ms
}
uint32_t study_minutes = study_timer / 60000; // 转换为分钟
// 2. 坐姿提醒 (实时检测,最高优先级)
if (current_distance < distance_threshold && current_distance > 0) {
if (HAL_GetTick() - last_remind_time > 5000) { // 5秒内只提醒一次
SYN6288_Speak("距离太近,请保持坐姿");
last_remind_time = HAL_GetTick();
}
}
// 3. 光照调节
if (light_value < light_threshold) {
// 使用PWM控制LED亮度,越暗则PWM占空比越大
uint16_t pwm_val = (100 - light_value) * 10; // 映射函数需调整
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_val);
} else {
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); // 关闭LED
}
// 4. 休息提醒
if (study_minutes >= study_time_threshold) {
SYN6288_Speak("学习时间到,请休息一下");
study_timer = 0; // 重置计时器
MQTT_Publish("study_session", study_minutes); // 上报本次学习时长
}
}
(六)远程控制功能实现(代码片段)
// 数据上传函数
void Cloud_UploadTask(void) {
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "distance", current_distance);
cJSON_AddNumberToObject(root, "light", light_value);
cJSON_AddNumberToObject(root, "study_time", study_minutes);
cJSON_AddStringToObject(root, "time", formatted_time_string);
char *json_str = cJSON_Print(root);
ESP8266_MQTT_Publish("vision_protector/data", json_str);
cJSON_Delete(root);
free(json_str);
}
// 指令接收解析
void MQTT_Callback(char* topic, char* payload) {
cJSON *root = cJSON_Parse(payload);
if (root) {
cJSON *cmd = cJSON_GetObjectItem(root, "command");
cJSON *val = cJSON_GetObjectItem(root, "value");
if (cmd && val) {
if (strcmp(cmd->valuestring, "set_study_time") == 0) {
study_time_threshold = val->valueint;
// Save to EEPROM
} else if (strcmp(cmd->valuestring, "set_distance") == 0) {
distance_threshold = val->valueint;
} // ... 其他设置命令
}
cJSON_Delete(root);
}
}
五、系统测试与优化
(一)测试方案
-
功能测试:
-
距离检测:在不同距离(20cm-50cm)晃动物体,测试超声波测量准确性和报警触发。
-
光照调节:用手遮挡光敏电阻,测试LED灯是否平滑点亮。
-
计时功能:设置短时间阈值(如1分钟),测试到时语音提醒。
-
人体感应:测试离开后计时是否暂停。
-
-
用户体验测试:邀请目标用户群体(学生)使用,测试语音提示是否清晰友好,设置流程是否简单直观。
-
通信测试:测试App端数据更新是否及时,远程设置指令是否有效。
(二)测试结果与分析
预计测试结果:核心功能均可实现。测试关键点在于:
-
超声波抗干扰:避免周围物体反射导致测距不准。
-
语音提示体验:提示频率和内容需恰到好处,避免造成厌烦。
-
系统功耗:如果采用电池供电,需优化代码进入休眠模式。
(三)系统优化
-
算法优化:对超声波和光照数据进行滑动平均滤波,减少偶然误差。
-
中断优化:使用定时器输入捕获功能精确测量Echo高电平时间,提高测距精度和可靠性。
-
低功耗优化:在无人状态一段时间后,让STM32和大部分外设进入休眠模式,由人体红外传感器中断唤醒,极大延长电池续航。
-
数据统计:在云平台或App端增加历史数据统计功能,生成用眼习惯报告,帮助家长和孩子更直观地了解情况。
六、结论与展望
(一)未来展望
-
AI坐姿识别:升级为小型摄像头模块,通过轻量级AI模型识别更复杂的坐姿问题(如歪头、斜视),而不仅仅是距离。
-
光谱分析:使用更专业的环境光传感器,监测光线的色温、蓝光强度等指标,提供更科学的用光建议。
-
游戏化激励:在App端引入积分、勋章等游戏化元素,鼓励孩子主动保持良好习惯。
-
多设备联动:与家里的智能台灯、智能窗帘联动,自动创造最适宜的光环境。
如有侵权,或需要完整代码,请及时联系博主。
更多推荐
所有评论(0)