风筝
发表于: 2020-2-19 09:24:32 | 显示全部楼层

如今,自动化系统无处不在,不管是在家庭、办公室还是某些大型行业中,都配备了自动化系统。饭店/旅馆也采用了最新的自动化趋势,通过机器人来运输食品,以及使用平板电脑下订单。通过使用平板电脑这种数字式菜单,客户可以轻松地选择食品。此信息将发送到餐厅的厨房,并在显示屏上显示。


在本篇文章中,我们将使用Arduino开发板、TFT显示屏和433MHz RF发射器/接收器模块制作一个智能餐厅点餐系统。本文中,发射器部分将由Arduino Uno、TFT显示屏和RF发射器组成,客户可以使用它们选择食物并下订单。接收器部分由Arduino Uno、LCD模块、RF接收器和蜂鸣器组成,将安装在餐厅厨房中以跟踪订单食品。


所需的组件

●    Arduino Uno开发板

●    433MHz射频发射器和接收器

●    2.4英寸TFT液晶触摸屏

●    1602 LCD模块

●    I2C模块


TFT LCD触摸屏与Arduino的连接

2.4英寸TFT LCD触摸屏是与Arduino UNO / Mega兼容的彩色TFT显示屏,还带有触摸板和SD卡插槽。此TFT显示模块具有明亮的背光和彩色240X320像素的显示屏。它还包括单个RGB像素控制,使其分辨率比黑白显示器好得多。


TFT显示与Arduino的连接非常简单,您只需要将TFT显示器安装在Arduino Uno板上即可,如下图所示。

TFT-LCD-Touch-Shield.jpg


电路连接图

智能餐厅菜单点餐系统包括“ RF发射器和接收器”部分。发送器和接收器端均使用Arduino Uno进行数据处理。下面给出了发射器和接收器部分的电路图。


发射器部分的电路连接

该项目的发射器部分由Arduino Uno、RF发射器和TFT显示屏模块组成。此部分用于从TFT显示屏上显示的菜单进行订购。 Arduino Uno是处理所有数据的发射器侧的主控,RF发射器模块用于将所选数据发送到接收器。射频发射器模块的数据引脚连接到Arduino的数字引脚12,而VCC和GND引脚分布连接到Arduino的5V和GND引脚。

Smart-Restaurant-RF-Transmitter-Circuit-Diagram.jpg


Smart-Restaurant-RF-Transmitter.jpg


接收器部分的电路连接

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

Smart-Restaurant-Receiver-Circuit-Diagram.png


Smart-Restaurant-RF-Receiver.jpg


代码说明

文档末尾提供了智能点单系统的RF发送器和接收器端的完整代码。首先可以从以下的链接下载该项目中使用的所有库。

●    RadioHead库

●    SPFD5408库

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


发射器部分的代码:

首先在代码中包含所有必需的库。 RH_ASK.h库用于发送器和接收器模块之间的通信。 SPFD5408_Adafruit_GFX.h是用于TFT显示的Core图形库。

  1. #include <RH_ASK.h>
  2. #include <SPI.h>
  3. #include <SPFD5408_Adafruit_GFX.h>   
  4. #include <SPFD5408_Adafruit_TFTLCD.h>
  5. #include <SPFD5408_TouchScreen.h>
复制代码

之后,为RH_ASK创建一个名为“driver”的示例。

  1. RH_ASK driver;
复制代码

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

  1. #define TS_MINX 125
  2. #define TS_MINY 85
  3. #define TS_MAXX 965
  4. #define TS_MAXY 905
复制代码

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


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

  1. tft.drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color)
复制代码

在这里:

x0 =矩形起点的X坐标

y0 =矩形起点的Y坐标

w =矩形的宽度

h =矩形的高度

radius =圆角半径

color =矩形的颜色。


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

  1. tft.fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color)
  2. tft.fillScreen(WHITE);
  3. tft.drawRoundRect(0, 0, 319, 240, 8, WHITE);     //Page border
  4.   tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
  5.   tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);  //Dish1​
  6.   tft.fillRoundRect(30, 90, 100, 40, 8, GOLD);
  7.   tft.drawRoundRect(30, 90, 100, 40, 8, WHITE);  //Dish2​
  8.   tft.fillRoundRect(30, 140, 100, 40, 8, GOLD);   //Dish3
  9.   tft.drawRoundRect(30, 140, 100, 40, 8, WHITE);
复制代码

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

  1.   tft.setCursor(60, 0);
  2.   tft.setTextSize(3);
  3.   tft.setTextColor(LIME);
  4.   tft.print("   Menu");
  5.   tft.setTextSize(2);
  6.   tft.setTextColor(WHITE);
  7.   tft.setCursor(37, 47);
  8.   tft.print(" Dish1");
复制代码

void transmit函数内部,每1秒将数据发送到接收器一侧。

  1. void transmit()
  2. {
  3.   driver.send((uint8_t *)msg, strlen(msg));
  4.   driver.waitPacketSent();
  5.   delay(1000);
  6.   }
复制代码

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

  1. TSPoint p = ts.getPoint();
复制代码

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

  1. p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
  2. p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
复制代码

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

  1. if (p.x > 180 && p.x < 280 && p.y > 190 && p.y < 230  && p.z > MINPRESSURE && p.z < MAXPRESSURE)
  2.       {
  3.         Serial.println("Dish1");
  4.         msg = "Dish1";
  5.         transmit();
  6.         tft.fillRoundRect(30, 40, 100, 40, 8, WHITE);
  7.         delay(70);
  8.         tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
  9.         tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);
  10.         tft.setCursor(37, 47);
  11.         tft.println(" Dish1");
  12.         delay(70);
  13.         }
复制代码

对于所有其他按钮,使用相同的步骤。


接收器的代码

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

  1. #include <RH_ASK.h>
  2. #include <SPI.h> // Not actualy used but needed to compile
  3. #include <LiquidCrystal_I2C.h>
复制代码

void loop函数内,连续检查传输的消息。如果接收器模块收到消息,则在LCD模块上显示该消息并发出蜂鸣声。

  1.     if (driver.recv(buf, &buflen)) // Non-blocking
  2.     {
  3.       int i;
  4.       digitalWrite(buzzer, HIGH);
  5.       delay(1000);
  6.       digitalWrite(buzzer, LOW);.
  7.       lcd.print("T1:");
  8.       lcd.print((char*)buf);
复制代码

测试Arduino智能餐厅菜单系统

连接完所有硬件以及上传了发送器和接收器部分的代码后,现在该测试项目了。要测试项目,请按TFT显示屏上的一个按钮,这样接收器侧的LCD模块上显示菜名和桌号,桌号为T1。如果接收器侧LCD没有显示任何内容,请检查您的TFT屏幕是否正常工作。

Smart-Restaurant-Menu-Ordering-System-using-Arduino.jpg


以上就是使用Arduino和TFT显示屏制作智能餐厅菜单点餐系统的方法。您还可以更改屏幕的方向来添加更多按钮。


代码

以下是本文使用的完整代码: main.rar (2.16 KB, 下载次数: 59)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 13:40 , Processed in 0.052299 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表