基于K210+STM32+ESP8266+OneNet的智能护眼台灯系统设计与实现
若该文为原创文章,转载请注明原文出处。
一、项目背景
随着青少年近视率不断攀升,家长对孩子用眼健康的关注度日益提高。传统的台灯只能提供照明功能,无法对用户的坐姿、用眼时长进行监测和提醒。本项目设计了一套集智能照明、坐姿监测、疲劳检测、语音交互和远程控制于一体的智能护眼台灯系统。
系统采用 K210 + STM32 + ESP8266 + OneNet 四核心架构,通过多传感器融合和AI视觉技术,实现对用户用眼行为的全方位监测和智能干预。
二、系统功能
| 功能模块 | 具体功能 | 核心技术 |
|---|---|---|
| 智能照明 | 自动调光、人来灯亮、人走灯灭 | 光敏传感器+人体红外+PWM |
| 坐姿监测 | 距离检测、坐姿纠正提醒 | 超声波传感器+多级报警 |
| 疲劳监测 | 眨眼频率检测、疲劳提醒 | K210+人脸识别算法 |
| 语音交互 | 语音控制、语音播报 | 语音识别模块 |
| 远程控制 | APP远程控制、状态查看 | ESP8266+OneNet |
| 本地显示 | 时间/温湿度/状态显示 | OLED显示屏 |
三、系统架构
系统采用"感知层-控制层-执行层-云平台"四层架构:
text
┌─────────────────────────────────────────────────────────┐
│ 云平台层(OneNet) │
│ 数据存储 | 远程控制 | 历史记录 | 报警推送 │
└─────────────────────┬───────────────────────────────────┘
│ MQTT/HTTP
┌─────────────────────▼───────────────────────────────────┐
│ 通信层(ESP8266) │
│ WiFi连接 | 数据上报 | 指令接收 │
└─────────────────────┬───────────────────────────────────┘
│ UART串口
┌─────────────────────▼───────────────────────────────────┐
│ 控制层(STM32F103) │
│ 传感器数据处理 | PWM调光 | 语音交互 | 状态判断 │
└──────┬──────────────┬──────────────┬────────────────────┘
│ │ │
┌──────▼──────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 感知层 │ │ 感知层 │ │ AI视觉层 │
│ 光敏传感器 │ │超声波传感器│ │ K210 │
│人体红外 │ │温湿度传感器│ │ 摄像头 │
└─────────────┘ └───────────┘ └───────────┘
四、硬件器件清单
4.1 核心控制器件
| 器件 | 型号 | 数量 | 说明 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | 1 | Cortex-M3,72MHz,64KB Flash |
| AI视觉模块 | K210(Maix Bit) | 1 | RISC-V双核,1TOPS算力 |
| WiFi模块 | ESP8266-01S | 1 | 连接WiFi,与OneNet通信 |
4.2 传感器模块
| 器件 | 型号 | 数量 | 功能 |
|---|---|---|---|
| 光敏传感器 | GL5528 | 1 | 环境光照检测 |
| 人体红外 | HC-SR501 | 1 | 人体存在检测 |
| 超声波 | HC-SR04 | 2 | 坐姿距离检测 |
| 温湿度 | DHT11 | 1 | 环境温湿度采集 |
4.3 执行与显示器件
| 器件 | 型号 | 数量 | 功能 |
|---|---|---|---|
| LED灯板 | 高亮度LED | 1 | 照明执行 |
| 蜂鸣器 | 有源蜂鸣器 | 1 | 报警提示 |
| 语音模块 | SYN6288 | 1 | 语音播报 |
| OLED显示屏 | 0.96寸 I2C | 1 | 状态显示 |
五、各模块详细设计
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-35cm | LED柔光闪烁 |
| <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显示更新 │ ▼ 循环监测
八、开发环境与工具
| 模块 | 开发环境 | 说明 |
|---|---|---|
| STM32 | Keil MDK 5 | 使用HAL库或标准外设库 |
| K210 | MaixPy IDE | MicroPython开发 |
| ESP8266 | Arduino IDE | 或AT指令调试 |
| 云平台 | OneNet开发者中心 | 创建产品、设备、数据流 |
| 电路设计 | Altium Designer | PCB设计 |
九、总结
本项目基于K210+STM32+ESP8266+OneNet架构,设计了一套功能完善的智能护眼台灯系统。通过多传感器融合和AI视觉技术,实现了智能照明、坐姿监测、疲劳检测、语音交互和远程控制等功能。该系统不仅能够有效保护青少年视力健康,还为智能家居设备的开发提供了一个完整的参考方案。
项目特点:
-
✅ 多传感器融合,全方位监测
-
✅ AI视觉技术,智能疲劳检测
-
✅ 云端互联,远程控制
-
✅ 语音交互,自然便捷
-
✅ 模块化设计,易于扩展
适用场景:
-
家庭学习桌
-
学校教室
-
图书馆阅览室
-
办公室工位
参考资料:
-
STM32F103参考手册
-
K210 MaixPy开发文档
-
OneNet平台开发指南
-
ESP8266 AT指令集
如有侵权,或需要完整代码,请及时联系博主。
更多推荐



所有评论(0)