基于ARM的餐厅点餐系统的设计与实现

基于ARM的餐厅点餐系统的设计与实现

系统简介

        本设计主要将 STM32F103ZET6 芯片作为无线订购系统主要控制芯片,分为顾客终端和厨师终端。顾客通过 LCD 显示屏浏览菜单并点击触摸屏选择自己所需菜单,并经过有线连接到 PC 端上位机,将订餐信息上传到餐厅内部数据库,实现数据更新和存储功能。同时点餐信息经过主蓝牙模块 HC-05 无线通信技术发送到厨师终端,厨师终端通过从蓝牙模块将菜单信息汇总到厨师终端显示屏幕上,然后厨师通过语音模块 LD3320 将处理过的菜单通过语音快速清除,完成餐厅点餐操作系统的整体功能。并经过多次测试,该系统的硬件模块功能和软件上位机及数据库数据的更新、存储功能已完成。

系统综述

        整个设计总体流程为:开始将硬件和软件准确连接,上电做准备工作,然后初始化硬件各个模块,顾客端界面打开,触屏点击选择菜单,菜单分上页和下页,选择完毕后,判断是否点击“确认”按钮,如果点击“确认”按钮,则通过主蓝牙发送,厨师端从蓝牙模块接收,将菜单传送到厨师端显示屏上,否则可以重新选择菜单。厨师端接收到菜单后,可以根据原材料的库存选择是否进行处理,如果原材料充足,厨师处理后,可以通过语音模块进行菜单清除,如果厨师选择不处理,可以进行反馈。最后将顾客菜单通过有线连接到点餐信息上位机上,进行菜单信息存储,物料剩余情况对比,更新,修改等操作,最终结束整个设计模块的工作。
基于ARM的餐厅点餐系统的设计与实现_第1张图片

系统流程

        本设计主要由五部分组成,分别为:STM32F103zet6战舰板控制板、TFT-LCD液晶显示器、蓝牙传输模块、语音模块、上位机。其中主控制器以 STM32F103zet6芯片作为主控模块,完成菜单点餐、信息传送和接收、信息确认等功能,保证点餐系统能够完整实现。TFTLCD显示屏运用Ili9341芯片进行管理的,主要是控制TFT-LCD显示屏上面显示点餐菜单信息、菜单确认信息、菜单传送信息(仅限于与蓝牙一定距离内);蓝牙传输模块hc-05实现客户方和厨师方之间的相接,进行点餐信息传达,完成菜单的传送、接收功能。语音模块LD3200是实现厨师端将处理过的菜单,通过语音将其菜单进行取消,更便于厨师端处理菜单,完成菜单处理过程。上位机实现餐厅管理员登录和密码修改功能,连接下位机配置环境、查询历史菜单、消费菜品等功能。
基于ARM的餐厅点餐系统的设计与实现_第2张图片

材料

硬件材料

  • 两块正点原子战舰V3开发板(带显示屏)
  • 两块HC05蓝牙模块
  • LD3320语音模块

软件材料

  • Keil 5
  • VS2017
  • MySQL数据库

展示视频

下位机视频

基于ARM的餐厅点餐系统下位机

上位机视频

基于ARM的餐厅点餐系统的设计与实现上位机

制作

        下位机使用的芯片是STM32F103ZET6,软件使用的是Keil,语言是C。

硬件连接

  1. LD3320语音模块连接
    基于ARM的餐厅点餐系统的设计与实现_第3张图片
  2. 客户端蓝牙连接USART3
  3. 厨师端蓝牙连接USART1
  4. 上位机连接客户端硬件(T口线。跳线帽要插上)

