【STM32项目开源】基于STM32的智能家居语音控制系统
摘要:本文介绍了一套基于STM32F103C8T6单片机的智能家居语音控制系统设计方案。系统集成了温湿度、烟雾、光照等传感器,通过ESP8266 WiFi模块接入机智云平台,实现手机APP远程监控和环境数据记录。创新性地采用ASRPRO语音模块提供本地语音控制功能,支持自动/手动模式切换,当环境参数超过阈值时可自动控制灯光、风扇等设备。系统具有模块化设计、成本低廉的特点,适用于教学实践和智能家居应
目录
一、设计背景和意义
1.1设计背景
近年来,随着信息技术的快速发展,物联网(IoT)、嵌入式系统、人工智能以及无线通信等技术的不断融合,推动了智能家居系统从理论构想走向实际应用,成为现代生活中不可忽视的重要组成部分。智能家居系统通过对室内环境的感知、判断与控制,能够帮助用户实现远程操作、自动调节、安全预警等多种功能,从而显著提高居住的舒适性、安全性与生活效率。这种趋势不仅改变了人们的居住体验,也为新一代智能设备的研发提供了广阔的应用空间。尽管目前市面上已有不少成熟的智能家居产品,但大多数系统仍存在一些不容忽视的局限性。许多产品高度依赖品牌生态闭环,缺乏开放性和可定制性,用户很难根据自身实际需求对系统功能进行扩展或修改;其开发与维护成本较高,导致整套系统售价昂贵,难以在中低收入家庭及高校教学实践中广泛推广;还有当前主流的智能家居交互方式多以手机APP为主,虽然功能强大,却未能很好地照顾到老年人、儿童等对数字设备操作不熟悉群体的使用需求,交互方式的单一性成为影响用户体验的重要因素。
1.2设计意义
基于以上背景,本课题提出设计并实现一套以STM32F103C8T6单片机为核心的智能家居语音控制系统,力求在功能、成本与用户体验之间取得合理平衡。该系统通过集成烟雾、温湿度、光照等环境传感器,实现对家庭环境状态的实时监测,系统利用ESP8266 WiFi模块接入机智云平台,使用户能够通过手机APP远程查看环境信息、控制家电设备,进而实现数据的远程获取与控制操作的分离。此外,通过引入ASRPRO语音识别模块,系统具备了本地语音识别与指令执行功能,为用户提供更为自然、高效的交互方式,无需依赖手机或物理按键即可完成设备控制。
该课题的研究不仅具有明确的实用导向,也在技术融合和系统构建方面具备较强的工程实践价值。它涵盖了嵌入式系统开发、传感器应用、通信模块集成、物联网平台接入、语音识别技术等多个技术方向,是一次对智能控制系统综合开发能力的全面锻炼。同时,本系统采用成本低、模块化、可扩展的设计思路,适合在高校实验教学、智能硬件初创项目以及农村智能家居普及等场景中推广应用,具有良好的社会推广前景。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能家居语音控制系统
三、硬件功能简介
3.1项目功能详解
基于STM32的智能家居语音控制系统,项目简介:
- 传感器检测:检测烟雾浓度、光照强度、温湿度等数据。
- 数据显示:0.96OLED屏幕显示全部的传感器数据以及传感器的阈值等数据。
- 执行机构:控制LED灯、风扇、窗帘(步进电机模拟)。
- 语音控制:通过语音指令控制风扇、窗帘(步进电机)、LED灯光开关。
- 接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台。
- App远程监控:通过App远程获取全部传感器数据;App远程控制LED灯、风扇、步进电机。
- 阈值数据设定:系统通过按键设定阈值,也可以通过手机App远程设定。
- 模式切换:可以通过按键或者手机App实现自动/手动模式的切换。
- 手动模式:通过手机App控制LED灯、风扇、步进电机。
- 自动模式:检测的温度超过温度阈值会自动打开风扇,反之则关闭;检测到烟雾超过烟雾阈值自动开启声光报警;检测到光照强度超过光照阈值打开窗帘并且关灯。
- 历史数据记录:采集的传感器数据上传并记录在机智云平台,可以在云平台后台查看历史数据(手机App不具备此功能)。
3.2元器件清单
- 主控STM32F103C8T6
- 0.96OLED显示屏幕
- ESP8266联网WiFi
- DHT11温湿度传感器
- MQ-2烟雾传感器
- 光敏电阻
- LED灯
- 步进电机
- 蜂鸣器声光报警
- ASRPRO语音模块
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "control.h"
#include "key.h"
#include "timer.h"
#include "oled.h"
#include "dht11.h"
#include "adc.h"
#include "uln2003.h"
/**** 数据变量 ****/
uint16_t temp_door = 30; //温度阈值
uint16_t humi_door = 60; //湿度阈值
uint16_t light_door = 3000; //光照阈值
uint16_t mq2_door = 3000; //烟雾阈值
uint16_t mq7_door = 3000; //一氧化碳阈值
uint16_t mq135_door = 3000; //空气质量阈值
uint8_t auto_mode = 0; //自动模式开关 0关闭 1开启
uint8_t curtain_status = 0; //窗帘开关状态
uint8_t led_status = 0; //照明开关状态
uint8_t wind_status = 0; //风扇开关状态
uint8_t hum_status = 0; //加湿器开关状态
uint8_t curtain_flag = 0; //窗帘控制标志位
/**** 菜单变量 ****/
uint8_t keu_num = 0; //按键
uint8_t page_num = 1; //界面
uint8_t option = 0; //选项
/**** 功能函数声明 ****/
void get_all_sensor_data(); //传感器数据采集
void Sensor_Data_Handle(); //不同模式下控制效果
void Key_event_handle(void); //按键功能函数
void All_Pin_Init(void); //系统初始化函数
void OLED_Show_OnePage(); //第一屏显示内容
void OLED_Show_TwoPage(); //第二屏显示内容
void OLED_Show_ThreePage(); //第三屏显示内容
void All_Pin_Init(void)
{
delay_init(); //系统延时函数初始化
OLED_Init(); //屏幕初始化
uart3_init(9600); //串口3初始化,波特率9600
uart1_init(115200); //串口1初始化,波特率115200
uart2_init(9600); //串口2初始化,波特率9600
KEY_Init(); //按键初始化
DHT11_Init(); //DHT11温湿度初始化
Adc_Init(); //光照,烟雾浓度初始化
Uln2003_Init(); //步进电机初始化
Control_Init(); //声光报警,照明,风扇,加湿器初始化
}
int main(void)
{
All_Pin_Init();
LED=1;
while(1)
{
get_all_sensor_data(); //传感器数据采集
Key_event_handle(); //按键监测
Sensor_Data_Handle(); //数据处理
if(page_num == 1){ //屏幕更新
OLED_Show_OnePage();
}else if(page_num == 2){
OLED_Show_TwoPage();
}else if(page_num == 3){
OLED_Show_ThreePage();
}
//窗帘控制
if(curtain_flag==1){
curtain_flag = 0;
if(curtain_status==1){
Stepper_RotateByLoop(1,1,1);
}else{
Stepper_RotateByLoop(0,1,1);
}
}
}
}
void Key_event_handle(void)
{
keu_num = KEY_Scan(0); //按键扫描赋值
switch(keu_num)
{
case 1: //按键1按下
if(page_num==1){
page_num=2;
OLED_Clear();OLED_Show_TwoPage();
}else if(page_num==2){
option++;
if(option>4){
option=0;
page_num=3;
OLED_Clear();OLED_Show_ThreePage();
}else OLED_Show_TwoPage();
}else if(page_num==3){
option++;
if(option>4){
option=0;
page_num=1;
OLED_Clear();OLED_Show_OnePage();
}else OLED_Show_ThreePage();
}
break;
case 2: //按键2按下
if(page_num==1){
auto_mode = 1;
}else if(page_num==2){
if(option==1)temp_door++;
else if(option==2)humi_door++;
else if(option==3)light_door+=25;
else if(option==4)mq2_door+=25;
}else if(page_num==3){
if(auto_mode==0){
if(option==1){
LED=0;
led_status = 1;
}else if(option==2){
WIND=1;
wind_status = 1;
}else if(option==3){
HUM=1;
hum_status = 1;
}else if(option==4){
curtain_flag = 1;
curtain_status = 1;
}
}
}
break;
case 3: //按键3按下
if(page_num==1){
auto_mode = 0;
}else if(page_num==2){
if(option==1)temp_door--;
else if(option==2)humi_door--;
else if(option==3)light_door-=25;
else if(option==4)mq2_door-=25;
}else if(page_num==3){
if(auto_mode==0){
if(option==1){
LED=1;
led_status = 0;
}else if(option==2){
WIND=0;
wind_status = 0;
}else if(option==3){
HUM=0;
hum_status = 0;
}else if(option==4){
curtain_flag = 1;
curtain_status = 0;
}
}
}
break;
case 4: //按键4按下
break;
}
}
void get_all_sensor_data()
{
DHT11_Read_Data(&DHT_temp,&DHT_hum); //获取温湿度数据
Get_Light_Value(&Light_Value); //获取光照强度
Get_MQ2_Value(&MQ2_Value); //获取烟雾浓度
}
void Sensor_Data_Handle()
{
//自动模式
if(auto_mode==1){
//温度大于阈值打开风扇
if(DHT_temp>temp_door){
WIND=1;
wind_status = 1;
}else{
WIND=0;
wind_status = 0;
}
//湿度小于阈值打开加湿器
if(DHT_hum<humi_door){
HUM=1;
hum_status = 1;
}else{
HUM=0;
hum_status = 0;
}
//光照强度低于阈值打开补光灯
if(Light_Value<light_door){
LED=0;
led_status = 1;
}else{
LED=1;
led_status = 0;
}
//烟雾浓度大于阈值蜂鸣器报警
if(MQ2_Value>mq2_door){
BEEP = 1;
}else {
BEEP = 0;
}
}else{
BEEP=0;
}
}
// 温(0) 湿(1) 度(2) ℃(3) 光(4) 照(5) 强(6) 度(7) 烟(8) 雾(9) 浓(10) 度(11) 空(12) 气(13) 质(14) 量(15)
// 火(16) 焰(17) 状(18) 况(19) 有(20) 无(21) 阈(22) 值(23) 开(24) 关(25) 照(26) 明(27) 窗(28) 帘(29) 自(30) 手(31)
// 动(32) 加(33) 湿(34) 器(35) 风(36) 扇(37)
void OLED_Show_OnePage()
{
if(auto_mode == 1){
OLED_ShowChinese(16*6,0,30,16,1); //自
OLED_ShowChinese(16*7,0,32,16,1); //动
}else{
OLED_ShowChinese(16*6,0,31,16,1); //手
OLED_ShowChinese(16*7,0,32,16,1); //动
}
OLED_ShowChinese(16*0,0,0,16,1); //温
OLED_ShowChinese(16*1,0,2,16,1); //度
OLED_ShowChar(16*2,0,':',16,1);
OLED_ShowNum(16*2+8,0,DHT_temp,2,16,1);
OLED_ShowChinese(16*3+10,0,3,16,1); //℃
OLED_ShowChinese(16*0,16,1,16,1); //湿
OLED_ShowChinese(16*1,16,2,16,1); //度
OLED_ShowChar(16*2,16,':',16,1);
OLED_ShowNum(16*2+8,16,DHT_hum,2,16,1);
OLED_ShowString(16*3+10,16,"%RH",16,1);
OLED_ShowChinese(16*0,32,4,16,1); //光
OLED_ShowChinese(16*1,32,5,16,1); //照
OLED_ShowChinese(16*2,32,6,16,1); //强
OLED_ShowChinese(16*3,32,7,16,1); //度
OLED_ShowChar(16*4,32,':',16,1);
OLED_ShowNum(16*4+8,32,Light_Value,4,16,1);
OLED_ShowChinese(16*0,48,8,16,1); //烟
OLED_ShowChinese(16*1,48,9,16,1); //雾
OLED_ShowChinese(16*2,48,10,16,1); //浓
OLED_ShowChinese(16*3,48,11,16,1); //度
OLED_ShowChar(16*4,48,':',16,1);
OLED_ShowNum(16*4+8,48,MQ2_Value,4,16,1);
OLED_Refresh();
}
void OLED_Show_TwoPage()
{
uint8_t a,b,c,d;
if(option==1){a=0;b=1;c=1;d=1;}
else if(option==2){a=1;b=0;c=1;d=1;}
else if(option==3){a=1;b=1;c=0;d=1;}
else if(option==4){a=1;b=1;c=1;d=0;}
else{a=1;b=1;c=1;d=1;}
OLED_ShowChinese(16*0,0,0,16,1); //温
OLED_ShowChinese(16*1,0,2,16,1); //度
OLED_ShowChinese(16*2,0,22,16,1); //阈
OLED_ShowChinese(16*3,0,23,16,1); //值
OLED_ShowChar(16*4,0,':',16,1);
OLED_ShowNum(16*4+8,0,temp_door,3,16,a);
OLED_ShowChinese(16*0,16,1,16,1); //湿
OLED_ShowChinese(16*1,16,2,16,1); //度
OLED_ShowChinese(16*2,16,22,16,1); //阈
OLED_ShowChinese(16*3,16,23,16,1); //值
OLED_ShowChar(16*4,16,':',16,1);
OLED_ShowNum(16*4+8,16,humi_door,3,16,b);
OLED_ShowChinese(16*0,32,4,16,1); //光
OLED_ShowChinese(16*1,32,5,16,1); //照
OLED_ShowChinese(16*2,32,22,16,1); //阈
OLED_ShowChinese(16*3,32,23,16,1); //值
OLED_ShowChar(16*4,32,':',16,1);
OLED_ShowNum(16*4+8,32,light_door,4,16,c);
OLED_ShowChinese(16*0,48,8,16,1); //烟
OLED_ShowChinese(16*1,48,9,16,1); //雾
OLED_ShowChinese(16*2,48,22,16,1); //阈
OLED_ShowChinese(16*3,48,23,16,1); //值
OLED_ShowChar(16*4,48,':',16,1);
OLED_ShowNum(16*4+8,48,mq2_door,4,16,d);
OLED_Refresh();
}
void OLED_Show_ThreePage()
{
uint8_t a,b,c,d;
if(option==1){a=0;b=1;c=1;d=1;}
else if(option==2){a=1;b=0;c=1;d=1;}
else if(option==3){a=1;b=1;c=0;d=1;}
else if(option==4){a=1;b=1;c=1;d=0;}
else{a=1;b=1;c=1;d=1;}
OLED_ShowChinese(16*0,0,26,16,1); //照
OLED_ShowChinese(16*1,0,27,16,1); //明
OLED_ShowChar(16*2,0,':',16,1);
if(led_status==1)OLED_ShowChinese(16*2+8,0,24,16,a); //开
else OLED_ShowChinese(16*2+8,0,25,16,a); //关
OLED_ShowChinese(16*0,16,36,16,1); //风
OLED_ShowChinese(16*1,16,37,16,1); //扇
OLED_ShowChar(16*2,16,':',16,1);
if(wind_status==1)OLED_ShowChinese(16*2+8,16,24,16,b); //开
else OLED_ShowChinese(16*2+8,16,25,16,b); //关
OLED_ShowChinese(16*0,32,33,16,1); //加
OLED_ShowChinese(16*1,32,34,16,1); //湿
OLED_ShowChinese(16*2,32,35,16,1); //器
OLED_ShowChar(16*3,32,':',16,1);
if(hum_status==1)OLED_ShowChinese(16*3+8,32,24,16,c); //开
else OLED_ShowChinese(16*3+8,32,25,16,c); //关
OLED_ShowChinese(16*0,48,28,16,1); //窗
OLED_ShowChinese(16*1,48,29,16,1); //帘
OLED_ShowChar(16*2,48,':',16,1);
if(curtain_status==1)OLED_ShowChinese(16*2+8,48,24,16,d); //开
else OLED_ShowChinese(16*2+8,48,25,16,d); //关
OLED_Refresh();
}
七、项目资料包内容

资料获取:查看主页介绍“充哥单片机设计”
更多推荐
所有评论(0)