一、基本介绍

项目名:基于 STM32 的语音交互式盲人智能水杯设计与实现
项目编号:mcuclub-dz-684
单片机:STM32F103C8T6
功能简介:
1、通过语音识别模块SU-03T控制水杯加热、制冷、播报当前的水温水位;
2、通过语音播报模块CN-TTS播报当前的水温水位、当前加热加热制冷状态;
3、通过显示模块OLED显示当前的水温水位、加热制冷的开关;
4、通过温度检测模块DS8B20检测当前水杯中的水温;
5、通过水位监测模块YW-0J监测当前水杯中的水位,没水时不进行加热、制冷,并语音提醒;
5、通过按键设置温度上下限,设置时通过语音播报;
6、通过WiFi模块将监测的水位水温传输到手机端,手机可以设置水温的最大值和最小值,控制加热和制冷继电器的开关

二、资料总览

实物资料

请添加图片描述

三、32单片机部分资料展示

1、实物图展示

单片机型号:STM32F103C8T6
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
请添加图片描述

2、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
请添加图片描述

3、PCB图展示

由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
请添加图片描述

四、系统框图

绘制软件:VISIO
请添加图片描述
本设计以STM32F103C8T6单片机为核心控制器,加上其他的模块一起组成盲人水杯系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STM32F103C8T6单片机,其主要作用是获取输入的部分数据,经过内部处理,控制输出部分。输入由四部分组成,第一部分是温度检测模块,通过该模块检测当前温度值;第二部分是液位检测模块,通过该模块检测当前液位值;第三部分是按键模块,通过按键设置阈值、切换界面;第四部分是语音识别模块,通过语音指令进行相应播报或者操作;第五部分是供电模块,通过该模块可给整个系统进行供电。输出由三部分组成,第一部分是通过OLED显示屏显示数据,显示温度值、液位值;第二部分是语音播报模块,通过该模块播报界面信息;第三部分是继电器控制电路,通过两个继电器分别控制加热和制冷;除此之外,WIFI模块将检测的数据传输到手机端也可以远程控制加热和制冷的开关;系统框图如图3.1所示。

五、部分程序展示

软件版本:keil5
注意:逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
	if(display_num == 0)								  										//测量界面
	{
		if(liquid_value > 10)							//有水时
		{
			flag_en = 0;
			if(temp_value > temp_max)												//水温值大于最大值,进行制冷
			{
				RELAY_ZL = 1;
				RELAY_JR = 0;
				flag_temp = 0;
				
				if(flag_once == 0)
				{
					Huart2_Send_Str("打开制冷");
					flag_once = 1;
				}
			}
			else if(temp_value < temp_min)									//水温值小于最小值,进行加热
			{
				RELAY_JR = 1;
				RELAY_ZL = 0;
				flag_temp = 0;
				
				if(flag_once == 0)
				{
					Huart2_Send_Str("打开加热");
					flag_once = 1;
				}
			}
			else																						//水温在区间之内,关闭制冷和加热
			{
				if(flag_temp == 0)
				{
					RELAY_JR = 0;
					RELAY_ZL = 0;
				}
				
				if(flag_once == 1)
				{
					Huart2_Send_Str("关闭加热制冷");
					flag_once = 0;
				}
			}
		}
		else																							//无水时,关闭制冷和加热
		{
			RELAY_JR = 0;
			RELAY_ZL = 0;
			if(flag_en == 0)
			{
				Huart2_Send_Str("杯中已无水请加水");
				flag_en = 1;
			}
			flag_once = 0;
		}
	}
	else																	//设置界面,关闭制冷和加热
	{
		RELAY_JR = 0;
		RELAY_ZL = 0;
		flag_once = 0;
		flag_en = 0;
		flag_temp = 0;
	}
	
	if(flag_huart3_ok == 1)
	{
		switch(huart3_data)
    {
      case (0x01):								      		//指令:打开加热
				if(display_num == 0)
				{
					if((liquid_value > 10) && (temp_min <= temp_value && temp_value <= temp_max))
					{
						RELAY_JR = 1;
						RELAY_ZL = 0;
						flag_temp = 1;
						Huart2_Send_Str("已为您打开");
					}
					else
					{
						if(liquid_value <= 10)
						{
							Huart2_Send_Str("杯中已无水,无法打开");
						}
						else if(temp_value > temp_max)
						{
							Huart2_Send_Str("温度过高,无法打开");
						}
						else if(temp_value < temp_min)
						{
							Huart2_Send_Str("加热已打开");
						}
					}
				}
				else
				{
					Huart2_Send_Str("当前处在设置模式,无法打开");
				}
      break;
      
      case (0x02):									      		//指令:关闭加热
				if(temp_min <= temp_value && temp_value <= temp_max)
				{
					RELAY_JR = 0;
					Huart2_Send_Str("已为您关闭");
				}
				else
				{
					if(temp_value < temp_min)
					{
						Huart2_Send_Str("温度过低,无法关闭");
					}
				}
      break;
      
      case (0x03):									      		//指令:打开制冷
				if(display_num == 0)
				{
					if((liquid_value > 10) && (temp_min <= temp_value && temp_value <= temp_max))
					{
						RELAY_ZL = 1;
						RELAY_JR = 0;
						flag_temp = 1;
						
						Huart2_Send_Str("已为您打开");
					}
					else
					{
						if(liquid_value <= 10)
						{
							Huart2_Send_Str("杯中已无水,无法打开");
						}
						else if(temp_value < temp_min)
						{
							Huart2_Send_Str("温度过低,无法打开");
						}
						else if(temp_value > temp_max)
						{
							Huart2_Send_Str("制冷已打开");
						}
					}
				}
				else
				{
					Huart2_Send_Str("当前处在设置模式,无法打开");
				}
      break;
      
      case (0x04):									      		//指令D:关闭制冷
				if(temp_min <= temp_value && temp_value <= temp_max)
				{
					RELAY_ZL = 0;
					Huart2_Send_Str("已为您关闭");
				}
				else
				{
					if(temp_value > temp_max)
					{
						Huart2_Send_Str("温度过高,无法关闭");
					}
				}
      break;
				
			case (0x05):									      		//指令:当前水温
				Huart2_Send_Str("水温%.1f摄氏度",temp_value);
      break;
				
			case (0x06):									      		//指令:当前水位
				Huart2_Send_Str("水位百分之%d",liquid_value);
      break;

			default:
			break;
    }
		
		huart3_data = 0x00;
		flag_huart3_ok = 0;
	}
	
	if(flag_finish_5s == 1)																		//5秒上传一次数据
  {
    flag_begin_5s = 0;
    Aliyun_Send_Data();
    flag_begin_5s = 1;
  }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