下位机制作

        本系统是以Cortex-M3 STM32F103zet6为主要控制芯片设计的餐厅点餐系统。硬件各个模块连接主要通过 USB串行口连接电脑电源给STM32F103zet6芯片供电,然后运用杜邦线将蓝牙主传输模块HC-05与顾客端控制器进行连接,控制点餐菜单的确认和发送。蓝牙从模块与厨师端控制器进行连接,将传输信息实时显示在TFTLCD液晶显示屏上,同时将语音模块也连接起来,两蓝牙之间可以进行无线菜单通信,并将顾客菜单信息传送到上位机,同时控制实时时钟将菜单点餐时间同步上传,组成完整的模拟餐厅点餐硬件系统。全部体系的硬件和软件系统测试是经由与PC机连线相结合的方法来完成的。软件通过运用Keil5软件进行C语言代码编写,编译完成之后通过USB转TTL串口调试工具,进行一键下载将程序烧录在STM32F103zet6芯片上,从STM32F103zet6派生的引脚连接到硬件外围设备,控制各部件正常工作。

基于ARM的餐厅点餐系统的设计与实现_第4张图片

蓝牙连接

        本设计核心就是使用蓝牙完成两个板子的菜单的信息传递功能,顾客进行点餐,与其相连的主蓝牙模块将菜单数据发送出去,然后通过与厨师端连接的从蓝牙模块的接收,将点餐的菜单显示到厨师端显示屏上,完成主从蓝牙模块的菜单通讯功能。

本设计通过AT指令设置将两蓝牙上电自动配对。 参考https://blog.csdn.net/weixin_42320020/article/details/88562539

AT    					进入AT指令模式
AT+RESET   				重启设备
AT+ORGL    				恢复默认状态
AT+ADDR?   			获取模块蓝牙地址(记下来像下边那样 两个)
AT+ROLE?   			查询模块角色
AT+ROLE=1或者AT+ROLE=0  一个设置为主角色  一个设置位从角色
AT+BIND=2018,12,140851  绑定蓝牙地址 注意是逗号  两个设备分别绑定对方地址
AT+CMODE=0   			两个设备都设置为指定蓝牙连接模式
AT+LINK=2018,12,141598  主设备去连接从设备 连接蓝牙地址  注意逗号

模块1+ADDR:2018:12:140851(不同设备ADDR地址不同,此地址为演示地址)
模块2+ADDR:2018:12:141598

按顺序输入以上指令即可。
请务必保证两蓝牙连接成功!!!代码中没有关于蓝牙的设置。

语音模块设计

        LD3320工作时,首先开始语言的ASR识别过程,由微程序控制器发出复位标志RSTB和中断标识。为了防止由于硬件问题导致识别的不正常,需要多次启动ASR识别过程来保证语言模块的识别过程可以正确的运行。然后进行初始化ASRLD_AsrStart()识别模块,初始化每个寄存器。将要识别的菜名词语添加到LD3320芯片识别列表中,发动识别并准备中断回应功能,以开启中断启用程序。若是芯片内部不正常,就重启语音识别芯片,重新初始化LD3320位置寄存器的识别流程。通过BA寄存器存储点餐菜单,并在数字寄存器和C5寄存器中搜索答案与原有寄存器存储的菜名词语进行比对,找到正确答案,完成菜单识别流程。

基于ARM的餐厅点餐系统的设计与实现_第5张图片
语音识别部分代码:

static uint8 LD_AsrAddFixed(void)
{
	uint8 k, flag;
	uint8 nAsrAddLength;
	#define DATE_A 9    //数组二维数值
	#define DATE_B 23		//数组一维数值
	//添加关键词,用户修改
	uint8  sRecog[DATE_A][DATE_B] = {
	 			"qing zheng pang xie",\
				"yang rou chuan",\
				"mu tang dan gao",\
				"la zi ji kuai",\
				"xi hong shi chao ji dan",\
				"qing cai ji dan mian",\
				"fu shou yu",\
				"zi shu zhou"\
		
	};	
	uint8  pCode[DATE_A] = {
	 															CODE_QZ,	\
																CODE_YR,	\
																CODE_MT,\
																CODE_LA,	\
																CODE_XH,		\
																CODE_QC, \
																CODE_FS, \
																CODE_ZS \
	};	//添加识别码,用户修改
	flag = 1;
	for (k=0; k<DATE_A; k++)
	{			
		if(LD_Check_ASRBusyFlag_b2() == 0)
		{
			flag = 0;
			break;
		}

		LD_WriteReg(0xc1, pCode[k] );
		LD_WriteReg(0xc3, 0);
		LD_WriteReg(0x08, 0x04);
		LD3320_delay(1);
		LD_WriteReg(0x08, 0x00);
		LD3320_delay(1);

		for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
		{
			if (sRecog[k][nAsrAddLength] == 0)
				break;
			LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
		}
		LD_WriteReg(0xb9, nAsrAddLength);
		LD_WriteReg(0xb2, 0xff);
		LD_WriteReg(0x37, 0x04);
	}	 
	return flag;
}
下位机整体逻辑软件设计

