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

一、项目背景

随着青少年近视率不断攀升,家长对孩子用眼健康的关注度日益提高。传统的台灯只能提供照明功能,无法对用户的坐姿、用眼时长进行监测和提醒。本项目设计了一套集智能照明、坐姿监测、疲劳检测、语音交互和远程控制于一体的智能护眼台灯系统。

系统采用 K210 + STM32 + ESP8266 + OneNet 四核心架构,通过多传感器融合和AI视觉技术,实现对用户用眼行为的全方位监测和智能干预。

二、系统功能

功能模块具体功能核心技术
智能照明自动调光、人来灯亮、人走灯灭光敏传感器+人体红外+PWM
坐姿监测距离检测、坐姿纠正提醒超声波传感器+多级报警
疲劳监测眨眼频率检测、疲劳提醒K210+人脸识别算法
语音交互语音控制、语音播报语音识别模块
远程控制APP远程控制、状态查看ESP8266+OneNet
本地显示时间/温湿度/状态显示OLED显示屏

三、系统架构

系统采用"感知层-控制层-执行层-云平台"四层架构:

text

┌─────────────────────────────────────────────────────────┐
│                    云平台层(OneNet)                    │
│         数据存储 | 远程控制 | 历史记录 | 报警推送         │
└─────────────────────┬───────────────────────────────────┘
                      │ MQTT/HTTP
┌─────────────────────▼───────────────────────────────────┐
│                   通信层(ESP8266)                      │
│              WiFi连接 | 数据上报 | 指令接收               │
└─────────────────────┬───────────────────────────────────┘
                      │ UART串口
┌─────────────────────▼───────────────────────────────────┐
│                 控制层(STM32F103)                      │
│    传感器数据处理 | PWM调光 | 语音交互 | 状态判断         │
└──────┬──────────────┬──────────────┬────────────────────┘
       │              │              │
┌──────▼──────┐ ┌─────▼─────┐ ┌─────▼─────┐
│  感知层      │ │  感知层    │ │  AI视觉层  │
│ 光敏传感器   │ │超声波传感器│ │  K210     │
│人体红外     │ │温湿度传感器│ │ 摄像头     │
└─────────────┘ └───────────┘ └───────────┘

四、硬件器件清单

4.1 核心控制器件

器件型号数量说明
主控MCUSTM32F103C8T61Cortex-M3,72MHz,64KB Flash
AI视觉模块K210(Maix Bit)1RISC-V双核,1TOPS算力
WiFi模块ESP8266-01S1连接WiFi,与OneNet通信

4.2 传感器模块

器件型号数量功能
光敏传感器GL55281环境光照检测
人体红外HC-SR5011人体存在检测
超声波HC-SR042坐姿距离检测
温湿度DHT111环境温湿度采集

4.3 执行与显示器件

器件型号数量功能
LED灯板高亮度LED1照明执行
蜂鸣器有源蜂鸣器1报警提示
语音模块SYN62881语音播报
OLED显示屏0.96寸 I2C1状态显示

五、各模块详细设计

5.1 智能照明模块

实现原理

光敏传感器通过STM32的ADC采集环境光照强度,人体红外传感器检测是否有人。STM32根据光照强度计算目标亮度,通过PWM输出控制LED驱动电路实现无级调光。

核心代码

// 光敏传感器ADC采集
uint16_t Get_Light_Value(void)
{
    uint16_t adc_value = 0;
    adc_value = ADC_GetConversionValue(ADC1);
    return adc_value;
}

// PWM调光控制
void Set_LED_Brightness(uint8_t brightness)
{
    uint16_t pwm_value = (brightness * 1000) / 100;
    TIM_SetCompare1(TIM3, pwm_value);
}

// 自动调光逻辑
void Auto_Light_Control(void)
{
    uint16_t light = Get_Light_Value();
    uint8_t human = Get_Human_State();
    
    if (human == 1) {
        if (light < 500) {
            Set_LED_Brightness(100);  // 光照不足,全亮
        } else if (light < 1500) {
            Set_LED_Brightness(70);   // 光照适中,70%亮度
        } else {
            Set_LED_Brightness(30);   // 光照充足,30%亮度
        }
    } else {
        Set_LED_Brightness(0);        // 无人,关闭
    }
}

5.2 坐姿监测模块

实现原理

使用两个HC-SR04超声波模块,分别检测头部到桌面的距离和身体到台灯的距离。根据三角函数关系计算坐姿是否标准。

