基于STM32的智能点餐系统

提示:记录2022年4月做的毕设4

前言

基于STM32的智能点餐系统,主控使用STM32F103C8T6核心板


  • 针对传统就餐点餐流程出现的问题,进行需求分析,对点餐流程和功能模块 进行分析,设计一款以单片机为主控器的智能点餐系统。该系统结合红外线传感器、嵌入式芯片、无线传感器、语音模块等设备,把点餐数据传输到服务器。
  • 智能餐厅由手机终端APP与智能管理终端机两部分组成,拥有实时的快餐制作的流程、提前预约、支持线上线下支付、实时评价、建议采集等功能,从而减少人力成本,方便客户享受快节奏、高品质的就餐点餐服务。

一、功能要求:

  • 基于单片机系统设计点餐系统,
  • 实现前台点餐,后台可以看到
  • 实现后台做好菜品,前台可以收到通知

二、代码思路

  • 打开定时器2,作为系统运行时间;
  • esp8266每2.5S刷新一次;
  • dht11每1s刷新一次;
  • OLED每2s刷新一次;

三、硬件说明


  • 系统启动后,会有“MyPro”这个WiFi,用手机网络助手连接上,

  • ip地址:192.168.1.1 ,端口8080

  • 引脚连接:

  •         ESP8266:	EN		B0
      					RST		B1
      					RX		B10  
      					TX		B11		
      			
            OLED:      D0    PA5(SCL1)
              			D1    PA7(SDA1)
               			RES   PB7
              			DC    PA4
              			CS    PA6 
    

    • @attention 1、提供给ESP8266的电压(3-4v)或者电流不够时,连接wifi会失败
    • 实验平台:STM32C8T6核心板

四、代码以及框图等资料

