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


所有评论(0)