如今的自動(dòng)化系統(tǒng)無處不在,無論是家庭、辦公室還是任何大行業(yè),都配備了自動(dòng)化系統(tǒng)。餐廳/酒店也在采用最近的自動(dòng)化趨勢,并正在安裝機(jī)器人來交付食物和平板電腦以接受訂單。使用平板電腦等數(shù)字菜單卡,客戶可以輕松選擇項(xiàng)目。該信息將被發(fā)送到餐廳的廚房并顯示在顯示屏上。
在這個(gè)項(xiàng)目中,我們正在使用 Arduino、TFT 顯示器和 433MHz 射頻發(fā)射器/接收器模塊構(gòu)建一個(gè)智能餐廳項(xiàng)目。這里的發(fā)射器部分將由 Arduino Uno、TFT 顯示器和一個(gè)射頻發(fā)射器組成,客戶可以使用它來選擇食品并下訂單。而接收器部分由 Arduino Uno、LCD 模塊、RF 接收器和蜂鳴器組成,它們將安裝在餐廳廚房中以跟蹤訂單物品。
所需組件
阿杜諾烏諾 (2)
433MHz 射頻發(fā)射器和接收器
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 像素顯示屏。它還由單獨(dú)的 RGB 組成像素控制,使其具有比黑白顯示器更好的分辨率。
將 TFT 顯示器與 Arduino 連接非常簡單,在前面的教程中進(jìn)行了說明。您只需將 TFT 顯示屏安裝在 Arduino Uno 板上,如下圖所示。
電路原理圖
智能餐廳菜單訂購系統(tǒng)項(xiàng)目由射頻發(fā)射器和接收器部分組成。發(fā)送端和接收端都使用 Arduino Uno 進(jìn)行數(shù)據(jù)處理。我們之前使用與 Arduino 相同的 433 MHz 射頻模塊來構(gòu)建無線門鈴、手勢控制機(jī)器人等項(xiàng)目。發(fā)射器和接收器部分的電路圖如下所示。
發(fā)射器部分電路
該項(xiàng)目的發(fā)射器部分由一個(gè) Arduino Uno、RF 發(fā)射器和 TFT 顯示屏組成。此部分用于從 TFT 顯示屏上顯示的菜單進(jìn)行訂購。Arduino Uno 是發(fā)送端的大腦,處理所有數(shù)據(jù),RF 發(fā)送模塊用于將選定的數(shù)據(jù)傳輸?shù)浇邮斩?。RF發(fā)射模塊的數(shù)據(jù)引腳連接到Arduino的數(shù)字引腳12,而V CC和GND引腳連接到Arduino的5V和GND引腳。
接收部分電路
本項(xiàng)目的接收器部分由一個(gè)Arduino Uno、RF接收器、16*2 LCD模塊和I2C模塊組成。RF接收器用于接收來自發(fā)射器部分的數(shù)據(jù),LCD模塊用于顯示接收到的數(shù)據(jù)。每當(dāng)下新訂單時(shí),都會(huì)使用蜂鳴器發(fā)出聲音。RF 接收器的數(shù)據(jù)引腳連接到 Arduino 的數(shù)字引腳 11,而 V CC和 GND 引腳連接到 Arduino 的 5V 和 GND 引腳。Buzzer的正極接Arduino的數(shù)字引腳2,負(fù)極接Arduino的GND引腳。I2C 模塊的 SCL 和 SDA 引腳連接到模擬引腳 A5 和 A4 Arduino,而 VCC 和 GND 引腳連接到 Arduino 的 5V 和 GND 引腳。
代碼說明
本文檔末尾提供了該餐廳智能點(diǎn)餐系統(tǒng)的射頻發(fā)射器和接收器端的完整代碼。
RadioHead 庫用于射頻發(fā)射器/接收器模塊,而SPFD5408 庫用于 TFT 顯示。
發(fā)射器部分代碼:?
通過包含所有必需的庫來啟動(dòng)代碼。RH_ASK.h庫用于發(fā)送器和接收器模塊之間的通信。SPFD5408_Adafruit_GFX.h是一個(gè)用于 TFT 顯示的核心圖形庫。
?
#include#include #include #include #include
?
之后,為RH_ASK創(chuàng)建一個(gè)名為“驅(qū)動(dòng)程序”的對(duì)象。
?
RH_ASK 驅(qū)動(dòng)程序;
?
之后為您的 TFT 顯示器定義最小和最大校準(zhǔn) X 和 Y 軸值。?
?
#define TS_MINX 125 #define TS_MINY 85 #define TS_MAXX 965 #define TS_MAXY 905
?
現(xiàn)在在 drawHome 函數(shù)中為您的 TFT 屏幕繪制布局。這里tft.fillScreen用于設(shè)置背景顏色。
tft.drawRoundRect函數(shù)用于創(chuàng)建填充矩形。tft.drawRoundRect函數(shù)的語法如下:
?
tft.drawRoundRect(int16_t x0,int16_t y0,int16_t w,int16_t h,int16_t 半徑,uint16_t 顏色)
?
在哪里:
?x0=矩形起點(diǎn)的X坐標(biāo)
y0=矩形起點(diǎn)的Y坐標(biāo)
w = 矩形的寬度
h = 矩形的高度
radius=圓角的半徑
color = 矩形的顏色。
tft.fillRoundRect函數(shù)用于繪制一個(gè)填充的矩形。tft.fillRoundRect函數(shù)的語法如下:
?
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 屏幕上創(chuàng)建按鈕后,現(xiàn)在在按鈕上顯示文本。tft.setCursor用于設(shè)置光標(biāo)從您要開始文本的位置。
?
tft.setCursor(60, 0); tft.setTextSize(3); tft.setTextColor(石灰); tft.print("菜單"); tft.setTextSize(2); tft.setTextColor(白色); tft.setCursor(37, 47); tft.print("Dish1");
?
在void 傳輸函數(shù)內(nèi)部,每 1 秒向接收方發(fā)送一次數(shù)據(jù)。
?
無效傳輸() { driver.send((uint8_t *)msg, strlen(msg)); driver.waitPacketSent(); 延遲(1000); }
?
在void 循環(huán)函數(shù)內(nèi),使用 ts.getPoint 函數(shù)讀取原始 ADC 值。
?
TSPoint p = ts.getPoint();
?
現(xiàn)在使用map函數(shù)將原始 ADC 值轉(zhuǎn)換為像素坐標(biāo)。
?
像素 = 地圖(像素,TS_MAXX,TS_MINX,0, 320); py = map(py, TS_MAXY, TS_MINY, 0, 240);
?
將原始 ADC 值轉(zhuǎn)換為像素坐標(biāo)后,輸入Dish1按鈕的像素坐標(biāo),如果有人觸摸此區(qū)域之間的屏幕,則將消息發(fā)送到接收方。
?
如果(像素 > 180 && 像素 < 280 && py > 190 && py < 230 && pz > 最小壓力 && pz < 最大壓力) { Serial.println("Dish1"); 味精=“Dish1”; 發(fā)送(); 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); }
?
對(duì)所有其他按鈕執(zhí)行相同的步驟。
接收部分代碼?
對(duì)于 RF 接收器部分代碼,包括 RF 接收器和 LCD 模塊的庫。還包括用于在 Arduino 和 RF 接收器之間建立 SPI 通信的SPI.h庫。
?
#include#include // 沒有實(shí)際使用但需要編譯 #include
?
在void 循環(huán)函數(shù)內(nèi)部,不斷檢查傳輸?shù)南?。如果接收模塊收到信息,則在液晶模塊上顯示信息并發(fā)出嗶聲。
?
if (driver.recv(buf, &buflen)) // 非阻塞 { 詮釋我; 數(shù)字寫入(蜂鳴器,高); 延遲(1000); 數(shù)字寫入(蜂鳴器,低);。 lcd.print("T1:"); lcd.print((char*)buf);
?
使用 Arduino 測試智能餐廳項(xiàng)目
連接所有硬件并上傳發(fā)射器和接收器部分的代碼后,現(xiàn)在是測試項(xiàng)目的時(shí)候了。測試項(xiàng)目時(shí),在 TFT 顯示屏上按一個(gè)按鈕,它應(yīng)該在連接到接收器側(cè)的 LCD 模塊上顯示帶有表號(hào)為 T1 的菜名。如果接收端 LCD 不顯示任何內(nèi)容,請(qǐng)檢查您的 TFT 屏幕是否正常工作。
發(fā)射器代碼 (TFT LCD)
#include
#include
#include
#include
#include
const char *msg ;?
RH_ASK 驅(qū)動(dòng)程序;
#define YP A1 // 必須是模擬引腳,使用“An”符號(hào)!
#define XM A2 // 必須是模擬引腳,使用“An”符號(hào)!
#define YM 7 // 可以是數(shù)字引腳
#define XP 6 // 可以是數(shù)字引腳
#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, 白色); //調(diào)用服務(wù)員
? 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("呼叫服務(wù)員");?
? 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;
無效設(shè)置(無效){??
? tft.reset();
? tft.begin(tft.readID());
? 序列號(hào).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);
? }
無效循環(huán)()
{??
? 數(shù)字寫入(13,高);
? TSPoint p = ts.getPoint();?
? 數(shù)字寫入(13,低);
? // 如果共享引腳,您需要修復(fù)觸摸屏引腳的方向
? //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";?
? ? ? ? 發(fā)送();?
? ? ? ? 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";?
? ? ? ? 發(fā)送();?
? ? ? ? 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";?
? ? ? ? 發(fā)送();
? ? ? ? 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("呼叫服務(wù)員");?
? ? ? ? msg = "呼叫服務(wù)員";?
? ? ? ? 發(fā)送();?
? ? ? ? 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("呼叫服務(wù)員");?
? ? ? ? 延遲(70);
? ? ? }?
? ? ? if (px > 30 && px < 130 && py > 190 && py < 230)?
? ? ? {?
? ? ? ? Serial.println("Dish4");?
? ? ? ? msg = "Dish4 Ordered";?
? ? ? ? 發(fā)送();?
? ? ? ? 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";?
? ? ? ? 發(fā)送();?
? ? ? ? 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 = "客戶賬單";?
? ? ? ? 發(fā)送();?
? ? ? ? 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 驅(qū)動(dòng)程序;
#define 蜂鳴器 2?
void setup()?
{?
? ? Serial.begin(9600); // 僅調(diào)試
? ? pinMode(buzzer, OUTPUT);?
? ? 液晶顯示器開始();
? ? lcd.clear();?
? ? if (!driver.init())?
? ? ? ? ?Serial.println("init failed");?
}
無效循環(huán)()
{?
? ? uint8_t buf[17];?
? ? uint8_t buflen = sizeof(buf);?
? ? if (driver.recv(buf, &buflen)) // 非阻塞
? ? {?
? ? ? int i;
? ? ? 數(shù)字寫入(蜂鳴器,高);
? ? ? 延遲(1000);
? ? ? 數(shù)字寫入(蜂鳴器,低);
? ? ? // 收到具有良好校驗(yàn)和的消息,轉(zhuǎn)儲(chǔ)它。
? ? ? Serial.print("消息:");?
? ? ? Serial.println((char*)buf);?
? ? ? lcd.clear();?
? ? ? lcd.setCursor(0,0);?
? ? ? lcd.print("T1:");?
? ? ? lcd.print((char*)buf);? ? ? ? ? ??
? ? }?
}
評(píng)論
查看更多