【单片机毕业设计】【dz-684】基于 STM32 的语音交互式盲人智能水杯设计与实现
一、功能简介
项目名:基于 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;
}
}
更多推荐


所有评论(0)