客户端点餐->厨师端收到->语音消除

整体逻辑部分代码:

void LD3320_main(void)
{
	LD3320_init();	  
	LCD_Clear(WHITE);	
	nAsrStatus = LD_ASR_NONE;//初始状态:没有在作ASR
	while(1)
	{
		sprintf(k_id,"%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d",bz[0],bz[1],bz[2],bz[3],bz[4],bz[5],bz[6],bz[7],bz[8],bz[9],bz[10],bz[11],bz[12],bz[13],bz[14],bz[15],bz[16],bz[17],bz[18],bz[19]);
		//LCD_ShowString(0,5,210,16,16,k_id);//点菜状态
		LCD_ShowString(0,5,210,16,16,"  Welcome come !");
		display();
		switch(nAsrStatus)
		{
			case LD_ASR_RUNING:
			case LD_ASR_ERROR:		
					break;
			case LD_ASR_NONE:
					nAsrStatus=LD_ASR_RUNING;
					if (RunASR()==0)//启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
					{		
						nAsrStatus = LD_ASR_ERROR;
					}
					break;
			case LD_ASR_FOUNDOK:
					 nAsrRes = LD_GetResult( );//一次ASR识别流程结束,去取ASR识别结果										 
					 //printf("\r\n识别码:%d", nAsrRes);			 
					 switch(nAsrRes)		   			//对结果执行相关操作,客户修改
						{
							case CODE_QZ:					
										if(bz[1]>0)bz[1]--;
															 break;
							case CODE_YR:	 					
										if(bz[2]>0)bz[2]--;
															 break;
							case CODE_MT:				
											if(bz[3]>0)bz[3]--;
															break;
							case CODE_LA:				
											if(bz[4]>0)bz[4]--;
															break;
							case CODE_XH:					
											if(bz[5]>0)bz[5]--;
															break;
							case CODE_QC:					
											if(bz[6]>0)bz[6]--;
															break;
							case CODE_FS:				
											if(bz[7]>0)bz[7]--;
															break;
							case CODE_ZS:				
											if(bz[8]>0)bz[8]--;
															break;
							default:break;
						}	
						LCD_Clear(WHITE);	
					nAsrStatus = LD_ASR_NONE;
					break;
			case LD_ASR_FOUNDZERO:
			default:
					nAsrStatus = LD_ASR_NONE;
					break;
			}//switch
		//开发板测试
		Board_text(nAsrRes );
	}// while
}

数据库制作

        数据库采用的是MySQL数据库。本设计上位机进行的数据更新需要连接名为本地服务器,数据库为“vs”。其中密码登陆界面和修改界面建立表“keytable”,包括数据类型name表示管理员用户名,PASSWORD表示餐厅管理员设置的密码;在工作区更新数据库饭菜品种时建立表“menu”,其中包含数据类型price表示每个对应菜品的价格,name
是菜的名字,Material表示做此菜品需要消耗的主要原材料,num便是该菜品耗损原材料所必要的数目;同时历史点菜记录建立表“Sales”,其中数据类型time表示顾客点餐菜单时间,name表示点餐菜名;建立表“Surplus”表示剩余原料,提供管理员有效的餐厅原材料储存情况,其中数据类型num表示剩余材料数量,name表示剩余材料名称;sumfood表就是餐厅顾客每个菜品点餐的总数量,num表示每个菜品点餐总数量,name表示菜品名称;建立表“shop”表示购物建议,num表示要进材料的数量,即也是消费的总数量,name表示要进材料的名称。同时在点击“已进货”选项时,剩余材料就会更新到初始原材料总的数量表示已进货。当点击“更新数据库”时,全表的数据也会更新,完成数据库数据的修改、存储功能。

