【STM32单片机】智能家居语音控制系统

文章目录


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用IIC OLED液晶、28BYJ48步进电机模块、

MQ-2烟雾传感器、DHT11温湿度、光敏传感器、按键模块、蜂鸣器、继电器模块

ESP8266 WIFI模块、ASRONE语音识别模块等。

主要功能:

系统运行后,OLED液晶显示环境温湿度、光照强度、烟雾以及窗户、空调、灯的

开关状态和模式状态;系统默认为自动模式,可通过K3键进入阈值设置模式,K3切换

阈值位置,K1和K2调节,K4确认。当检测温度高于上限,空调打开;温度低于下限,

空调关闭;当检测烟雾高于阈值,窗户打开,低于阈值,窗户关闭;

当光照强度低于阈值,打开灯,高于阈值关闭灯;

可通过K4键切换为手动模式,K1控制窗户开关,K2控制空调开关,K3控制灯开关;

系统将检测数据及设备状态通过ESP8266实时上传至机智云平台,可在电脑端机智云

或手机机智云APP端查看当前数据或控制设备状态、参数阈值和系统工作模式;

可通过语音识别模块控制系统,可通过语音"小智"唤醒语音模块,

通过指令"自动模式"、"手动模式"、"语音模式"切换不同控制模式;

指令"开窗"、"关窗"、"开空调"、"关空调"、"开灯"、"关灯"控制设备;


二、软件设计

c 复制代码
/*
作者:嗨小易(QQ技术交流群:570487280)

*/



//系统参数设置界面显示
void sys_parm_set_show(void)
{
	OLED_Clear();
	//温度阈值
	OLED_ShowFontHZ(0,0,0,16,1);
	OLED_ShowFontHZ(16,0,2,16,1);
	OLED_ShowFontHZ(16*2,0,16,16,1);
	OLED_ShowFontHZ(16*3,0,17,16,1);
	OLED_ShowString(16*4,0,":  -  C",16);
	//烟雾阈值
	OLED_ShowFontHZ(0,16,3,16,1);
	OLED_ShowFontHZ(16,16,4,16,1);
	OLED_ShowFontHZ(16*2,16,16,16,1);
	OLED_ShowFontHZ(16*3,16,17,16,1);
	OLED_ShowString(16*4,16,":  %",16);
	//光线阈值
	OLED_ShowFontHZ(0,32,5,16,1);
	OLED_ShowFontHZ(16,32,6,16,1);
	OLED_ShowFontHZ(16*2,32,16,16,1);
	OLED_ShowFontHZ(16*3,32,17,16,1);
	OLED_ShowString(16*4,32,":  %",16);
	
	OLED_Refresh_Gram();//刷新显示缓存
}

//系统数据获取
void sys_data_get(void)
{
	while(1)
	{
		//获取温湿度
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		//获取烟雾浓度
		sys_ctrl.gas=mq2_get_value(Get_ADC_Value(ADC_Channel_9,10));
		//获取光照强度
		sys_ctrl.light=99-Get_ADC2_Value(ADC_Channel_0,5)/41;
		
		break;
	}
}

