如今的自動化系統無處不在,無論是家庭、辦公室還是任何大行業,都配備了自動化系統。餐廳/酒店也在采用最近的自動化趨勢,并正在安裝機器人來交付食物和平板電腦以接受訂單。使用平板電腦等數字菜單卡,客戶可以輕松選擇項目。該信息將被發送到餐廳的廚房并顯示在顯示屏上。
在這個項目中,我們正在使用 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);? ? ? ? ? ??
? ? }?
}
評論
查看更多