//前台代码
int main(void)
{
while(1)
{

	while(systeminit)
	{
		//OLED_Clear();
    key=KEY_Scan(0);	//得到键值
	  if(key)
		{
			switch(key)
			{				 
				case WKUP_PRES:
					OLED_Clear();					
					table();
				  table_num++;				
					break;
				case KEY2_PRES:
          OLED_Clear();	
					table_num--;	
				  table();
					break;
				case KEY1_PRES:
					systeminit=0;
				  OLED_ShowString(20,6,"Waiting...",16);
					delay_ms(1000);
				  OLED_Clear();
				  show_page1();
					break;
				case KEY0_PRES:
					break;
			}
		}
		else delay_ms(2);	
	}
	
	
	
	/*****************************************************/
	//以下是选菜界面
	/*****************************************************/
	
	while(!systeminit)
	{	
		key3=Yu_Scan(0);	//得到键值
	  if(key3)
		{
			switch(key3)
			{				 
				case YuYin1_PRES:
					send_dat(1);
					food1++;			
					break;
				case YuYin2_PRES:
					send_dat(2);					
					food2++;			
					break;
				case YuYin3_PRES:	
					send_dat(3);
					food3++;
					break;
				case YuYin4_PRES:
					send_dat(4);					
					food4++;				
					break;
				case YuYin5_PRES:	
          send_dat(5);					
					food5++;			
					break;
				case YuYin6_PRES:	
				  send_dat(6);
					food6++;				
					break;
			}
		}
		else delay_ms(1);




		
		/*****************************************************/
		//以下是更新数量,标题,价格
		/*****************************************************/
	  if(!jiezhang)
		{
			show_caption();
			switch(page)
			{				 
				case 1:	
					OLED_ShowNum(74,3,food1,1,16);
					OLED_ShowNum(74,6,food2,1,16);
				
				  OLED_ShowNum(110,3,food1_m,2,16);
					OLED_ShowNum(110,6,food2_m,2,16);
					break;
				case 2:	
					OLED_ShowNum(74,3,food3,1,16);
					OLED_ShowNum(74,6,food4,1,16);
				
				  OLED_ShowNum(110,3,food3_m,2,16);
					OLED_ShowNum(110,6,food4_m,2,16);
					break;
				case 3:
					OLED_ShowNum(74,3,food5,1,16);
					OLED_ShowNum(74,6,food6,1,16);
				
				  OLED_ShowNum(110,3,food5_m,2,16);
					OLED_ShowNum(110,6,food6_m,2,16);
					break;
			}			
		}		
		
		
		/*****************************************************/
		//以下是按键
		/*****************************************************/	
    key=KEY_Scan(0);	//得到键值
	  if(key)
		{
			switch(key)
			{
				case WKUP_PRES:	
				  if(page==1)
					{
						switch(choose)
						{
							case 1 : 
								food1++;
							  send_dat(1);
								//ESP8266_SendString ( DISABLE, send_str1, strlen ( send_str1 ), ( ENUM_ID_NO_TypeDef ) 0 );
								break;
							case 2 : 
								food2++;
							  send_dat(2);
							  //ESP8266_SendString ( DISABLE, send_str2, strlen ( send_str2 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
						}
					}
					else if(page==2)
					{
						switch(choose)
						{
							case 1 : 
								food3++;
							  send_dat(3);
								//ESP8266_SendString ( DISABLE, send_str3, strlen ( send_str3 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
							case 2 : 
								food4++;
							  send_dat(4);
								//ESP8266_SendString ( DISABLE, send_str4, strlen ( send_str4 ), ( ENUM_ID_NO_TypeDef ) 0 ); 
							  break;
						}
					}
					else if(page==3)
					{
						switch(choose)
						{
							case 1 : 
								food5++; 
							  send_dat(5);
								//ESP8266_SendString ( DISABLE, send_str5, strlen ( send_str5 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
							case 2 : 
								food6++;
							  send_dat(6);
								//ESP8266_SendString ( DISABLE, send_str6, strlen ( send_str6 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
						}							
					}	
					break;

					
				case KEY2_PRES:

				  if(page==1)
					{
						switch(choose)
						{
							case 1 : 
								food1--;
								send_dat(7);
								//ESP8266_SendString ( DISABLE, send_str7, strlen ( send_str7 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
							case 2 : 
								food2--;
								send_dat(8);
								//ESP8266_SendString ( DISABLE, send_str8, strlen ( send_str8 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
						}						
					}
					else if(page==2)
					{
						switch(choose)
						{
							case 1 : 
								food3--;
								send_dat(9);
								//ESP8266_SendString ( DISABLE, send_str9, strlen ( send_str9 ), ( ENUM_ID_NO_TypeDef ) 0 );
  							break;
							case 2 : 
								food4--; 
								send_dat(10);
								//ESP8266_SendString ( DISABLE, send_str10, strlen ( send_str10 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
						}							
					}
					else if(page==3)
					{
						switch(choose)
						{
							case 1 : 
								food5--;
							  send_dat(11);
								//ESP8266_SendString ( DISABLE, send_str11, strlen ( send_str11 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
							case 2 : 
								food6--; 
							  send_dat(12);
								//ESP8266_SendString ( DISABLE, send_str12, strlen ( send_str12 ), ( ENUM_ID_NO_TypeDef ) 0 );
							  break;
						}							
					}	
					break;
			

				case KEY1_PRES:		
				  page++;
				  if(page>3)page=1;
				  if(page==1)
					{ 
						show_page1();
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
						break;
					}
					else if(page==2)
					{
						show_page2();
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
					}
					else if(page==3)
					{
						show_page3();	
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
					}
					break;

					
				case KEY0_PRES:
					page--;
				  if(page<1)page=3;
				  if(page==3)
					{
						show_page1();
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
						break;
					}
					else if(page==2)
					{ 
						show_page2();
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
					}
					else if(page==3)
					{
						show_page3();	
						//if(choose==1)			OLED_ShowString(68,3,"*",16);
						//else if(choose==2)OLED_ShowString(68,6,"*",16); 
					}
					break;	
			}
		}
		else delay_ms(2);	


		/*****************************************************/
		//以下是按键
		/*****************************************************/	
    key2=KEY_Scan2(0);	//得到键值
	  if(key2)
		{
			switch(key2)
			{
				case WKUPUP_PRES:
			    choose++;
				  if(choose>2)choose=1;
				  switch(choose)
					{
						case 1 : 
							OLED_Clear(); 
							if(page==1)show_page1();
							else if(page==2)show_page2();
							else if(page==3)show_page3();	
							OLED_ShowString(106,3,"*",16); 
						  break;
						case 2 : 
							OLED_Clear(); 
							if(page==1)show_page1();
							else if(page==2)show_page2();
							else if(page==3)show_page3();	
							OLED_ShowString(106,6,"*",16);
						  break;
					}
					break;
					
				case KEY22_PRES:
					jiezhang=1;
					if(jiezhang)
					{
						OLED_Clear(); 
						show_page4();
					  LED_F=1;
				    delay_ms(1000);delay_ms(1000);
					  LED_F=0;						
					}									
					break;		

				case KEY11_PRES:
          OLED_Clear();
          table();
					food1=0;food2=0;food3=0;food4=0;food5=0;food6=0;				
					jiezhang=0;
				  table_num=1;
          systeminit=1;
					break;
					
				case KEY00_PRES:
					LED=!LED;					
					break;	
			}
		}
		else delay_ms(2);			

	
		/*****************************************************/
		//以下是ESP8266向PC发送数据,每1s发送一次
		/*****************************************************/	
	
		if(esp_flag==1)
		{
			esp_flag=0;
			//LED=!LED;		
			//类似于c语言中向屏幕打印的printf
			//这里是将第二、三个参数打印到第一个参数的字符串中	
			ESP8266_SendString ( DISABLE, send_str, strlen ( send_str ), ( ENUM_ID_NO_TypeDef ) 0 );
		}
		
		/*****************************************************/
		//以下是接收ESP8266数据
		/*****************************************************/				
		strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';
		revStr=strEsp8266_Fram_Record .Data_RX_BUF;				
		if(strstr(revStr, ":c"))
			continue;		
		strtok(revStr, ":");
		revStr=strtok(NULL, ":");		
		// 这里判断缓存内
		if(revStr!=NULL)
		{
			if(*revStr=='M')
			{
				OLED_Clear(); 				
				food1_change=!food1_change;
				show_page1();
			}
			else if(*revStr=='N')
			{
				OLED_Clear(); 				
				food2_change=!food2_change;
				show_page1();
			}
		}
	}
}

}