//系统数据显示
void sys_data_show(void)
{
	while(1)
	{
		//正常模式显示
		if(sys_ctrl.mode==0)
		{
			//温度显示
			OLED_ShowNum(16*2+8,0,sys_ctrl.temp,2,16);
			//湿度显示
			OLED_ShowNum(16*2+8,16,sys_ctrl.humi,2,16);
			//烟雾显示
			OLED_ShowNum(16*2+8,32,sys_ctrl.gas,3,16);
			//光照强度
			OLED_ShowNum(16*2+8,48,sys_ctrl.light,2,16);
			
			//窗户开关状态显示
			if(sys_ctrl.win_flag==0)OLED_ShowFontHZ(16*7,0,15,16,1);
			else OLED_ShowFontHZ(16*7,0,14,16,1);
			//空调开关状态显示
			if(sys_ctrl.kt_flag==0)OLED_ShowFontHZ(16*7,16,15,16,1);
			else OLED_ShowFontHZ(16*7,16,14,16,1);
			//自动手动模式
			if(sys_ctrl.autoflag==0)OLED_ShowFontHZ(16*7,32,18,16,1);
			else OLED_ShowFontHZ(16*7,32,19,16,1);
			//灯开关状态显示
			if(sys_ctrl.led_flag==0)OLED_ShowFontHZ(16*7,48,15,16,1);
			else OLED_ShowFontHZ(16*7,48,14,16,1);
		}
		//参数设置模式显示
		else
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下
					//温度阈值
					OLED_ShowxNum(16*4+8,0,sys_ctrl.set_temp[0],2,16,0,0);
					OLED_ShowxNum(16*4+8*4,0,sys_ctrl.set_temp[1],2,16,0,1);
					//烟雾阈值
					OLED_ShowxNum(16*4+8,16,sys_ctrl.set_gas,2,16,0,1);
					//光线阈值
					OLED_ShowxNum(16*4+8,32,sys_ctrl.set_light,2,16,0,1);
					break;
				case 2://温度上
					OLED_ShowxNum(16*4+8,0,sys_ctrl.set_temp[0],2,16,0,1);
					OLED_ShowxNum(16*4+8*4,0,sys_ctrl.set_temp[1],2,16,0,0);
					break;
				case 3://烟雾阈值
					OLED_ShowxNum(16*4+8*4,0,sys_ctrl.set_temp[1],2,16,0,1);
					OLED_ShowxNum(16*4+8,16,sys_ctrl.set_gas,2,16,0,0);
					break;
				case 4://光线阈值
					OLED_ShowxNum(16*4+8,16,sys_ctrl.set_gas,2,16,0,1);
					OLED_ShowxNum(16*4+8,32,sys_ctrl.set_light,2,16,0,0);
					break;
			}
		}
		
		OLED_Refresh_Gram();//刷新显示缓存
		break;
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;
	
	key=KEY_Scan(0);
	//提示音
	if(key!=0)BEEP_Alarm(2,20000);
	
	
	//自动
	if(sys_ctrl.autoflag==0)
	{
		//参数设置
		if(key==KEY3_PRESS)
		{
			sys_ctrl.mode++;
			if(sys_ctrl.mode>4)sys_ctrl.mode=1;
			if(oneflag==0)
			{
				oneflag=1;
				sys_parm_set_show();//系统参数设置界面显示
			}
		}
		//加
		else if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 0://Air-link模式接入
					gizwitsSetMode(WIFI_AIRLINK_MODE);
					break;
				case 1://温度下
					sys_ctrl.set_temp[0]++;
					if(sys_ctrl.set_temp[0]>99)sys_ctrl.set_temp[0]=0;
					break;
				case 2://温度上
					sys_ctrl.set_temp[1]++;
					if(sys_ctrl.set_temp[1]>99)sys_ctrl.set_temp[1]=0;
					break;
				case 3://烟雾上
					sys_ctrl.set_gas++;
					if(sys_ctrl.set_gas>99)sys_ctrl.set_gas=0;
					break;
				case 4://光线下
					sys_ctrl.set_light++;
					if(sys_ctrl.set_light>99)sys_ctrl.set_light=0;
					break;
			}
		}
		//减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 0://WIFI复位
					gizwitsSetMode(WIFI_RESET_MODE);
					break;
				case 1://温度下
					sys_ctrl.set_temp[0]--;
					if(sys_ctrl.set_temp[0]<0)sys_ctrl.set_temp[0]=99;
					break;
				case 2://温度上
					sys_ctrl.set_temp[1]--;
					if(sys_ctrl.set_temp[1]<0)sys_ctrl.set_temp[1]=99;
					break;
				case 3://烟雾上
					sys_ctrl.set_gas--;
					if(sys_ctrl.set_gas<0)sys_ctrl.set_gas=99;
					break;
				case 4://光线下
					sys_ctrl.set_light--;
					if(sys_ctrl.set_light<0)sys_ctrl.set_light=99;
					break;
			}
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			if(sys_ctrl.mode==0)//手动
			{
				sys_ctrl.autoflag=1;
			}
			else
			{
				sys_ctrl.mode=0;
				oneflag=0;
				sys_open_show();//系统开机界面显示
			}
		}
	}
	//手动
	else
	{
		//窗户开关
		if(key==KEY1_PRESS)
		{
			sys_ctrl.win_flag=!sys_ctrl.win_flag;
		}
		//空调开关
		else if(key==KEY2_PRESS)
		{
			sys_ctrl.kt_flag=!sys_ctrl.kt_flag;
		}
		//灯开关
		else if(key==KEY3_PRESS)
		{
			sys_ctrl.led_flag=!sys_ctrl.led_flag;
		}
		//自动
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.autoflag=0;
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	static u8 oneflag=0;
	
	//自动控制
	if(sys_ctrl.autoflag==0)
	{
		//正常模式
		if(sys_ctrl.mode==0)
		{
			//如果温度高于上限,打开空调
			if(sys_ctrl.temp>sys_ctrl.set_temp[1])
			{
				sys_ctrl.kt_flag=1;
			}
			//如果温度低于下限,关闭空调
			else if(sys_ctrl.temp<sys_ctrl.set_temp[0])
			{
				sys_ctrl.kt_flag=0;
			}
			
			//如果烟雾浓度高于上限,打开窗户
			if(sys_ctrl.gas>sys_ctrl.set_gas)
			{
				sys_ctrl.win_flag=1;
			}
			else sys_ctrl.win_flag=0;
			
			//如果光线低于下限,打开灯
			if(sys_ctrl.light<sys_ctrl.set_light)
			{
				sys_ctrl.led_flag=1;
			}
			else sys_ctrl.led_flag=0;
		}
	}
	
	
	//语音识别模块控制
	switch(USART2_RX_BUF[0])
	{
		case 0x01://自动模式
			sys_ctrl.autoflag=0;
			break;
		case 0x02://手动模式
			sys_ctrl.autoflag=1;
			break;
		case 0x09://语音模式
			sys_ctrl.autoflag=1;
			break;
	}
	//手动模式控制
	if(sys_ctrl.autoflag==1)
	{
		switch(USART2_RX_BUF[0])
		{
			case 0x03://开窗
				sys_ctrl.win_flag=1;
				break;
			case 0x04://关窗
				sys_ctrl.win_flag=0;
				break;
			case 0x05://开空调
				sys_ctrl.kt_flag=1;
				break;
			case 0x06://关空调
				sys_ctrl.kt_flag=0;
				break;
			case 0x07://开灯
				sys_ctrl.led_flag=1;
				break;
			case 0x08://关灯
				sys_ctrl.led_flag=0;
				break;
		}
	}
	if(USART2_RX_BUF[0]!=0)USART2_RX_BUF[0]=0;
	

	//空调控制
	if(sys_ctrl.kt_flag==1)KT_PIN=1;
	else KT_PIN=0;
	//灯控制
	if(sys_ctrl.led_flag==1)LED_PIN=0;
	else LED_PIN=1;
	//窗户控制
	if(sys_ctrl.win_flag==1)
	{
		//原本关闭窗户,开窗
		if(oneflag==0)
		{
			oneflag=1;
			Step_Motor_Run(8,sys_ctrl.win_flag,STEPMOTOR_MAXSPEED,180,1);
		}
	}
	else 
	{
		//原本打开窗户,关闭
		if(oneflag==1)
		{
			oneflag=0;
			Step_Motor_Run(8,sys_ctrl.win_flag,STEPMOTOR_MAXSPEED,180,1);
		}
	}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619


联系作者

视频地址:https://space.bilibili.com/444388619/video

专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

相关推荐
Jcenav8 小时前
OCXO外围电路设计指南
单片机·嵌入式硬件
神圣的大喵8 小时前
平台无关的嵌入式通用按键管理器
c语言·单片机·嵌入式硬件·嵌入式·按键库
三佛科技-134163842128 小时前
FT8353系列(FT8353A/B/C/CD/DD/K/KD/PD)隔离型LED恒流驱动IC芯片 典型应用电路
单片机·物联网·智能家居·pcb工艺
无人装备硬件开发爱好者9 小时前
深度解析:STM32 MDK 工程 HEX 文件转 BIN 文件 —— 原理、方法、优缺点与实战指南(中)
stm32·嵌入式软件·hex2bin
阿拉斯攀登9 小时前
嵌入式-硬件基础:了解三极管
单片机·嵌入式硬件·三极管
逐步前行9 小时前
C51_74HC165并口转串口
单片机·51单片机
HarrySunCn10 小时前
如何使用VSCode开发Arduino项目
ide·vscode·单片机·编辑器
嵌入式的飞鱼10 小时前
SD NAND 焊接避坑指南:LGA-8 封装手工焊接技巧与常见错误
人工智能·stm32·单片机·嵌入式硬件·tf卡
三佛科技-1341638421210 小时前
LN8K05A/B/C_5V非隔离AC-DC电源芯片 典型应用场景、典型电路、与阻容降压的对比分析
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
阿拉斯攀登11 小时前
51单片机:点灯程序的底层拆解
单片机·嵌入式硬件·51单片机