如何使用Arduino构建餐厅智能点餐系统

安全设备/系统

155人已加入

描述

  如今的自动化系统无处不在,无论是家庭、办公室还是任何大行业,都配备了自动化系统。餐厅/酒店也在采用最近的自动化趋势,并正在安装机器人来交付食物和平板电脑以接受订单。使用平板电脑等数字菜单卡,客户可以轻松选择项目。该信息将被发送到餐厅的厨房并显示在显示屏上。

  在这个项目中,我们正在使用 Arduino、TFT 显示器和 433MHz 射频发射器/接收器模块构建一个智能餐厅项目。这里的发射器部分将由 Arduino Uno、TFT 显示器和一个射频发射器组成,客户可以使用它来选择食品并下订单。而接收器部分由 Arduino Uno、LCD 模块、RF 接收器和蜂鸣器组成,它们将安装在餐厅厨房中以跟踪订单物品。

  所需组件

  阿杜诺乌诺 (2)

  433MHz 射频发射器和接收器

  2.4“ TFT LCD 触摸屏

  16*2液晶模组

  I 2 C 模块

  将 TFT LCD 触摸屏与 Arduino 连接

  2.4” TFT LCD Touch shield 是一款多色 Arduino UNO/ Mega 兼容 TFT 显示器,带有触摸屏和 SD 卡插槽。此 TFT 显示模块具有明亮的背光和彩色 240X320 像素显示屏。它还由单独的 RGB 组成像素控制,使其具有比黑白显示器更好的分辨率。

  将 TFT 显示器与 Arduino 连接非常简单,在前面的教程中进行了说明。您只需将 TFT 显示屏安装在 Arduino Uno 板上,如下图所示。

菜单设计

  电路原理图

  智能餐厅菜单订购系统项目由射频发射器和接收器部分组成。发送端和接收端都使用 Arduino Uno 进行数据处理。我们之前使用与 Arduino 相同的 433 MHz 射频模块来构建无线门铃、手势控制机器人等项目。发射器和接收器部分的电路图如下所示。

  发射器部分电路

  该项目的发射器部分由一个 Arduino Uno、RF 发射器和 TFT 显示屏组成。此部分用于从 TFT 显示屏上显示的菜单进行订购。Arduino Uno 是发送端的大脑,处理所有数据,RF 发送模块用于将选定的数据传输到接收端。RF发射模块的数据引脚连接到Arduino的数字引脚12,而V CC和GND引脚连接到Arduino的5V和GND引脚。

菜单设计

菜单设计

  接收部分电路

  本项目的接收器部分由一个Arduino Uno、RF接收器、16*2 LCD模块和I2C模块组成。RF接收器用于接收来自发射器部分的数据,LCD模块用于显示接收到的数据。每当下新订单时,都会使用蜂鸣器发出声音。RF 接收器的数据引脚连接到 Arduino 的数字引脚 11,而 V CC和 GND 引脚连接到 Arduino 的 5V 和 GND 引脚。Buzzer的正极接Arduino的数字引脚2,负极接Arduino的GND引脚。I2C 模块的 SCL 和 SDA 引脚连接到模拟引脚 A5 和 A4 Arduino,而 VCC 和 GND 引脚连接到 Arduino 的 5V 和 GND 引脚。

菜单设计

菜单设计

  代码说明

  本文档末尾提供了该餐厅智能点餐系统的射频发射器和接收器端的完整代码。

  RadioHead 库用于射频发射器/接收器模块,而SPFD5408 库用于 TFT 显示。

  发射器部分代码: 

通过包含所有必需的库来启动代码。RH_ASK.h库用于发送器和接收器模块之间的通信。SPFD5408_Adafruit_GFX.h是一个用于 TFT 显示的核心图形库。

 

#include 
#include 
#include    
#include 
#include 

 

之后,为RH_ASK创建一个名为“驱动程序”的对象。

 

RH_ASK 驱动程序;

 

之后为您的 TFT 显示器定义最小和最大校准 X 和 Y 轴值。 

 

#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905

 

现在在 drawHome 函数中为您的 TFT 屏幕绘制布局。这里tft.fillScreen用于设置背景颜色。

tft.drawRoundRect函数用于创建填充矩形。tft.drawRoundRect函数的语法如下:

 

tft.drawRoundRect(int16_t x0,int16_t y0,int16_t w,int16_t h,int16_t 半径,uint16_t 颜色)

 

在哪里:

 x0=矩形起点的X坐标

y0=矩形起点的Y坐标

w = 矩形的宽度

h = 矩形的高度

radius=圆角的半径

color = 矩形的颜色。

tft.fillRoundRect函数用于绘制一个填充的矩形。tft.fillRoundRect函数的语法如下:

 