void show_caption(void)
{
  //名称、数量、价格
	OLED_ShowCHinese(2,0,46);
	OLED_ShowCHinese(18,0,47);
	
	OLED_ShowCHinese(48,0,48);
	OLED_ShowCHinese(64,0,49);
	
	OLED_ShowCHinese(96,0,44);
	OLED_ShowCHinese(112,0,45);
}

void Show_Chinese(void)
{
	OLED_ShowCHinese(0,3,8);
	OLED_ShowCHinese(18,3,11);
	OLED_ShowCHinese(64,3,9);
	OLED_ShowCHinese(82,3,11);
	
	OLED_ShowCHinese(0,6,10);
	OLED_ShowCHinese(18,6,11);
	OLED_ShowCHinese(64,6,12);
	OLED_ShowCHinese(82,6,13);

}

void show_page1()
{		
	OLED_Clear();
	show_caption();
	//鱼香肉丝/麻婆豆腐
	if(food1_change>=1)
	{
		OLED_ShowCHinese(0 ,3,8);
		OLED_ShowCHinese(18,3,9);
		OLED_ShowCHinese(36,3,10);
		OLED_ShowCHinese(54,3,11);
	}
	else
	{
		OLED_ShowCHinese(0 ,3,34);
		OLED_ShowCHinese(18,3,35);
		OLED_ShowCHinese(36,3,36);
		OLED_ShowCHinese(54,3,37);		
	}

	//辣子鸡丁/红烧茄子
	if(food2_change>=1)
	{	
		OLED_ShowCHinese(0 ,6,12);
		OLED_ShowCHinese(18,6,13);
		OLED_ShowCHinese(36,6,14);
		OLED_ShowCHinese(54,6,15);
	}
	else
	{
		OLED_ShowCHinese(0 ,6,40);
		OLED_ShowCHinese(18,6,41);
		OLED_ShowCHinese(36,6,42);
		OLED_ShowCHinese(54,6,43);		
	}
}


void show_page2()
{		
	OLED_Clear();
	show_caption();
	OLED_ShowCHinese(0 ,3,16);
	OLED_ShowCHinese(18,3,17);
	OLED_ShowCHinese(36,3,18);
	OLED_ShowCHinese(54,3,19);
	                 
	OLED_ShowCHinese(0 ,6,20);
	OLED_ShowCHinese(18,6,21);
	OLED_ShowCHinese(36,6,22);
	OLED_ShowCHinese(54,6,23);
}
void show_page3()
{
	OLED_Clear();
	show_caption();
	OLED_ShowCHinese(0 ,3,24);
	OLED_ShowCHinese(18,3,25);
	OLED_ShowCHinese(36,3,26);
	OLED_ShowCHinese(54,3,27);

	OLED_ShowCHinese(0 ,6,28);
	OLED_ShowCHinese(18,6,29);
	OLED_ShowCHinese(36,6,30);
	OLED_ShowCHinese(54,6,31);
}

void show_page4()
{	
	OLED_Clear();
	//点餐系统
	OLED_ShowCHinese(0,0,0);
	OLED_ShowCHinese(16,0,1);
	OLED_ShowCHinese(96,0,6);
	OLED_ShowCHinese(112,0,7);
	//x号总价
	OLED_ShowNum(2,3,table_num,3,16);
	OLED_ShowCHinese(32,3,39);
	OLED_ShowCHinese(50,3,32);
	OLED_ShowCHinese(68,3,33);
	OLED_ShowString(94,3,":",16);
	
	count = food1*food1_m + food2*food2_m + food3*food3_m + food4*food4_m + food5*food5_m + food6*food6_m;
	OLED_ShowNum(84,3,count,4,16);
}

void table()
{
	//点餐系统
	OLED_Clear();
	OLED_ShowCHinese(0,0,0);
	OLED_ShowCHinese(16,0,1);
	OLED_ShowCHinese(96,0,6);
	OLED_ShowCHinese(112,0,7);	
	
  OLED_ShowCHinese(20,3,38);
	OLED_ShowCHinese(40,3,39);
	
	OLED_ShowNum(80,3,table_num,4,16);
}
//联系我
//承接stm32单片机、STC系列单片机设计、嵌入式
//问题联系QQ:2424644692
//某宝店铺,搜:“晖亿科创”

链接: 提取码:vqv0

喜欢请点赞哦!

在这里插入图片描述

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值