若该文为原创文章,转载请注明原文出处。

一、引言

(一)研究背景及意义

近年来,我国青少年近视率居高不下,且呈现低龄化、重度化发展趋势,已成为关系国家和民族未来的重大公共卫生问题。除遗传因素外,不良的用眼习惯是导致近视的主要原因,其中过近的用眼距离不充足的环境光照过长的连续用眼时间被称为危害视力的“三大杀手”。传统的口头提醒和自律方式效果有限。因此,开发一款集实时监测、智能提醒、数据记录与远程监督于一体的智能视力保护仪迫在眉睫。本项目基于STM32单片机,融合超声波测距、光照检测、人体感应与语音播报技术,并通过物联网实现家长远程监控,旨在从源头纠正不良用眼习惯,培养健康用眼行为,对保护青少年视力健康具有重大的现实意义和社会价值。

(二)国内外研究现状

目前市场上已有一些所谓的“防近视”产品,如简单的坐姿矫正器、定时器等,但功能单一、体验较差且缺乏有效性验证。高端产品多为国外品牌,价格昂贵。现有研究多集中于单一功能的实现,如仅进行距离报警或仅做定时提醒。将坐姿距离监测环境光强调节用眼时长管理云端远程督导通过一个系统有机结合起来,并加入人性化的语音交互,是目前该领域产品创新的主要方向。本研究旨在设计一个高集成度、高可靠性、用户体验好的综合性解决方案,填补市场空白。

二、系统总体设计

(一)系统架构

本系统采用“前端智能感知与执行 + 后端云端协同监督”的架构。

  • 感知层:由超声波模块、光敏电阻、红外人体传感器、DS1302时钟芯片构成,精确采集用户的使用状态和环境数据。

  • 控制与执行层:STM32作为核心处理器,运行核心逻辑算法;语音播报模块和LED灯作为执行单元,提供声光提醒与反馈。

  • 人机交互层:OLED显示屏和按键,用于本地信息展示和参数设置。

  • 云协同层:ESP8266模块将数据上传至云平台,使家长可通过手机App远程查看孩子的用眼数据(距离、时长、光照)并设置保护规则,实现异地、异时的协同监督。

(二)功能模块划分

  1. 坐姿监测模块:超声波模块(HC-SR04)检测人眼与书本/屏幕的距离。

  2. 光照管理模块:光敏电阻检测环境光照强度,自动控制LED灯补光。

  3. 计时管理模块:DS1302提供精准计时,实现学习时长统计与休息提醒。

  4. 人体感应模块:红外传感器(HC-SR501)判断用户是否在位,实现无人时自动暂停计时。

  5. 语音提醒模块:语音芯片(如SYN6288或JQ8900)播报个性化提醒信息。

  6. 显示与设置模块:OLED显示屏 + 按键。

  7. 数据通信模块: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:设置、加、减、确认/开关 接至 PB0PB1PB2PB3

  • LED灯 (补光灯):通过MOS管驱动,栅极接 PB4

  • ESP-01S (ESP8266) : 接USART2 PA2(TX), PA3(RX)

(二)主控模块选型及介绍

主控芯片选用STM32F103C8T6。其资源分配完美契合本项目需求:

  • 定时器:用于产生超声波模块所需的10us以上脉冲(Trig),并测量Echo引脚的高电平时间(用于计算距离)。

  • ADC:用于采集光敏电阻的模拟电压值。

  • 多个GPIO:用于连接DS1302(模拟时序)、驱动LED、按键输入和人体传感器。

  • 两个UART:一个用于与语音模块通信,另一个用于与ESP8266通信。

  • I2C:用于驱动OLED显示屏。

(三)传感器模块选型及电路设计

  1. HC-SR04超声波模块:最常用的测距模块,精度可满足本项目需求。工作时,STM32向Trig引脚发送一个10us的高脉冲,模块自动发送8个40kHz方波,并检测回波。Echo引脚输出高电平的持续时间即为超声波往返时间。

  2. 光敏电阻:与一个10kΩ定值电阻组成分压电路,输出接STM32的ADC引脚。

  3. HC-SR501人体红外传感器:数字输出型,检测到人体移动时输出高电平。直接连接STM32 GPIO。

  4. DS1302时钟模块:低功耗时钟芯片,包含实时时钟/日历和31字节静态RAM。采用三线接口(SPI变种)与STM32通信,即使系统主电源掉电,其后备电池也能保证时间持续运行。

(四)通信模块选型及配置

选用ESP-01S模块。配置其连接家庭路由器,并通过MQTT协议与云平台(如OneNET、阿里云)通信,定时上报用眼数据(当前距离、光照、本次学习时长)并接收来自App的指令(如设置学习时间阈值)。

(五)执行模块选型及驱动电路

  1. 语音播报模块:推荐使用SYN6288(中文语音合成芯片)或JQ8900(MP3语音芯片)。SYN6288可通过串口直接发送文本进行合成播报,灵活度高;JQ8900需要预先录制好语音片段,通过串口指令触发播放,音质更优。两者均通过串口与STM32连接。

  2. 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);
    }
}

五、系统测试与优化

(一)测试方案

  1. 功能测试

    • 距离检测:在不同距离(20cm-50cm)晃动物体,测试超声波测量准确性和报警触发。

    • 光照调节:用手遮挡光敏电阻,测试LED灯是否平滑点亮。

    • 计时功能:设置短时间阈值(如1分钟),测试到时语音提醒。

    • 人体感应:测试离开后计时是否暂停。

  2. 用户体验测试:邀请目标用户群体(学生)使用,测试语音提示是否清晰友好,设置流程是否简单直观。

  3. 通信测试:测试App端数据更新是否及时,远程设置指令是否有效。

(二)测试结果与分析

预计测试结果:核心功能均可实现。测试关键点在于:

  1. 超声波抗干扰:避免周围物体反射导致测距不准。

  2. 语音提示体验:提示频率和内容需恰到好处,避免造成厌烦。

  3. 系统功耗:如果采用电池供电,需优化代码进入休眠模式。

(三)系统优化

  1. 算法优化:对超声波和光照数据进行滑动平均滤波,减少偶然误差。

  2. 中断优化:使用定时器输入捕获功能精确测量Echo高电平时间,提高测距精度和可靠性。

  3. 低功耗优化:在无人状态一段时间后,让STM32和大部分外设进入休眠模式,由人体红外传感器中断唤醒,极大延长电池续航。

  4. 数据统计:在云平台或App端增加历史数据统计功能,生成用眼习惯报告,帮助家长和孩子更直观地了解情况。

六、结论与展望

(一)未来展望

  1. AI坐姿识别:升级为小型摄像头模块,通过轻量级AI模型识别更复杂的坐姿问题(如歪头、斜视),而不仅仅是距离。

  2. 光谱分析:使用更专业的环境光传感器,监测光线的色温、蓝光强度等指标,提供更科学的用光建议。

  3. 游戏化激励:在App端引入积分、勋章等游戏化元素,鼓励孩子主动保持良好习惯。

  4. 多设备联动:与家里的智能台灯、智能窗帘联动,自动创造最适宜的光环境。

如有侵权,或需要完整代码,请及时联系博主。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