tft.fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t 半径, uint16_t 颜色)
tft.fillScreen(白色);
tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //页面边框
  tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
  tft.drawRoundRect(30, 40, 100, 40, 8, WHITE); //菜1​
  tft.fillRoundRect(30, 90, 100, 40, 8, GOLD);
  tft.drawRoundRect(30, 90, 100, 40, 8, WHITE); //菜2​
  tft.fillRoundRect(30, 140, 100, 40, 8, GOLD); //菜3
  tft.drawRoundRect(30, 140, 100, 40, 8, WHITE);

 

在 TFT 屏幕上创建按钮后,现在在按钮上显示文本。tft.setCursor用于设置光标从您要开始文本的位置。

 

  tft.setCursor(60, 0);
  tft.setTextSize(3);
  tft.setTextColor(石灰);
  tft.print("菜单");
  tft.setTextSize(2);
  tft.setTextColor(白色);
  tft.setCursor(37, 47);
  tft.print("Dish1");

 

在void 传输函数内部,每 1 秒向接收方发送一次数据。

 

无效传输()
{
  driver.send((uint8_t *)msg, strlen(msg));
  driver.waitPacketSent();
  延迟(1000);
  }

 

在void 循环函数内,使用 ts.getPoint 函数读取原始 ADC 值。

 

TSPoint p = ts.getPoint();

 

现在使用map函数将原始 ADC 值转换为像素坐标。

 

像素 = 地图(像素,TS_MAXX,TS_MINX,0, 320);
py = map(py, TS_MAXY, TS_MINY, 0, 240);

 

将原始 ADC 值转换为像素坐标后,输入Dish1按钮的像素坐标,如果有人触摸此区域之间的屏幕,则将消息发送到接收方。

 

如果(像素 > 180 && 像素 < 280 && py > 190 && py < 230 && pz > 最小压力 && pz < 最大压力)
      {
        Serial.println("Dish1");
        味精=“Dish1”;
        发送();
        tft.fillRoundRect(30, 40, 100, 40, 8, WHITE);
        延迟(70);
        tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
        tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);
        tft.setCursor(37, 47);
        tft.println("Dish1");
        延迟(70);
        }

 

对所有其他按钮执行相同的步骤。

接收部分代码 

对于 RF 接收器部分代码,包括 RF 接收器和 LCD 模块的库。还包括用于在 Arduino 和 RF 接收器之间建立 SPI 通信的SPI.h库。

 

#include 
#include  // 没有实际使用但需要编译
#include 

 

