一、功能简介

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

二、系统框图设计

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

三、32实物图

单片机型号:STM32F103C8T6

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

供电接口:TYPE-C

 四、原理图

软件版本:AD2013

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

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

 五、PCB图

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

两层板,上下覆铜接地。

六、部分程序展示

软件版本: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_huart1_ok == 1)
	{
		switch(huart1_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;
    }
		
		huart1_data = 0x00;
		flag_huart1_ok = 0;
	}
}

Logo

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

更多推荐