目录

一、设计背景和意义

1.1设计背景

1.2设计意义

二、实物效果展示

2.1实物图片

2.2实物演示视频

三、硬件功能简介

3.1项目功能详解

3.2元器件清单

四、主框图与软件流程图

五、硬件PCB展示

六、软件程序设计

七、项目资料包内容

         资料获取:查看主页介绍“充哥单片机设计”


一、设计背景和意义

1.1设计背景

        近年来,随着信息技术的快速发展,物联网(IoT)、嵌入式系统、人工智能以及无线通信等技术的不断融合,推动了智能家居系统从理论构想走向实际应用,成为现代生活中不可忽视的重要组成部分。智能家居系统通过对室内环境的感知、判断与控制,能够帮助用户实现远程操作、自动调节、安全预警等多种功能,从而显著提高居住的舒适性、安全性与生活效率。这种趋势不仅改变了人们的居住体验,也为新一代智能设备的研发提供了广阔的应用空间。尽管目前市面上已有不少成熟的智能家居产品,但大多数系统仍存在一些不容忽视的局限性。许多产品高度依赖品牌生态闭环,缺乏开放性和可定制性,用户很难根据自身实际需求对系统功能进行扩展或修改;其开发与维护成本较高,导致整套系统售价昂贵,难以在中低收入家庭及高校教学实践中广泛推广;还有当前主流的智能家居交互方式多以手机APP为主,虽然功能强大,却未能很好地照顾到老年人、儿童等对数字设备操作不熟悉群体的使用需求,交互方式的单一性成为影响用户体验的重要因素。

1.2设计意义

        基于以上背景,本课题提出设计并实现一套以STM32F103C8T6单片机为核心的智能家居语音控制系统,力求在功能、成本与用户体验之间取得合理平衡。该系统通过集成烟雾、温湿度、光照等环境传感器,实现对家庭环境状态的实时监测,系统利用ESP8266 WiFi模块接入机智云平台,使用户能够通过手机APP远程查看环境信息、控制家电设备,进而实现数据的远程获取与控制操作的分离。此外,通过引入ASRPRO语音识别模块,系统具备了本地语音识别与指令执行功能,为用户提供更为自然、高效的交互方式,无需依赖手机或物理按键即可完成设备控制。

        该课题的研究不仅具有明确的实用导向,也在技术融合和系统构建方面具备较强的工程实践价值。它涵盖了嵌入式系统开发、传感器应用、通信模块集成、物联网平台接入、语音识别技术等多个技术方向,是一次对智能控制系统综合开发能力的全面锻炼。同时,本系统采用成本低、模块化、可扩展的设计思路,适合在高校实验教学、智能硬件初创项目以及农村智能家居普及等场景中推广应用,具有良好的社会推广前景。

二、实物效果展示

2.1实物图片

2.2实物演示视频

【开源】基于STM32的智能家居语音控制系统

三、硬件功能简介

3.1项目功能详解

基于STM32的智能家居语音控制系统,项目简介:

  1. 传感器检测:检测烟雾浓度、光照强度、温湿度等数据。
  2. 数据显示:0.96OLED屏幕显示全部的传感器数据以及传感器的阈值等数据。
  3. 执行机构:控制LED灯、风扇、窗帘(步进电机模拟)。
  4. 语音控制:通过语音指令控制风扇、窗帘(步进电机)、LED灯光开关。
  5. 接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台。
  6. App远程监控:通过App远程获取全部传感器数据;App远程控制LED灯、风扇、步进电机。
  7. 阈值数据设定:系统通过按键设定阈值,也可以通过手机App远程设定。
  8. 模式切换:可以通过按键或者手机App实现自动/手动模式的切换。
  9. 手动模式:通过手机App控制LED灯、风扇、步进电机。
  10. 自动模式:检测的温度超过温度阈值会自动打开风扇,反之则关闭;检测到烟雾超过烟雾阈值自动开启声光报警;检测到光照强度超过光照阈值打开窗帘并且关灯。
  11. 历史数据记录:采集的传感器数据上传并记录在机智云平台,可以在云平台后台查看历史数据(手机App不具备此功能)。

3.2元器件清单

  1. 主控STM32F103C8T6
  2. 0.96OLED显示屏幕
  3. ESP8266联网WiFi
  4. DHT11温湿度传感器
  5. MQ-2烟雾传感器
  6. 光敏电阻
  7. LED灯
  8. 步进电机
  9. 蜂鸣器声光报警
  10. 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();
}

七、项目资料包内容

         资料获取:查看主页介绍“充哥单片机设计”

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