在void 循环函数内部,不断检查传输的消息。如果接收模块收到信息,则在液晶模块上显示信息并发出哔声。

 

    if (driver.recv(buf, &buflen)) // 非阻塞
    {
      诠释我;
      数字写入(蜂鸣器,高);
      延迟(1000);
      数字写入(蜂鸣器,低);。
      lcd.print("T1:");
      lcd.print((char*)buf);

 

  使用 Arduino 测试智能餐厅项目

菜单设计

  连接所有硬件并上传发射器和接收器部分的代码后,现在是测试项目的时候了。测试项目时,在 TFT 显示屏上按一个按钮,它应该在连接到接收器侧的 LCD 模块上显示带有表号为 T1 的菜名。如果接收端 LCD 不显示任何内容,请检查您的 TFT 屏幕是否正常工作。

发射器代码 (TFT LCD)

#include  

#include // 没有实际使用,但需要编译

#include // 核心图形库

#include // 硬件专用库

#include  

const char *msg ; 

RH_ASK 驱动程序;

#define YP A1 // 必须是模拟引脚,使用“An”符号!

#define XM A2 // 必须是模拟引脚,使用“An”符号!

#define YM 7 // 可以是数字引脚

#define XP 6 // 可以是数字引脚

#define TS_MINX 125 

#define TS_MINY 85 

#define TS_MAXX 965 

#define TS_MAXY 905 

TouchScreen ts = TouchScreen(XP, YP, XM, YM , 300);

#define LCD_CD A2 

#define LCD_WR A1 

#define LCD_RD A0 

// 可选

#define LCD_RESET A4 

#define REDBAR_MINX 80 

#define GREENBAR_MINX 130 

#define BLUEBAR_MINX 180 

#define BAR_MINY 30 

#define BAR_HEIGHT 250 

#define BAR_WIDTH 30 

Adafruit_TFTCDLCD_tft(LCD_CS, LCD_CS, LCD_WR、LCD_RD、LCD_RESET);

#define BLACK 0x0000 

int BLUE = tft.color565(50, 50, 255); 

#define DARKBLUE 0x0010 

#define VIOLET 0x8888 

#define RED 0xF800 

#define GREEN 0x07E0 

#define CYAN 0x07FF 

#define MAGENTA 0xF81F 

#define YELLOW 0xFFE0 

#define WHITE 0xFFFF

#define 灰色 tft.color565(64, 64, 64); 

#define GOLD 0xFEA0 

#define BROWN 0xA145 

#define SILVER 0xC618 

#define LIME 0x07E0 

void drawHome() 

  tft.fillScreen(WHITE); 

  tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //页面边框

  tft.fillRoundRect(30, 40, 100, 40, 8, GOLD); 

  tft.drawRoundRect(30, 40, 100, 40, 8, WHITE); //Dish1 

  tft.fillRoundRect(30, 90, 100, 40, 8, GOLD); 

  tft.drawRoundRect(30, 90, 100, 40, 8, WHITE); //Dish2 

  tft.fillRoundRect(30, 140, 100, 40, 8, GOLD); //Dish3 

  tft.drawRoundRect(30, 140, 100, 40, 8, WHITE); 

  tft.fillRoundRect(10, 190, 190, 40, 8, CYAN);

  tft.drawRoundRect(10, 190, 190, 40, 8, 白色); //调用服务员

  tft.fillRoundRect(180, 40, 100, 40, 8, GOLD); 

  tft.drawRoundRect(180, 40, 100, 40, 8, 白色); //Dish4 

  tft.fillRoundRect(180, 90, 100, 40, 8, GOLD); 

  tft.drawRoundRect(180, 90, 100, 40, 8, 白色); //Dish5 

  tft.fillRoundRect(180, 140, 100, 40, 8, GOLD); 

  tft.drawRoundRect(180, 140, 100, 40, 8, WHITE); //Dish6 

  tft.fillRoundRect(210, 190, 100, 40, 8, GREEN); 

  tft.drawRoundRect(210, 190, 100, 40, 8, 白色); //比尔

  tft.setCursor(60, 0); 

  tft.setTextSize(3); 

  tft.setTextColor(石灰); 

  tft.print("菜单"); 

  tft.setTextSize(2); 

  tft.setTextColor(白色);

  tft.setCursor(37, 47); 

  tft.print("Dish1"); 

  tft.setCursor(37, 97); 

  tft.print("Dish2"); 

  tft.setCursor(37, 147); 

  tft.print("Dish3"); 

  tft.setCursor(23, 197); 

  tft.print("呼叫服务员"); 

  tft.setCursor(187, 47); 

  tft.print("Dish4"); 

  tft.setCursor(187, 97); 

  tft.print("Dish5"); 

  tft.setCursor(187, 147); 

  tft.print("Dish6"); 

  tft.setCursor(227, 197); 

  tft.print("比尔"); 

  // 延迟(500);

int oldcolor,currentcolor,currentpcolour;

无效设置(无效){  

  tft.reset();

  tft.begin(tft.readID());

  序列号.println(); 

  Serial.print("正在读取 id..."); 

  延迟(500);

  Serial.println(tft.readID(), HEX);  

  tft.fillScreen(黑色);

  tft.setRotation(1); 

  tft.setTextSize(3); 

  tft.setTextColor(白色); 

  tft.setCursor(50, 140); 

  tft.print("加载中..."); 

  tft.setTextColor(tft.color565(255, 255, 0)); 

  tft.setCursor(30, 70); 

  tft.print("作者:"); 

  tft.setCursor(10, 100); 

  tft.print("CircuitDigest.Com"); 

  for (int i; i < 250; i++) 

  { 

    tft.fillRect(BAR_MINY - 10, BLUEBAR_MINX, i, 10, RED); 

    延迟(0.0000000000000000000000000000000000000000000000000001);

  }

  tft.fillScreen(黑色);

  if (!driver.init()) 

      Serial.println("init failed"); 

  画家();

  pinMode(13,输出);

#define MINPRESSURE 10 

#define MAXPRESSURE 1000 

void transfer() 

{   

  driver.send((uint8_t *)msg, strlen(msg)); 

  driver.waitPacketSent(); 

  延迟(1000);

  }

无效循环()

{  

  数字写入(13,高);

  TSPoint p = ts.getPoint(); 

  数字写入(13,低);

  // 如果共享引脚,您需要修复触摸屏引脚的方向

  //pinMode(XP, OUTPUT); 

  pinMode(XM,输出);

  pinMode(YP,输出);

  //pinMode(YM, OUTPUT); 

  if (pz > ts.pressureThreshhold) 

    { 

      px = map(px, TS_MAXX, TS_MINX, 0, 320); 

      py = map(py, TS_MAXY, TS_MINY, 0, 240);      

      if (px > 180 && px < 280 && py > 190 && py < 230 && pz > MINPRESSURE && pz < MAXPRESSURE) 

      { 

        Serial.println("Dish1"); 

        msg = "Dish1 Ordered"; 

        发送(); 

        tft.fillRoundRect(30, 40, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(30, 40, 100, 40, 8, GOLD); 

        tft.drawRoundRect(30, 40, 100, 40, 8, WHITE); 

        tft.setCursor(37, 47); 

        tft.println("

        } 

      if (px > 180 && px < 280 && py > 140 && py < 180) 

      { 

        Serial.println("Dish2"); 

        msg = "Dish2 Ordered"; 

        发送(); 

        tft.fillRoundRect(30, 90, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(30, 90, 100, 40, 8, GOLD); 

        tft.drawRoundRect(30, 90, 100, 40, 8, WHITE); 

        tft.setCursor(37, 97); 

        tft.println("Dish2"); 

        延迟(70);      

      } 

      if (px > 180 && px < 280 && py > 90 && py < 130) 

      { 

        Serial.println("Dish3"); 

        msg = "Dish3 Ordered"; 

        发送();

        tft.fillRoundRect(30, 140, 100, 40, 8, 白色); //RGB LED

        延迟(70);

        tft.fillRoundRect(30, 140, 100, 40, 8, GOLD); //rgb led 

        tft.drawRoundRect(30, 140, 100, 40, 8, WHITE); //rgb led 

        tft.setCursor(37, 147); 

        tft.print("Dish3"); 

        延迟(70);       

      } 

      if (px > 210 && px < 310 && py > 40 && py < 80) 

      { 

        Serial.println("呼叫服务员"); 

        msg = "呼叫服务员"; 

        发送(); 

        tft.fillRoundRect(10, 190, 190, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(10, 190, 190, 40, 8, CYAN);

        tft.drawRoundRect(10, 190, 190, 40, 8, 白色); 

        tft.setCursor(23, 197); 

        tft.print("呼叫服务员"); 

        延迟(70);

      } 

      if (px > 30 && px < 130 && py > 190 && py < 230) 

      { 

        Serial.println("Dish4"); 

        msg = "Dish4 Ordered"; 

        发送(); 

        tft.fillRoundRect(30, 40, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(30, 40, 100, 40, 8, GOLD); 

        tft.drawRoundRect(30, 40, 100, 40, 8, WHITE); 

        tft.setCursor(187, 47); 

        tft.print("Dish4"); 

        延迟(70);

      }

      if (px > 30 && px < 130 && py > 140 && py < 180 ) 

      { 

        Serial.println("Dish5"); 

        msg = "Dish5 Ordered"; 

        发送(); 

        tft.fillRoundRect(180, 90, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(180, 90, 100, 40, 8, GOLD); 

        tft.drawRoundRect(180, 90, 100, 40, 8, 白色); 

        tft.setCursor(187, 97); 

        tft.print("Dish5"); 

        延迟(70);

      } 

      if (px > 30 && px < 130 && py > 90 && py < 130) 

      { 

        Serial.println("Dish6"); 

        味精 = "

        tft.fillRoundRect(180, 140, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(180, 140, 100, 40, 8, GOLD); 

        tft.drawRoundRect(180, 140, 100, 40, 8, WHITE); 

        tft.setCursor(187, 147); 

        tft.print("Dish6"); 

        延迟(70);

      }

      if (px > 10 && px < 210 && py > 40 && py < 80) 

      { 

        Serial.println("Bill"); 

        msg = "客户账单"; 

        发送(); 

        tft.fillRoundRect(210, 190, 100, 40, 8, WHITE); 

        延迟(70);

        tft.fillRoundRect(210, 190, 100, 40, 8, GREEN); 

        tft.drawRoundRect(210, 190, 100, 40, 8, 白色); 

        tft.setCursor(227, 197); 

        tft.print("比尔"); 

        延迟(70);

      } 

    } 

}

接收方代码

#include  

#include // 没有实际使用,但需要编译

#include  

//String msg; 

LiquidCrystal_I2C lcd(0x27, 16, 2); 

RH_ASK 驱动程序;

#define 蜂鸣器 2 

void setup() 

    Serial.begin(9600); // 仅调试

    pinMode(buzzer, OUTPUT); 

    液晶显示器开始();

    lcd.clear(); 

    if (!driver.init()) 

         Serial.println("init failed"); 

}

无效循环()

    uint8_t buf[17]; 

    uint8_t buflen = sizeof(buf); 

    if (driver.recv(buf, &buflen)) // 非阻塞

    { 

      int i;

      数字写入(蜂鸣器,高);

      延迟(1000);

      数字写入(蜂鸣器,低);

      // 收到具有良好校验和的消息,转储它。

      Serial.print("消息:"); 

      Serial.println((char*)buf); 

      lcd.clear(); 

      lcd.setCursor(0,0); 

      lcd.print("T1:"); 

      lcd.print((char*)buf);            

    } 

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分