【STM32项目开源】基于STM32的智能语音台灯系统
目录
一、设计背景和意义
1.1设计背景
1.2设计意义
二、实物效果展示
2.1实物图片
2.2实物演示视频
三、硬件功能简介
3.1项目功能详解
3.2元器件清单
四、主框图与软件流程图
五、硬件PCB展示
六、软件程序设计
七、项目资料包内容
资料获取:查看主页介绍“充哥单片机设计”
一、设计背景和意义
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); //10usEXTIX_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); //使能TIMxOLED_ShowNum(40, 6, timer1, 3, 16);}if (flag4 == 0){TIM_Cmd(TIM4, DISABLE); //使能TIMxOLED_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;}}
}