一、功能简介

项目名:基于STM32智能家政机器人系统与设计
项目编号:dz-762
单片机:STM32F103C8T6
功能简介:
1、通过SU-03T语音识别模块可控制各类电器
2、通过一个继电器控制灯的开关(语音指令:开灯、关灯)、通过一个继电器控制风扇的开关(语音指令:打开空调、关闭空调)、通过一个继电器控制电视的开关(OLED显示屏模拟)(语音指令:打开电视、关闭电视)、通过步进电机正反转模拟窗帘的开关(语音指令:打开窗帘、关闭窗帘)
3、通过时钟模块DS1302设置空调开关时间,在设置时间内检测到环境温度大于设置的最大值,控制空调打开,空调打开1分钟后没有检测到人自动关闭空调;
4、通过WIFI模if块,手机端APP可远程控制各继电器。
5、通过光照检测模块检测当前环境中的光照强度,检测到光照大于设置的最小值,控制窗帘打开,否则关闭窗帘;
6、通过温度检测模块检测当前环境温度,通过人体热释电感应模块检测到人,温度较高自动打开空调,温度较低,自动关闭空调。
 

二、系统框图设计

绘制软件:VISIO
本设计以STM32F103c8t6单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了STM32F103c8t6单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。
输入由七部分组成,第一部分是温度检测模块,通过该模块检测当前环境的温度,第二部分是光照检测模块,通过该模块检测当前环境的光照强度;第三部分是时钟模块,通过该模块获取当前的时间;第四部分是人体热释电模块,通过该模块获取当前环境是否有人;第五部分是语音识别模块,通过该模块 可以语音控制各类电器;第六部分是按键模块,通过该模块可以切换界面、设置数值、切换工作模式等;第七部分是供电模块,通过该模块可给整个系统进行供电。
输出由三部分组成,第一部分是显示屏模块,用于模拟电视的开启和关闭;第二部分是继电器模块,通过三个继电器控制灯、风扇、OLED电视的开启和关闭;第三部分是步进电机模块,模拟窗帘的打开和关闭。
除此之外,WIFI模块既作为输入又作为输出,WIFI模块和手机进行连接,可以将监测的数据传输到用户手机端,用户也可以通过手机端发送指令设置各参数阈值,并能远程控制继电器的工作。
具体系统框图如图3.1所示。

三、51实物图

单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

 四、原理图

软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

 五、PCB图

由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。

两层板,上下覆铜接地。

六、部分程序展示

软件版本:keil5

逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
	if(time_begin_hour * 60 + time_begin_minute < time_end_hour * 60 + time_end_minute)	//开始时间小于结束时间
	{
		if(ds1302_buf[4] * 60 + ds1302_buf[5] > time_begin_hour * 60 + time_begin_minute && ds1302_buf[4] * 60 + ds1302_buf[5] < time_end_hour * 60 + time_end_minute)//当前时间在定时时间内
		{
			flag_alarm = 1;
		}
		else
		{
			flag_alarm = 0;
		}
	}
	else if(time_begin_hour * 60 + time_begin_minute > time_end_hour * 60 + time_end_minute)//开始时间大于结束时间
	{
		if(ds1302_buf[4] * 60 + ds1302_buf[5] > time_end_hour * 60 + time_end_minute && ds1302_buf[4] * 60 + ds1302_buf[5] < time_begin_hour * 60 + time_begin_minute)//当前时间不在定时时间内
		{
			flag_alarm = 0;
		}
		else
		{
			flag_alarm = 1;
		}
	}
	else
	{
		flag_alarm = 0;
	}
	
	if(temp_value > temp_max)											//温度超出最大值
	{
		if(flag_alarm == 1)													//在定时时间内
		{
			if(flag_kt == 0)
			{
				flag_temp = 0;
				RELAY_TF = 1;															//打开空调
				flag_begin_1min = 1;											//开始计时
				if(flag_end_1min == 1 && HUMAN == 1)			//计时完成且没有人情况下
				{
					RELAY_TF = 0;														//关闭空调
					flag_kt = 1;
				}
			}
			else if(HUMAN == 0)
			{
				flag_kt = 0;
			}
		}
		else
		{
			if(HUMAN == 0)														//有人情况下打开空调
			{
				RELAY_TF = 1;	
				flag_kt = 0;
			}
			else																			//不在定时时间内且没人并没有手动打开的情况下关闭空调
			{
				if(flag_temp == 0)
				{
					RELAY_TF = 0;
				}
			}
		}
	}
	else if(temp_value < temp_min)
	{
		RELAY_TF = 0;
	}
	else
	{
		if(flag_temp == 0)
		{
			RELAY_TF = 0;
		}
	}
	
	if(light_value > light_min)										//当光照大于最小值打开窗帘
	{
		flag_window = 1;
		flag_window_state = 0;
	}
	else
	{
		if(flag_window_state == 0)
		{
			flag_window = 0;
		}
	}

	if(flag_window == 1)													//执行开关窗帘操作
	{
		if(flag_bujin_state == 0)
		{
			flag_bujin_foreward = 1;
		}
	}
	else
	{
		if(flag_bujin_state == 1)
		{
			flag_bujin_reversal = 1;
		}
	}
	
	if(RELAY_OLED == 1)													//电视机第一次打开进行初始化并显示内容
	{
		if(flag_oled == 0)
		{
			Oled_Init();
			Oled_Clear_All();
			flag_oled = 1;
		}
		Oled_ShowCHinese(1,2,"我是电视机");
	}
	else
	{
		Oled_Clear_All();
		
		flag_oled = 0;
	}
	
	if(huart2_rx_data != 0x00)									//根据语音内容执行操作
	{
		switch(huart2_rx_data)
		{
			case 0x01:
				RELAY_ZM = 1;
				
			break;
			
			case 0x02:
				RELAY_ZM = 0;
			break;
			
			case 0x03:
				RELAY_TF = 1;
				flag_temp = 1;
			break;
						
			case 0x04:
				RELAY_TF = 0;
			break;
									
			case 0x05:
				RELAY_OLED = 1;
			break;
												
			case 0x06:
				RELAY_OLED = 0;
			break;
															
			case 0x07:
				flag_window = 1;
				flag_window_state = 1;
			break;
																		
			case 0x08:
				flag_window = 0;
				flag_window_state = 1;
			break;
			
			default:
			break;
		}
		huart2_rx_data = 0x00;
	}
		
	if(flag_finish_5s == 1)																		//5秒上传一次数据
  {
    flag_begin_5s = 0;
    Aliyun_Send_Data();
    flag_begin_5s = 1;
  }
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