Arduino Kullanarak Akıllı Restoran Sipariş Sistemi Menü Yapımı; lcd ekran ile günümüzün otomasyon sistemleri, ev, ofis veya herhangi bir büyük endüstri olsun, her yerde otomasyon sistemleri ile donatılmıştır. Artık restoranlar / Oteller de son otomasyon trendlerini benimsiyor ve sipariş almak için tablet, yemek dağıtmak için robotlar kullanıyor. Akıllı menü sistemleri ile müşteriler tabletler aracılığı ile dijital menülerden dilediğini seçerek kolayca sipariş verebilirler. Akıllı menü ile oluşturulan sipariş bilgisi restoran mutfağına gönderilir ve mutfak ekranında gösterilerek siparişin hızlıca hazırlanması sağlanır.
Bu projede Arduino, dokunmatik lcd tft ekran ve 433MHz RF verici/alıcı modülü kullanarak Restoranlar için Akıllı Menü Projesi yapacağız.
Seçilen menüyü ileten bölüm Arduino Uno, Ekran ve bir RF vericiden oluşacaktır. Alıcı bölümü, sipariş öğelerini izlemek için restoran mutfağında kurulacak bir Arduino Uno, LCD modülü, RF alıcı ve bir Buzzer'den oluşur.
Gerekli Malzemeler
Arduino ile TFT LCD Dokunmatik Ekran Bağlantısı
2.4" tft lcd dokunmatik shield, dokunmatik ekran ve SD kart modülünden oluşan Arduino UNO/Mega uyumlu sistemdir. Bu TFT ekran modülü, parlak bir arka ışık ve renkli bir 240x320 piksel ekrana sahiptir.
TFT ekranını yalnızca aşağıdaki resimde gösterildiği gibi Arduino Uno kartı üzerine monte etmeniz gerekir.
Dokunmatik TFT LCD ekran ile neler yapılır diye merak ediyorsanız, Arduino ile Oyun Yapımı (Flappy Bird) makalemiz taşınabilir uygulamalar geliştirmede size çok yararlı olacaktır.
Akıllı Menü Devre Şeması
Akıllı restoran menü sipariş sistemi projesi hem rf verici hem de rf alıcı tarafı veri işleme için Arduino Uno'yu kullanır. Arduino Uno, tüm verileri işleyen verici tarafının beynidir ve RF verici modülü, seçilen verileri alıcıya iletmek için kullanılır. RF verici modülünün veri pimi Arduino'nun dijital pimi 12'ye bağlanırken, VCC ve GND pimleri Arduino'nun 5V ve GND pinine bağlanır.
RF Alıcı Modül Devresi
Bu projenin alıcı bölümü bir Arduino Uno, RF Alıcı, 16x2 LCD modülü ve I2C modülünden oluşur. Verici bölümünden veri almak için RF alıcısı kullanılır ve alınan verileri görüntülemek için LCD ekran kullanılır. Yeni bir sipariş verildiğinde ses çıkarmak için bir buzzer kullanılır. RF alıcının veri pimi Arduino'nun dijital pim 11'ine bağlanırken, VCC ve GND pimi Arduino'nun 5V ve GND pimine bağlanır. Buzzer'ın pozitif pimi Arduino'nun dijital pimi 2'ye, negatif pimi Arduino'nun GND pimine bağlanır. I2C modülünün SCL ve SDA pinleri A5 ve A4 Arduino analog pinlerine, VCC ve GND pinleri Arduino'nun 5V ve GND pinlerine bağlanır.
Menü Kod Açıklaması
Restoranda bu Akıllı Sipariş Sistemi için RF Verici ve Alıcı tarafları için tam kod yazının sonunda verilmiştir. Bu projede kullanılan tüm kütüphaneler verilen linklerden indirilebilir.
Radiohead kütüphanesi, radyo alıcısı / vericisi modülü için, SPFD5408 kütüphanesi TFT ekran için kullanılır.
Verici Bölüm Kodu:
Gerekli tüm kitaplıkları ekleyerek kodu başlatın. RH_ASK.h kütüphanesi, verici ve alıcı modülleri arasındaki iletişim için kullanılır. SPFD5408_Adafruit_GFX.h , TFT ekran için bir Çekirdek grafik kütüphanesidir.
#include <RH_ASK.h>
#include <SPI.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPFD5408_TouchScreen.h>
Burada, RH_ASK için 'sürücü' adlı bir nesne oluşturun.
RH_ASK driver;
Bu aşamada, TFT ekranınız için minimum ve maksimum kalibre edilmiş X & Y ekseni değerlerini tanımlayın.
#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905
Şimdi drawHome işlevinin içinde TFT ekranınız için tft.fillScreen arka plan rengini ayarlayan kodu ekleyin.
Dikdörtgen oluşturmak için tft.drawRoundRect işlevi kullanılır. Tft.drawRoundRect işlevi için kod dizimi aşağıda verilmiştir:
#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905
Nerede:
x0 = Dikdörtgenin başlangıç noktasının X koordinatı
y0 = Dikdörtgenin başlangıç noktasının Y koordinatı
w = Dikdörtgenin genişliği
h = Dikdörtgenin yüksekliği
radius = Yuvarlak köşenin yarıçapı
color = Rect'in rengi.
tft.fillRoundRect işlevi, doldurulmuş bir Dikdörtgen çizmek için kullanılır. Tft.fillRoundRect işlevinin kod dizimi aşağıda verilmiştir:
tft.fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h, int16_t radius, uint16_t color)
tft.fillScreen(WHITE);
tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //Page border
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 ekranında düğmeleri oluşturduktan sonra, metni düğmelerde görüntüleyin. tft.setCursor, imleci metni başlatmak istediğiniz yerden ayarlamak için kullanılır.
tft.setCursor(60, 0);
tft.setTextSize(3);
tft.setTextColor(LIME);
tft.print(" Menu");
tft.setTextSize(2);
tft.setTextColor(WHITE);
tft.setCursor(37, 47);
tft.print(" Dish1");
Boş iletim işlevinin içinde, verileri her 1 saniyede bir alıcı tarafına gönderin.
void transmit()
{
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(1000);
}
İçinde () fonksiyonu ile, ts.getPoint işlevini kullanarak ham ADC değerini okuyun.
TSPoint p = ts.getPoint();
Şimdi ham ADC değerlerini piksel Koordinatlara dönüştürmek için map işlevini kullanın.
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
Ham ADC değerlerini piksel koordinatına dönüştürdükten sonra, Dish1 düğmesinin piksel koordinatlarını girin ve birisi bu alan arasındaki ekrana dokunursa, mesajı alıcı tarafına gönderin.
if (p.x > 180 && p.x < 280 && p.y > 190 && p.y < 230 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{
Serial.println("Dish1");
msg = "Dish1";
transmit();
tft.fillRoundRect(30, 40, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);
tft.setCursor(37, 47);
tft.println(" Dish1");
delay(70);
}
Diğer tüm düğmeler için aynı prosedürü uygulayın.
Alıcı Bölüm Kodu
RF alıcısı bölüm kodu için, RF alıcısı ve LCD modülü için kütüphaneleri ekleyin. Ayrıca Arduino ve RF alıcısı arasında bir SPI iletişimi oluşturmak için SPI.h kütüphanesini de ekleyin.
#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
#include <LiquidCrystal_I2C.h>
Boş döngü fonksiyonunun içinde iletilen mesajları sürekli kontrol edin. Alıcı modülü bir mesaj alırsa, mesajı LCD modülünde görüntüleyin ve bir bip sesi çıkartın.
if (driver.recv(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);.
lcd.print("T1:");
lcd.print((char*)buf);
Arduino Kullanarak Akıllı Restoran Menü Projesini Test Etme
Tüm donanımı bağladıktan ve hem verici hem de alıcı bölümü için kodu yükledikten sonra, şimdi projeyi test etme zamanı. Projeyi test etmek için TFT ekranında bir düğmeye basın, alıcı tarafına bağlı LCD modülünde T1 olan tablo numarası ile menü adını görüntülemelidir. Alıcı tarafı LCD'de hiçbir şey görüntülenmiyorsa, TFT ekranınızın çalışıp çalışmadığını kontrol edin.
Arduino ve TFT ekranını kullanarak Akıllı Restoran Menü Sipariş Sistemi projesini bu şekilde oluşturabilirsiniz. Daha fazla düğme eklemek için ekranın yönünü de değiştirebilirsiniz.
Çalışma Videosu aşağıda verilmiştir.
Menü Arduino Kodu
Code for Transmitter (TFT LCD)
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile
#include <SPFD5408_Adafruit_GFX.h> // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>
const char *msg ;
RH_ASK driver;
#define YP A1 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin
#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_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
// optional
#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_TFTLCD tft(LCD_CS, LCD_CD, 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 GREY 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); //Page border
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, WHITE); //Call Waiter
tft.fillRoundRect(180, 40, 100, 40, 8, GOLD);
tft.drawRoundRect(180, 40, 100, 40, 8, WHITE); //Dish4
tft.fillRoundRect(180, 90, 100, 40, 8, GOLD);
tft.drawRoundRect(180, 90, 100, 40, 8, WHITE); //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, WHITE); //Bill
tft.setCursor(60, 0);
tft.setTextSize(3);
tft.setTextColor(LIME);
tft.print(" Menu");
tft.setTextSize(2);
tft.setTextColor(WHITE);
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(" Call Waiter");
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(" Bill");
// delay(500);
}
int oldcolor, currentcolor, currentpcolour;
void setup(void) {
tft.reset();
tft.begin(tft.readID());
Serial.begin(9600);
Serial.println();
Serial.print("reading id...");
delay(500);
Serial.println(tft.readID(), HEX);
tft.fillScreen(BLACK);
tft.setRotation(1);
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(50, 140);
tft.print("Loading...");
tft.setTextColor(tft.color565(255, 255, 0));
tft.setCursor(30, 70);
tft.print("By:");
tft.setCursor(10, 100);
tft.print("CircuitDigest.Com");
for (int i; i < 250; i++)
{
tft.fillRect(BAR_MINY - 10, BLUEBAR_MINX, i, 10, RED);
delay(0.000000000000000000000000000000000000000000000000001);
}
tft.fillScreen(BLACK);
if (!driver.init())
Serial.println("init failed");
drawHome();
pinMode(13, OUTPUT);
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000
void transmit()
{
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(1000);
}
void loop()
{
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint();
digitalWrite(13, LOW);
// if sharing pins, you'll need to fix the directions of the touchscreen pins
//pinMode(XP, OUTPUT);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
//pinMode(YM, OUTPUT);
if (p.z > ts.pressureThreshhold)
{
p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
if (p.x > 180 && p.x < 280 && p.y > 190 && p.y < 230 && p.z > MINPRESSURE && p.z < MAXPRESSURE)
{
Serial.println("Dish1");
msg = "Dish1 Ordered";
transmit();
tft.fillRoundRect(30, 40, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);
tft.setCursor(37, 47);
tft.println(" Dish1");
delay(70);
}
if (p.x > 180 && p.x < 280 && p.y > 140 && p.y < 180)
{
Serial.println("Dish2");
msg = "Dish2 Ordered";
transmit();
tft.fillRoundRect(30, 90, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(30, 90, 100, 40, 8, GOLD);
tft.drawRoundRect(30, 90, 100, 40, 8, WHITE);
tft.setCursor(37, 97);
tft.println(" Dish2");
delay(70);
}
if (p.x > 180 && p.x < 280 && p.y > 90 && p.y < 130)
{
Serial.println("Dish3");
msg = "Dish3 Ordered";
transmit();
tft.fillRoundRect(30, 140, 100, 40, 8, WHITE); //rgb led
delay(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");
delay(70);
}
if (p.x > 210 && p.x < 310 && p.y > 40 && p.y < 80)
{
Serial.println("Call Waiter");
msg = "CallingWaiter";
transmit();
tft.fillRoundRect(10, 190, 190, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(10, 190, 190, 40, 8, CYAN);
tft.drawRoundRect(10, 190, 190, 40, 8, WHITE);
tft.setCursor(23, 197);
tft.print(" Call Waiter");
delay(70);
}
if (p.x > 30 && p.x < 130 && p.y > 190 && p.y < 230)
{
Serial.println("Dish4");
msg = "Dish4 Ordered";
transmit();
tft.fillRoundRect(30, 40, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(30, 40, 100, 40, 8, GOLD);
tft.drawRoundRect(30, 40, 100, 40, 8, WHITE);
tft.setCursor(187, 47);
tft.print(" Dish4");
delay(70);
}
if (p.x > 30 && p.x < 130 && p.y > 140 && p.y < 180 )
{
Serial.println("Dish5");
msg = "Dish5 Ordered";
transmit();
tft.fillRoundRect(180, 90, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(180, 90, 100, 40, 8, GOLD);
tft.drawRoundRect(180, 90, 100, 40, 8, WHITE);
tft.setCursor(187, 97);
tft.print(" Dish5");
delay(70);
}
if (p.x > 30 && p.x < 130 && p.y > 90 && p.y < 130)
{
Serial.println("Dish6");
msg = "Dish6 Ordered";
transmit();
tft.fillRoundRect(180, 140, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(180, 140, 100, 40, 8, GOLD);
tft.drawRoundRect(180, 140, 100, 40, 8, WHITE);
tft.setCursor(187, 147);
tft.print(" Dish6");
delay(70);
}
if (p.x > 10 && p.x < 210 && p.y > 40 && p.y < 80)
{
Serial.println("Bill");
msg = "Customer Bill";
transmit();
tft.fillRoundRect(210, 190, 100, 40, 8, WHITE);
delay(70);
tft.fillRoundRect(210, 190, 100, 40, 8, GREEN);
tft.drawRoundRect(210, 190, 100, 40, 8, WHITE);
tft.setCursor(227, 197);
tft.print(" Bill");
delay(70);
}
}
}
Code for Receiver
#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
#include <LiquidCrystal_I2C.h>
//String msg;
LiquidCrystal_I2C lcd(0x27, 16, 2);
RH_ASK driver;
#define buzzer 2
void setup()
{
Serial.begin(9600); // Debugging only
pinMode(buzzer, OUTPUT);
lcd.begin();
lcd.clear();
if (!driver.init())
Serial.println("init failed");
}
void loop()
{
uint8_t buf[17];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
// Message with a good checksum received, dump it.
Serial.print("Message: ");
Serial.println((char*)buf);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T1:");
lcd.print((char*)buf);
}
}
Arduino Menü Yapımı Video
Hepsi bu kadar. Umarım Arduino ile Akıllı Menü Yapımı - Restoran Sipariş Sistemi makalemizi beğenmiş ve yeni bir şeyler öğrenmişsinizdir. Memnun kaldıysanız aşağıda bulunan "yukarı ok"a tıklayarak +1 puan verebilirsiniz. Diğer Güncel Arduino Projeleri için BURAYA TIKLAYABİLİRSİNİZ. Sizde Robotlara ve Maker'lığa Meraklıysanız Robotik Marketimiz ROBOCOMBO'yu Ziyaret Edebilirsiniz.
Okuduğunuz İçin Teşekkürler.
Kaynak: circuitdigest.com/microcontroller-projects/arduino-smart-restaurant-menu-ordering-menu-ordering-system