【STM32方案开源】基于STM32的智能语音台灯框架
目录
一、设计背景和意义
1.1设计背景
随着“智能家居”理念的广泛普及以及物联网、嵌入式系统等前沿技术的发展,传统家居照明产品正经历着由“人工控制”向“智能联动”“自动响应”转变的深刻变革。作为家庭和办公场景中使用频率极高的照明设备,台灯的作用和体验也正在被重新定义。传统台灯产品普遍存在照度不可调、能耗高、操作方式单一、缺乏人性化设计等问题,无法满足当代用户对“舒适、健康、节能、智能”照明体验的多重需求,尤其对于长时间用眼的学生和办公人群来说,缺乏动态调光、护眼提醒等功能更是隐患重重。
1.2设计意义
该平台利用集成DHT11环境温湿度传感器、光敏电阻、HC-SR04超声波测距模块、AS312人体感应模块以及DS1302时钟模块,能够实时监测用户周围环境状况及使用行为,从而在不同模式下自动判断灯光状态是否需要开启并调节至合适亮度,在实现节能照明的同时,也提升了用眼健康与运用便捷性。此外,系统通过ESP8266 WiFi模块接入机智云平台,使用户能够随时随地通过手机APP控制灯光设备,并远程查看环境资料及历史记录,提升了系统的人机交互体验与实用性。
从学术研究的角度来看,本课题综合了嵌入式软硬件设计、物联网通信、自动控制、传感器应用等多个知识点,体现了计算机科学与现代智能硬件工程融合的特点,具有较强的技术综合性和工程完成价值。对于培养学生系统开发能力、动手实践能力和工程创新思维具有积极意义。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能语音台灯框架
三、硬件效果简介
3.1项目功能详解
1.传感器检测:温湿度、距离、人体信号、光强
2.数据显示:0.96OLED屏幕
3.执行机构:控制LED灯开关和亮度、蜂鸣器
4.接入云平台:通过ESP8266 WIFI联网后,接入机智云平台
5.App远程监控:经过App远程监控传感器数据,控制台灯的亮度、开关
6.阈值数据设定:体系通过按键/APP设定阈值
7.模式切换:可以通过按键或者手机App达成自动/手动/定时模式的切换
8.语音控制:语音助手控制台灯亮度,开关
9.护眼能力:当平台检测到人距离台灯过近(坐姿不标准)蜂鸣器报警
3.2元器件清单
- 主控STM32F103C8T6
- ESP8266-WIFI模块
- 红外热释电人体存在检测模块
- 超声波坐姿检测传感器
- 蜂鸣器模块
- 0.96OLED显示屏幕
- 光敏电阻检测
- USB灯座+灯片
- DS1302时钟模块
- 四个按键模块
- DHT11温湿度传感器
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "oled.h"
#include "usart.h"
#include "exti.h"
#include "timer.h"
#include "HC_SR04.h"
#include "kalman.h"
#include "lsens.h"
#include "adc.h"
#include "hongwai.h"
#include "BEEP.h"
#include "usart2.h"
#include "usart3.h"
extern u8 Res1, Res3;
extern int timer1;
u16 sonic_dis = 0;
int main(void)
{
int key = 0, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, guangmi = 0, flag5 = 0;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
usart3_Init(9600);
LED_Init();
BEEP_Init();
OLED_Init();
KEY_Init();
Lsens_Init();
hongwai(); //人体
TIM3_Int_Init(9, 71); //10us
EXTIX_Init();
hc_sr04_init(); //HC_SR04初始化
TIM4_Int_Init(9999, 7199); //计时
TIM2_PWM_Init(899, 0); //调节亮度
BEEP = 0;
OLED_ShowCHinese(35, 0, 0);
OLED_ShowCHinese(50, 0, 1);
OLED_ShowCHinese(65, 0, 2);
OLED_ShowCHinese(80, 0, 3); //标题
OLED_ShowCHinese(0, 2, 6);
OLED_ShowCHinese(15, 2, 7);
OLED_ShowString(30, 2, ":", 16); //模式
OLED_ShowCHinese(0, 4, 16);
OLED_ShowCHinese(15, 4, 17);
OLED_ShowString(30, 4, ":", 16); //状态
OLED_ShowCHinese(70, 4, 22); //无人
OLED_ShowCHinese(85, 4, 23);
OLED_ShowString(100, 4, ":", 16);//状态
OLED_ShowCHinese(0, 6, 24); //时间
OLED_ShowCHinese(15, 6, 25);
OLED_ShowString(30, 6, ":", 16);
OLED_ShowString(65, 6, "s", 16);
while (1)
{
usart2_init(9600); //蓝牙通信
sonic_Trig(); //超声波
sonic_dis = sonic_distance / 10;
OLED_ShowNum(75, 6, sonic_distance / 10, 4, 16);
OLED_ShowString(110, 6, "cm", 16);
if (sonic_distance / 10 > 10){
BEEP = 0;
}else if (sonic_distance / 10 <= 10){
BEEP = 1;
}
guangmi = Lsens_Get_Val(); //亮度
OLED_ShowNum(110, 4, guangmi, 2, 16);
key = KEY_Scan(0);
if (key == 1){
flag1 += 1;
if (flag1 > 3)
flag1 = 0;
}
if (flag1 == 0) //智能模式
{
OLED_ShowCHinese(45, 2, 4);
OLED_ShowCHinese(60, 2, 5);
OLED_ShowCHinese(75, 2, 6);
OLED_ShowCHinese(90, 2, 7);
if (renti == 0){
OLED_ShowCHinese(40, 4, 18);//有人
OLED_ShowCHinese(55, 4, 19);
flag2 = 1;
}
else if (renti == 1)
{
OLED_ShowCHinese(40, 4, 20);//无人
OLED_ShowCHinese(55, 4, 21);
flag2 = 0;
}
if (flag2 == 1){
if (guangmi > 20 && guangmi <= 40){
TIM_SetCompare2(TIM2, 200);
}
if (guangmi > 40 && guangmi <= 60){
TIM_SetCompare2(TIM2, 400);
}
if (guangmi > 60){
TIM_SetCompare2(TIM2, 800);
}
}else if (flag2 == 0){
TIM_SetCompare2(TIM2, 899);//关灯
}
}
if (flag1 == 1){
OLED_ShowCHinese(45, 2, 8);
OLED_ShowCHinese(60, 2, 9);
OLED_ShowCHinese(75, 2, 10);
OLED_ShowCHinese(90, 2, 11); //按键模式
if (key == 2){
flag3 +=1 ;
if(flag3>3){
flag3=0;
}
}
if (flag3 == 0){
TIM_SetCompare2(TIM2, 899);
}else if (flag3 == 1){
TIM_SetCompare2(TIM2, 800);
}else if (flag3 == 2){
TIM_SetCompare2(TIM2, 600);
}else if (flag3 == 3){
TIM_SetCompare2(TIM2, 400);
}
if (key == 3){
flag4 = !flag4; //计时
}
if (flag4 == 1){
TIM_Cmd(TIM4, ENABLE); //使能TIMx
OLED_ShowNum(40, 6, timer1, 3, 16);
}
if (flag4 == 0){
TIM_Cmd(TIM4, DISABLE); //使能TIMx
OLED_ShowNum(40, 6, timer1, 3, 16);
}
}
if (flag1 == 2){
OLED_ShowCHinese(45, 2, 12);
OLED_ShowCHinese(60, 2, 13);
OLED_ShowCHinese(75, 2, 14);
OLED_ShowCHinese(90, 2, 15); //远程模式
switch (Res1)
{
case 1: TIM_SetCompare2(TIM2, 400);
break; //开灯
case 2: TIM_SetCompare2(TIM2, 899);
break; //关灯
case 3: TIM_Cmd(TIM4, ENABLE);
OLED_ShowNum(40, 6, timer1, 3, 16);
break; //开启计时
case 4: TIM_Cmd(TIM4, DISABLE);OLED_ShowNum(40, 6, timer1, 3, 16);
break; //关闭计时
case 5: TIM_SetCompare2(TIM2, 200);
break; //三档灯光
case 6: TIM_SetCompare2(TIM2, 400);
break; //二档灯光
case 7: TIM_SetCompare2(TIM2, 800);
break; //一档灯光
case 8: TIM_Cmd(TIM4, DISABLE);
timer1 = 0;
OLED_ShowNum(40, 6, timer1, 3, 16);
break; //清零
}
}
if (flag1 == 3)
{
OLED_ShowCHinese(45, 2, 26);
OLED_ShowCHinese(60, 2, 27);
OLED_ShowCHinese(75, 2, 28);
OLED_ShowCHinese(90, 2, 29); //远程模式
Uart3_SendCMD2(0x01, guangmi);
Uart3_SendCMD2(0x02, sonic_distance / 10);
switch (Res3)
{
case 3: TIM_SetCompare2(TIM2, 400);
break; //开灯
case 4: TIM_SetCompare2(TIM2, 899);
break; //关灯
case 5: TIM_SetCompare2(TIM2, 200);
break; //三档灯光
case 6: TIM_SetCompare2(TIM2, 400);
break; //二档灯光
case 7: TIM_SetCompare2(TIM2, 800);
break; //一档灯光
case 8: TIM_Cmd(TIM4, ENABLE);OLED_ShowNum(40, 6, timer1, 3, 16);
break; //开启计时
case 9: TIM_Cmd(TIM4, DISABLE);OLED_ShowNum(40, 6, timer1, 3, 16);
break; //关闭计时
case 0x10: TIM_Cmd(TIM4, DISABLE);timer1 = 0;//清零
OLED_ShowNum(40, 6, timer1, 3, 16);
break;
}
}
if (key == 4)
{
timer1 = 0;
}
}
}
七、项目资料包内容


浙公网安备 33010602011771号