多级提醒策略

距离范围提醒方式
30-35cmLED柔光闪烁
<30cm蜂鸣器间歇报警
<25cm持续10秒亮度强制降低,语音提醒

核心代码

// 超声波测距
float Get_Distance(void)
{
    TIM_SetCounter(TIM2, 0);
    GPIO_SetBits(GPIOA, GPIO_Pin_0);  // Trig
    delay_us(20);
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0);  // Echo
    TIM_Cmd(TIM2, ENABLE);
    while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1);
    TIM_Cmd(TIM2, DISABLE);
    
    uint16_t time = TIM_GetCounter(TIM2);
    float distance = time * 0.017;  // 距离计算
    return distance;
}

// 坐姿检测
void Posture_Detection(void)
{
    float distance = Get_Distance();
    
    if (distance < 25.0) {
        Buzzer_On();
        Voice_Play("请保持距离,坐姿端正");
        Set_LED_Brightness(50);  // 降低亮度提醒
    } else if (distance < 30.0) {
        Buzzer_Beep(200);
        Voice_Play("距离过近,请注意");
    } else if (distance < 35.0) {
        LED_Blink(3);
    }
}

5.3 AI疲劳监测模块(K210)

实现原理

K210运行YOLO算法进行人脸检测,使用ERT算法定位人脸特征点,计算眼睛纵横比(EAR),基于PERCLOS理论判断疲劳程度。

EAR计算公式

EAR = (||p2-p6|| + ||p3-p5||) / (2 * ||p1-p4||)

其中p1~p6为眼睛特征点,当EAR值低于阈值(如0.2)并持续一定时间,判定为疲劳。

K210核心代码(MaixPy)

import sensor, image, time, lcd
from machine import UART
from fpioa_manager import fm

# 初始化串口
fm.register(6, fm.fpioa.UART1_TX)
fm.register(7, fm.fpioa.UART1_RX)
uart = UART(UART.UART1, 115200)

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

# 加载人脸检测模型
import KPU as kpu
task = kpu.load("/sd/face.kmodel")

# 疲劳检测参数
EAR_THRESHOLD = 0.2
CONSEC_FRAMES = 20
counter = 0

while True:
    img = sensor.snapshot()
    # 人脸检测
    faces = kpu.forward(task, img)
    
    if faces:
        # 计算EAR值
        ear = calculate_ear(faces)
        
        if ear < EAR_THRESHOLD:
            counter += 1
            if counter >= CONSEC_FRAMES:
                uart.write("FATIGUE\n")
                counter = 0
        else:
            counter = 0
            uart.write("NORMAL\n")
    else:
        uart.write("NO_FACE\n")
    
    time.sleep_ms(50)

5.4 语音交互模块

支持的语音指令

指令功能
"开灯"/"关灯"控制台灯开关
"调亮"/"调暗"调节亮度
"阅读模式"切换预设亮度场景
"休息提醒"开启/关闭疲劳监测

核心代码

// 语音指令解析
void Voice_Command_Parser(char *cmd)
{
    if (strstr(cmd, "开灯") != NULL) {
        Set_LED_Brightness(100);
        Voice_Play("已为您开灯");
    } else if (strstr(cmd, "关灯") != NULL) {
        Set_LED_Brightness(0);
        Voice_Play("已为您关灯");
    } else if (strstr(cmd, "调亮") != NULL) {
        current_brightness += 20;
        if (current_brightness > 100) current_brightness = 100;
        Set_LED_Brightness(current_brightness);
        Voice_Play("已调亮");
    } else if (strstr(cmd, "阅读模式") != NULL) {
        Set_LED_Brightness(80);
        Set_Color_Temperature(4000);  // 暖白光
        Voice_Play("已切换到阅读模式");
    }
}

5.5 远程控制模块(ESP8266+OneNet)

OneNet数据点定义

数据点标识名类型说明
开关状态power布尔0=关,1=开
亮度brightness数值0-100%
环境光照light数值光照强度值
温度temperature数值单位℃
湿度humidity数值单位%RH
坐姿距离distance数值单位cm
疲劳状态fatigue布尔0=正常,1=疲劳

ESP8266 AT指令配置

// WiFi连接
void ESP8266_Init(void)
{
    ESP_Send_AT("AT+RST\r\n", 2000);
    ESP_Send_AT("AT+CWMODE=1\r\n", 500);
    ESP_Send_AT("AT+CWJAP=\"WiFi_Name\",\"WiFi_Password\"\r\n", 5000);
    ESP_Send_AT("AT+CIPMUX=0\r\n", 500);
}