数据库
基于ARM的餐厅点餐系统的设计与实现_第6张图片
数据库表
基于ARM的餐厅点餐系统的设计与实现_第7张图片基于ARM的餐厅点餐系统的设计与实现_第8张图片

上位机制作

        软件设计主要通过Visual Studio 2017软件编写餐厅管理系统上位机,连接数据库名字为“vs”。餐厅点餐管理系统上位机的设计首先需要进行闪屏欢迎界面,进行账号密码登陆,如果管理员名称和密码正确,就进入餐厅菜单主界面,而主界面又分为显示区和数据区,显示栏主要包括选择按钮,选择要查询的项目,如查询餐厅最近销售账单、最受欢迎菜品、历史账单等。而数据区主要完成数据的修改、更新操作。即当下位机顾客端进行点菜,消耗了餐厅原材料,通过有线连接到上位机,进行数据库数据的比对,对原有的数据需要进行增加、减少等更新操作,并最终显示出来,这就是上位机的工作区所承担的责任。完成整个系统操作,就结束了上位机软件的设计工作。

基于ARM的餐厅点餐系统的设计与实现_第9张图片

串口配置连接设计

        PC端和单片机数据传输需要通过串口连接。首先需要通过函数 toolstripTextBox1.Text 进行串口连接设置,检测串口连接所需的端口,可以进行端口选择,本设计连接的端口为“COM8”端口,设置的波特率与主顾客点餐端的波特率保持一致,为115200。当进行串口连接时,点击“打开串口”,如果连接成功,就提示“串口连接成功”,若是连接失败,就会提示“连接失败”,需要重新连接。假如连接出错,点击“断开连接”,窗口会提示“确定断开连接”如果确定,点击“是”,如果不确定,点击“否”就可以完成串口配置过程。
串口设计部分代码:

