【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设计,视频分享,技术交流。

相关推荐
国科安芯4 小时前
模拟DCDC电源芯片ASP3605S引脚功能及控制环路分析
单片机·嵌入式硬件
ACP广源盛139246256736 小时前
GSV5100B@ACP#一种具有音频提取和插入功能的 2 进 2 出 HDMI2.0 中继器 / CAT 延长器
单片机·嵌入式硬件·音视频
藏,捉6 小时前
使用自己绘制的板子通过485与西门子PLC1214C通讯,控制舵机摇摆运动
单片机·工控·485通讯
kaikaile19956 小时前
基于DSP28335与AD7606的采样程序实现
单片机·嵌入式硬件
Joshua-a6 小时前
STM32嵌入式开发核心:volatile与寄存器操作详解
单片机·嵌入式硬件
顾安r8 小时前
11.22 脚本 手机termux项目分析(bash)
前端·python·stm32·flask·bash
国科安芯12 小时前
MCU芯片AS32A601与INA226芯片精确测量实现与应用
网络·单片机·嵌入式硬件·架构·安全性测试
一支闲人13 小时前
STM32 CAN外设1
stm32·单片机·嵌入式硬件·基础知识·cna协议
HanLop13 小时前
51单片机入门
单片机·嵌入式硬件·51单片机