// MQTT连接OneNet
void OneNet_Connect(void)
{
    ESP_Send_AT("AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n", 3000);
    // 发送MQTT连接报文
    ESP_Send_AT("AT+CIPSEND=...\r\n", 500);
}

// 数据上报
void OneNet_Upload_Data(void)
{
    char json_buf[256];
    sprintf(json_buf, "{\"power\":%d,\"brightness\":%d,\"temperature\":%d,\"humidity\":%d}",
            power_state, brightness, temperature, humidity);
    
    // 发送数据到OneNet
    ESP_Send_Data(json_buf);
}

5.6 本地显示模块

OLED显示内容

text

┌─────────────────────┐
│  2024-01-15 14:30   │  ← 时间
│  Temp: 25℃  Hum: 60%│  ← 温湿度
│  Light: 800  Bri:80%│  ← 光照/亮度
│  Mode: Auto  OK     │  ← 模式/状态
└─────────────────────┘

核心代码

void OLED_Display_Update(void)
{
    OLED_Clear();
    
    // 显示时间
    OLED_ShowString(0, 0, time_str, 12);
    
    // 显示温湿度
    sprintf(buf, "Temp:%dC Hum:%d%%", temperature, humidity);
    OLED_ShowString(0, 2, buf, 12);
    
    // 显示光照和亮度
    sprintf(buf, "Light:%d Bri:%d%%", light_value, brightness);
    OLED_ShowString(0, 4, buf, 12);
    
    // 显示模式
    sprintf(buf, "Mode:%s %s", mode_str, status_str);
    OLED_ShowString(0, 6, buf, 12);
    
    OLED_Refresh();
}

六、通信协议设计

6.1 STM32 ↔ K210 通信协议

text

帧格式: [帧头0xAA][数据类型][数据长度][数据内容][校验和][帧尾0x55]

数据类型:
  0x01 = 疲劳状态 (FATIGUE/NORMAL/NO_FACE)
  0x02 = 人脸检测结果
  0x03 = 控制指令

示例帧:
  发送疲劳: AA 01 07 46 41 54 49 47 55 45 XX 55

6.2 STM32 ↔ ESP8266 通信

使用AT指令集,数据格式为JSON:

json

{
  "power": 1,
  "brightness": 80,
  "temperature": 25,
  "humidity": 60,
  "light": 800,
  "distance": 32.5,
  "fatigue": 0
}

七、系统工作流程

text

系统启动
   │
   ▼
初始化外设(传感器/显示屏/WiFi/串口)
   │
   ▼
循环采集传感器数据
   │
   ├──▶ 光照/人体 → 自动调光
   ├──▶ 超声波 → 坐姿检测
   ├──▶ K210 → 疲劳监测
   ├──▶ DHT11 → 温湿度采集
   └──▶ 语音模块 → 指令识别
   │
   ▼
数据处理与逻辑判断
   │
   ├──▶ 本地执行(PWM/蜂鸣器/语音)
   └──▶ 数据上报(ESP8266→OneNet)
   │
   ▼
OLED显示更新
   │
   ▼
循环监测

八、开发环境与工具

模块开发环境说明
STM32Keil MDK 5使用HAL库或标准外设库
K210MaixPy IDEMicroPython开发
ESP8266Arduino IDE或AT指令调试
云平台OneNet开发者中心创建产品、设备、数据流
电路设计Altium DesignerPCB设计

九、总结

本项目基于K210+STM32+ESP8266+OneNet架构,设计了一套功能完善的智能护眼台灯系统。通过多传感器融合和AI视觉技术,实现了智能照明、坐姿监测、疲劳检测、语音交互和远程控制等功能。该系统不仅能够有效保护青少年视力健康,还为智能家居设备的开发提供了一个完整的参考方案。

项目特点

  • ✅ 多传感器融合,全方位监测

  • ✅ AI视觉技术,智能疲劳检测

  • ✅ 云端互联,远程控制

  • ✅ 语音交互,自然便捷

  • ✅ 模块化设计,易于扩展

适用场景

  • 家庭学习桌

  • 学校教室

  • 图书馆阅览室

  • 办公室工位


参考资料

  1. STM32F103参考手册

  2. K210 MaixPy开发文档

  3. OneNet平台开发指南

  4. ESP8266 AT指令集

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

Logo

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

更多推荐