private void toolStripTextBox1_Click(object sender, EventArgs e)
{
    if (toolStripTextBox1.Text == "打开串口")
    {
        try
        {
            serialPort1.PortName = toolStripComboBox1.Text;
            serialPort1.BaudRate = Convert.ToInt32(toolStripComboBox2.Text);
            serialPort1.Open();
            toolStripTextBox1.Text = "关闭串口";
            MessageBox.Show("串口连接成功!");
        }
        catch
        {
            MessageBox.Show("连接串口失败!请检查端口!", "错误!");
        }                
    }
    else
    {
        if (MessageBox.Show("确认断开连接?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
        {
            try
            {
                serialPort1.Close();
                toolStripTextBox1.Text = "打开串口";
            }
            catch
            {
                MessageBox.Show("连接关闭失败!请检查端口!", "错误!");
            }
        }
    }                
}
连接数据库

连接数据库部分代码:

string Connectstr = "Data Source=.;Initial Catalog=vs;Integrated Security=True";
mysql = new SqlConnection(Connectstr);
SqlCommand Mycomm = new SqlCommand("Select * From keytable", mysql);
mysql.Open();
int intcont = Convert.ToInt32(Mycomm.ExecuteScalar());
mysql.Close();
if (intcont > 0)
{
    mysql.Open();
    SqlDataReader dr = Mycomm.ExecuteReader();
    if (dr.Read())
    {
        f1.Password = dr["password"].ToString().Trim();
        //label5.Text = f1.Password;
    }
    dr.Close();
    mysql.Close();
}

更新数据库部分代码:

SqlCommand Mycomm1 = new SqlCommand("update Surplus set num = 20 where name = '" + name + "'", mysql);
mysql.Close();
mysql.Open();
int i = Mycomm1.ExecuteNonQuery();
mysql.Close();
Mycomm1 = new SqlCommand("update Surplus set num = 5 where name ='鱼'", mysql);
mysql.Open();
Mycomm1.ExecuteNonQuery();
mysql.Close();
Mycomm1 = new SqlCommand("update Surplus set num = 5 where name = '紫薯'", mysql);
mysql.Open();
Mycomm1.ExecuteNonQuery();
mysql.Close();
上位机整体逻辑

        软件上位机功能实现有餐厅点餐管理员密码登陆,同时也能够进行密码更改。完成管理员密码登陆后,进行串口配置,连接成功后,才算完成了PC端与单片机的连接。然后进行剩余材料,历史菜单记录,购物建议,点菜总量、销售记录五个项目的查询,更新数据库操作。在此过程中,由于有历史菜单的记录,导致近期菜单记录需要进行搜索才能看到,因此在管理中加入了清空历史记录功能,可以更明确地看到最近餐厅的消费情况。最终完成数据库修改、增添、更新功能。

整体逻辑部分代码:

if (comboBox1.Text == "购物建议")
{
    int[] nd = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
    for (int m = 0; m < 8; m++)
    {
        string name = "青青子衿";
        if (m == 0) { name = "螃蟹"; }
        else if (m == 1) { name = "羊肉"; }
        else if (m == 2) { name = "鸡蛋"; }
        else if (m == 3) { name = "鸡肉"; }
        else if (m == 4) { name = "西红柿"; }
        else if (m == 5) { name = "面"; }
        else if (m == 6) { name = "鱼"; }
        else if (m == 7) { name = "紫薯"; }
        
        SqlCommand Mycomm = new SqlCommand("Select * From shop where name = '" + name + "'", mysql);
        mysql.Close();
        mysql.Open();
        int intcont = Convert.ToInt32(Mycomm.ExecuteScalar());
        mysql.Close();
        if (intcont >= 0)
        {
            mysql.Open();
            SqlDataReader dr = Mycomm.ExecuteReader();
            if (dr.Read())
            {
                nd[m] = Convert.ToInt16(dr["num"]);
                nd[m] = nd[m] + id2[m];
                id2[m] = 0;
                //textBox2.AppendText(nd[m].ToString() + " ");
            }
            dr.Close();
            mysql.Close();
            //textBox1.Text = "update shop set num = " + nd[m] + " where name = '" + name + "'";
            SqlCommand Mycomm1 = new SqlCommand("update shop set num = " + nd[m] + " where name = '" + name + "'", mysql);
            //label6.Text = textBox3.Text.Trim();
            mysql.Open();
            int i = Mycomm1.ExecuteNonQuery();
            mysql.Close();
        }
        else
        {
            MessageBox.Show("查询失败", "错误!");
        }
    }
}

总结

        在本设计中,完成了顾客通过LCD显示屏浏览菜单,并通过手指触摸点击屏幕选择菜单点餐,将点餐菜单消息传送到上位机,进行上位机连接,查询餐厅历史点餐记录,餐厅原材料的存储以及余额情况,根据餐厅销售状况,提供购买原材料建议完成数据库的数据更新和储存功能。同时顾客点餐信息通过主蓝牙模块发送到厨师端,厨师终端通过从蓝牙模块的接收,将点餐信息汇总到显示屏上,并通过语音模块将处理的菜单报出菜名进行清除,完成顾客菜单处理过程。本设计完成了该餐厅点餐系统简单的基础功能,还存在着需要完善提高的地方。例如,顾客终端的选择菜单界面,需要通过更精密的计算,将选择菜单按钮进行优化,实现点击菜名就可以完成菜名选择功能。同时顾客终端和厨师终端菜单的显示也有限,不能进行超过两页菜名的显示,需要进一步完善菜名显示,达到能够多页显示菜名,丰富餐厅菜单的选择。餐厅两终端的通讯距离也需要进一步改善,需要通过选择WIFI或者nrf2401增大通讯距离,能够使该系统应用到大型餐厅,确保菜单传输通信快速、高效。同时在软件设计中,界面只完成了简单的基本连接、查询功能,只有餐厅信息,没有与顾客的互动。在这里可以添加餐厅与客户的信息交流平台,提供客户反馈平台,接收客户对餐厅合理性意见等问题。该系统还存在着一些其它需要完善改进的地方,在今后的学习过程中,需要更全面、更细致的去完善。

资料源码地址https://download.csdn.net/download/weixin_42320020/88790551

禁止转载!!!

你可能感兴趣的:(STM32,单片机,嵌入式,arm开发)