基于STM32的智能家居系统
一、项目介绍
本项目是参加2025贸泽电子M-Design创意设计竞赛的方向三:无线通信、物联网 作业。本智能家居系统集成了蓝牙通信、语音识别、环境监测等多种功能,旨在为用户打造便捷、舒适、安全的家居环境。用户可通过蓝牙或语音指令控制门窗、灯光等设备,系统还能实时监测温湿度、烟雾浓度、是否下雨等环境信息,并根据情况自动调节家居设备状态,实现智能化家居管理。
二、创意介绍
本项目将多种交互方式(蓝牙和语音)与全面的环境监测功能相结合,为用户提供多样化控制选择。系统具备自动调节功能,可根据环境变化自动调整设备状态,无需手动干预。此外,用户还能通过蓝牙设置温湿度上下限,增强了系统的个性化和适应性。
三、硬件介绍
- 主控芯片:STM32,作为核心控制单元,负责处理传感器数据、接收指令并控制执行器。
- 蓝牙模块:用于与用户蓝牙设备通信,接收蓝牙指令。
- 语音识别模块(LD3320):将用户语音转化为系统可识别的指令。
- 温湿度传感器:实时监测室内温湿度。
- 烟雾传感器:检测室内烟雾浓度,超标时触发报警和通风措施。
- 雨水检测模块:检测是否下雨,下雨时自动关闭相关设备。
- 执行器:包括舵机(控制窗户、窗帘开合)、继电器(控制灯光、风扇等设备开关)。
四、方案框图和项目设计思路介绍
方案框图
项目设计思路
采用模块化设计思想,将系统分为输入模块(蓝牙模块、语音识别模块、传感器模块)、处理模块(STM32 主控芯片)和输出模块(执行器模块)。输入模块采集用户指令和环境信息,处理模块分析处理信息并生成控制信号,输出模块根据控制信号驱动设备执行操作。
五、原理图与PCB
原理图
原理图设计介绍
- 主控核心:以 STM32F103ZET6 芯片为核心,作为整个系统的控制中枢,连接并协调各模块工作。芯片周边配置了复位电路(保障系统稳定复位)、晶振电路(32.768K 晶振用于低功耗时钟,8M 晶振提供系统主时钟),确保芯片正常运行。
- 电源模块:
- TYPE-C 供电口:通过 TYPE-C 接口输入电源,连接降压电路,为系统提供稳定电压。
- 退耦电容:分布在电源路径上,过滤电源噪声,保证供电稳定性,降低电源干扰对其他模块的影响。
- 传感器模块:
- 温湿度监测电路:实时采集环境温湿度数据,为系统自动调节(如加热、降温、喷雾等)提供依据。
- 雨滴监测电路:检测是否下雨,触发窗户关闭等防护动作。
- 烟雾检测模块:监测烟雾浓度,超标时联动蜂鸣器报警、风扇启动等操作。
- 人体感应电路:检测人体活动,实现人来灯亮、设备自动响应等智能场景。
- 执行器模块:
- 加热 / 降温电路:根据温湿度数据,控制加热或降温设备,调节环境温度。
- 风扇电路:配合烟雾检测或温度调节,实现通风散热功能。
- 喷雾电路:用于调节环境湿度,当湿度不足时启动喷雾。
- 蜂鸣器电路:作为报警输出,在烟雾超标、异常情况时发出警示。
- 窗户 / 窗帘 / 房门控制:通过对应电路驱动执行机构(如舵机),实现门窗开关、窗帘开合控制。
- 通信与交互模块:
- 语音模块:实现语音指令识别与播报,支持用户语音控制家居设备。
- 蓝牙模块:提供蓝牙通信功能,允许用户通过手机等设备远程控制。
- 串口 WiFi:支持无线网络连接,拓展远程控制与数据传输能力。
- 独立按键:作为本地手动控制入口,方便用户直接操作。
- OLED:显示系统状态信息,如温湿度数值、设备工作状态等。
- 其他辅助模块:
- 存储电路:用于数据存储,记录系统配置、历史数据等信息。
- BOOT 电路:配合芯片启动模式设置,方便程序下载与调试。
- 下载口:提供程序下载通道,便于开发阶段烧录代码。
PCB
PCB 设计要点
- 布局设计
- 功能分区:以 STM32 芯片为中心,电源区(降压电路)、传感器区(温湿度、烟雾检测)、执行器驱动区(加热、风扇电路)、通信区(蓝牙、语音模块)分区明确。例如,电源模块集中布局减少干扰,传感器靠近边缘便于环境检测。
- 关键元件:主控芯片周边合理放置退耦电容、晶振;大电流驱动元件(如加热电路)独立区域布局,避免干扰小信号电路。
- 布线设计
- 电源与地线:电源线加粗,降低线阻压降;数字地与模拟地分隔,通过磁珠连接,减少地噪声。大面积铺地铜,增强屏蔽。
- 信号优化:高速信号线(如串口)短而直,模拟信号线(如传感器信号)屏蔽处理,确保数据传输稳定。
- 工艺细节
- 封装与焊盘:元件封装适配实际器件,焊盘设计满足焊接工艺(如 TYPE-C 接口、下载口焊盘加粗)。
- 标识清晰:PCB 丝印标注模块功能(如 “加热”“温湿度”),红色基板搭配黄色丝印,提升调试与维护便利性。
六、软件流程图和关键代码介绍
软件流程图
关键代码
// 蓝牙指令获取函数
uint8_t lanya_get()
{
int chartemp;
// 检查USART_RX_STA标志位,判断数据接收是否完成
if(USART_RX_STA&0x8000)
{
// 数据接收完成,清除标志位
USART_RX_STA=0;
// 将接收到的字符指令转换为整数
chartemp=atoi((const char*)USART_RX_BUF);
return chartemp;
}
return 0;
}
// 蓝牙指令执行函数
void lanya_run(uint8_t x)
{
if(x<100&&x!=0)
{
switch(x)
{
case 1:
// 控制窗户关闭
pwm_H_Anglex(180);
printf("窗户关闭中");
chflog=0;
delay_ms(500);
break;
case 2:
// 控制窗户打开
pwm_H_Anglex(0);
printf("窗户打开中");
chflog=1;
delay_ms(500);
break;
// 其他设备控制类似
}
}
else if(x>=130&&x<=180)
{
if(sdflog==0)
{
// 设置温湿度下限
sdmin=x-100;
sdflog=1;
}
else if(sdflog==1)
{
// 设置温湿度上限
sdmax=x-100;
sdflog=0;
}
}
}
// 语音识别扫描函数
:void LD3320_scan(void)
{
switch(nAsrStatus)
{
case LD_ASR_RUNING:
case LD_ASR_ERROR:
break;
case LD_ASR_NONE
// 启动语音识别
nAsrStatus=LD_ASR_RUNING;
if (RunASR()==0)
{
nAsrStatus = LD_ASR_ERROR;
}
break;
case LD_ASR_FOUNDOK:
// 获取语音识别结果
nAsrRes = LD_GetResult();
// 处理语音识别结果
User_Modification(nAsrRes);
nAsrStatus = LD_ASR_NONE;
break;
case LD_ASR_FOUNDZERO:
default:
nAsrStatus = LD_ASR_NONE;
break;
}
}
// 语音指令处理函数
void User_Modification(uint8_t dat)
{
if(dat ==0)
{
// 唤醒指令
ldflag=1;
printf(" 我在 \n\r");
}
else if(ldflag)
{
// 清除唤醒标志
ldflag=0;
switch(nAsrRes)
{
case CODE_1KL1:
// 温度上升操作
temp++;
printf(" 温度已上升\n\r");
delay_ms(500);
break;
// 其他语音指令处理类似
}
}
}
// 温湿度监测与控制函数
void wenshidu()
{
kayscan=key_scan(0);
if(wenshimode==0)
{
if(kayscan==4&&oledfloat==1)
{
// 切换OLED显示模式
oledmode=oledmode?0:1;
OLED_Clear();
}
if(kayscan==3&&oledfloat==1&&oledmode==0)
{
// 切换温湿度模式
wenshimode++;
OLED_Clear();
oled_scan();
if(wenshimode==4)
wenshimode=0;
}
// 读取温湿度数据
dht11_read_data(&temperature, &humidity);
if(temperature>=temp-1&&temperature<=temp+1)
{
// 温度在设定范围内,关闭加热和降温设备
JR(0);
JW(0);
}
else if(temperature<temp)
{
// 温度低于设定值,开启加热设备
JR(1);
JW(0);
}
else if(temperature>temp)
{
// 温度高于设定值,开启降温设备
JR(0);
JW(1);
}
// 湿度控制逻辑类似
}
// 其他模式处理类似
}
// 雨水检测扫描函数
void yd_scan(void)
{
int yd;
// 获取雨水检测结果
yd=yd_run();
if(yd==0)
{
// 检测到下雨,关闭窗户、房门、窗帘和橱窗
pwm_H_Anglex(180);
chflog=0;
Servo_SetAngle(90);
menflog=0;
Servo_SetAngle2(0);
chuangflog=0;
Servo_SetAngle1(0);
chuflog=0;
}
}
// 烟雾浓度检测函数
uint32_t MQ2_GetData_PPM(void)
{
uint16_t adcx;
// 读取烟雾传感器数据
adcx = adc_get_result_average(ADC_ADCX_CHY, 10);
// 计算烟雾浓度
ppm=adcx/10;
while(ppm>60)
{
// 烟雾浓度超标,触发报警和通风措施
adcx = adc_get_result_average(ADC_ADCX_CHY, 10);
ppm=adcx/10;
BEEP(0);
FS(1);
pwm_H_Anglex(0);
chflog=0;
Servo_SetAngle2(180);
chuangflog=0;
chuflog=1;
Servo_SetAngle1(180);
}
// 关闭报警
BEEP(1);
return ppm;
}
七、智能家居 3D 模型展示与介绍
该模型以白色箱体为载体,模拟家居场景。箱体侧面设交互区,包含显示屏(实时呈现温湿度等数据)与功能按键(如开关、模式切换),支持本地操作。侧面的风扇对应通风功能,与烟雾检测联动,烟雾超标时自动启动换气。箱体配备可控制窗户,能联动雨水检测模块,遇雨自动关闭;顶部预留传感器安装位,用于采集环境数据。整体设计融合功能模块与家居外观,直观展现环境监测、设备控制及交互操作等智能家居核心功能。
- 尺寸:这类模型通常为适配内部电路与展示效果,长宽高在 25cm×20cm×20cm 左右,既容纳传感器、执行器等模块,也便于演示操作。
- 材质:
- 3D 打印材质:PETG。
- 手工制作材质:选用亚克力板(透光性好,便于加工显示屏、窗口部分)、ABS 塑料(强度高,抗冲击),部分结构也可能搭配 PVC 板,平衡成本与制作难度。
八、设计中遇到的难题和解决方法
- 蓝牙通信不稳定问题:优化蓝牙模块天线设计、调整通信波特率、增加数据校验机制,提高通信稳定性。
- 语音识别准确率问题:调整语音识别模块声学参数、增加降噪算法、训练特定语音模型,提高识别准确率。
- 传感器数据干扰问题:对传感器进行屏蔽处理、优化安装位置、采用滤波算法,减少干扰,提高数据准确性。
九、心得体会
- 通过参加本次竞赛,提升了硬件设计和软件开发能力,学会了系统集成和解决实际问题。团队合作让我体会到沟通和协作的重要性。