عربة تسوق باستخدام RFID و الاردوينو

متوسط

image_pdf

في هذا الدرس سنتعلم كيف نبرمج الاردوينو وقارئ (RFID) لصنع عربة تسوق ذكية واضافة شريحة (RFID) إلى المنتجات. و يمكن معرفة سعر المنتج مباشرة بتمريره على القارئ بالعربة، وحساب فاتورة المشتريات، وعرض البيانات على الشاشة الكريستالية (LCD) ، كما يمكن حذف المنتج بالضغط على ضغاط التحكم و تمرير المنتج على قارئ (RFID)

RFID عربة

المواد والأدوات

اردوينو

X1اردوينو 

قارئ rfid

X 1قارئ (RFID)

LCD

X1 شاشة كرستالية

رأس دبوس

X1 40 رأس دبوس

Full-size

X1 لوحة تجارب

سلك اردوينو

X1 سلك أردوينو

مصدر صوت

X1 مصدر صوت 

مفتاح

X1 ضغاط تحكم

arduino-smoke-gas-sensor

X1 مقاومة متغيرة

Jumper Wires Male/Male

أسلاك توصيل (ذكر/ ذكر)

مقاومة 220

X1 مقاومة 220 أوم

مقاومة

X1 مقاومة 10 كيلو اوم 

 

توصيل الدائرة

RFID-CART

تم توصيل القارئ بالأردوينو كما يلي :

قارئ RFID الأردوينو
SDA منفذ 10
SCK منفذ 13
MOSI منفذ 11
MISO منفذ 12
IRQ لا يتم توصيله
GND GND
 RST منفذ 9
 3.3v 3.3v (لاتقم بتوصيله إلى 5v)

البرمجة

أولا : قراءة البيانات من RFID tag :

قبل كتابة التعليمات البرمجية ، تحتاج إلى تحميل المكتبة الازمة لقارئ RFID من هنـا.

 وإضافة المكتبة إلى المكتبات الموجودة ببرنامج الاردوينو.  يمكن الاطلاع على طريقة تنزيل المكتبات من خلال الرابط

بعد أن تم توصيل الدائرة، انتقل إلى (File) >(Examples)>(MFRC522) >(DumpInfo)وارفع ملف البرمجة على الاردوينو

ثم قم بفتح الشاشة التسلسلية، يجب أن تظهر النافذة كالتالي :

security-access-using-rfid-reader

عند تمرير بطاقة (RFID) ستظهر كافة بيانات البطاقة على نافذة شاشة الاتصال التسلسلي

security-access-using-rfid-reader

كما هو موضح بالصورة السابقة، هذه المعلومات التي يمكنك قراءتها من البطاقة، بما في ذلك UID الخاص بالبطاقة والذي تم تمييزه باللون الأصفر. بعد معرفة (UID) للبطاقات المتوفرة لديك قم بتعريف كل بطاقة مع منتج معين من منتجاتك.

ثانيًا : الكود البرمجي

#include <LiquidCrystal.h>
#include <SPI.h> 
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String coffee = "25 13 68 33";
String tea = "4F 44 4D 29";
String water = "ED 82 B2 73";
int count = 0;
int p1=0,p2=0,p3=0; 
double total = 0;
int count_prod = 0;
void setup()

{pinMode(14, OUTPUT);
lcd.begin(16,2);
pinMode(8, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522
lcd.setCursor(0, 0);
lcd.print(" SHOPPING CART");
delay (2000);
lcd.setCursor(0, 1);
delay (2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" WELCOME TO ");
lcd.setCursor(0, 1); 
lcd.print(" OUR STORE");


}
void loop() 
{
if ( ! mfrc522.PICC_IsNewCardPresent()) 
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial()) 
{
return;
}
lcd.clear();
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++) 
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();
int a=digitalRead(8);
//FIREST PRODUCT 
if (content.substring(1) == coffee && (a == 0)) 
{lcd.setCursor(0, 0);
lcd.println("Coffee15.00 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 15.00;
p1++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == coffee && (a == 1)) 
{
if(p1>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("coffee Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 15.00;
p1--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.clear();
lcd.print("Not in cart!!! ");}}

//FIREST PRODUCT 
if (content.substring(1) == tea && (a == 0)) 
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tea 8 SR");
tone(14,350);

delay(5);
noTone(14);
total = total + 8.00;
p2++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == tea && (a == 1)) 
{if(p2>0)
{lcd.clear(); 
lcd.print("Tea Removed!!!");
tone(14,350); 
delay(5);
noTone(14);
total = total - 8.00;
p2--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.clear();
lcd.print("Not in cart!!!");
delay (3000);
}}
if (content.substring(1) == water && (a == 0)) 
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("water 2.00 SA ");
tone(14,350); 
delay(5);
noTone(14);
total = total + 2.00;
p3++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == water && (a == 1)) 
{
if(p3>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 2.00;
p3--;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
delay (3000);
} 
else
{lcd.print("Not in cart!!! ");
delay (3000);
}}
}

شرح الكود البرمجي

في الأسطر التالية يتم استدعاء المكتبات التالية (LiquidCrystal-SPI-MFRC522) والتي تحتوي على أوامر برمجية مهمة لتشغيل المشروع

#include <LiquidCrystal.h>
#include <SPI.h> 
#include <MFRC522.h>

نعرف المنافذ المتصلة مع القارئ

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

نعرف المنافذ المتصلة مع الشاشة الكرستالية

const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

لدينا 3 بطاقات RFID بعد أن تعرفنا على الرقم الخاص بكل بطاقة ثبتناه على المنتج و عرفنا الرقم باسم المنتج

 
String coffee = "25 13 68 33";
String tea = "4F 44 4D 29";
String water = "ED 82 B2 73";

نعرف متغير (count) يشر إلى عدد المنتجات التي تم شراؤها و المتغيرات (p1-p2-p3) تشير للمنتج الأول و الثاني و الثالث

 
int count = 0;
int p1=0,p2=0,p3=0; 
double total = 0;
int count_prod = 0;

في دالة (void setup)نعرف منفذ مصدر الصوت و نقوم بتهئية الشاشة ،وقارئ FRID

void setup()

{pinMode(14, OUTPUT);
lcd.begin(16,2);
pinMode(8, INPUT);
Serial.begin(9600); // Initiate a serial communication
SPI.begin(); // Initiate SPI bus
mfrc522.PCD_Init(); // Initiate MFRC522

نطبع على الشاشة عبارات ترحيبية تظهر عند بدء التشغيل فقط

lcd.setCursor(0, 0);
lcd.print(" SHOPPING CART");
delay (2000);
lcd.setCursor(0, 1);
delay (2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" WELCOME TO ");
lcd.setCursor(0, 1); 
lcd.print(" OUR STORE");

}

عند دالة (void loop) نجعل البرنامج جاهز لقراءة البطاقات

 
void loop() 
{
if ( ! mfrc522.PICC_IsNewCardPresent()) 
{
return;
}

if ( ! mfrc522.PICC_ReadCardSerial()) 
{
return;
}
lcd.clear();
String content= "";
byte letter;
for (byte i = 0; i < mfrc522.uid.size; i++) 
{
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
content.toUpperCase();

 

نعرف متغير خاص بالمفتاح الذي سيتم ضغطه عند حذف المنتجات فقط

int a=digitalRead(8);

عند قراءة الرمز الخاص ببطاقة القهوة بدون الضغط على المفتاح يتم اضافة سعر القهوة و عرضها على الشاشة

if (content.substring(1) == coffee && (a == 0))
{lcd.setCursor(0, 0);
lcd.println("Coffee15.00 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 15.00;
p1++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

عند قراءة الرمز الخاص ببطاقة القهوة مع الضغط على المفتاح يتم حذف القهوة و عرضها على الشاشة

else if (content.substring(1) == coffee && (a == 1))
{
if(p1>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("coffee Removed!!! ");
tone(14,350);
delay(5);
noTone(14);
total = total - 15.00;
p1--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
}

 

اذا لم تكن القهوة موجودة تظهر رسالة على الشاشة أنها غير موجودة

 

else
{lcd.clear();
lcd.print("Not in cart!!! ");}}

اضافة وحذف المنتج الثاني

if (content.substring(1) == tea && (a == 0))
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tea 8 SR");
tone(14,350);
delay(5);
noTone(14);
total = total + 8.00;
p2++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == tea && (a == 1))
{if(p2>0)
{lcd.clear();
lcd.print("Tea Removed!!!");
tone(14,350);
delay(5);
noTone(14);
total = total - 8.00;
p2--;
lcd.setCursor(0, 1);
lcd.println("Total=");
lcd.print(total);
delay (3000);
}
else
{lcd.clear();
lcd.print("Not in cart!!!");
delay (3000);
}}

اضافة وحذف المنتج الثالث

if (content.substring(1) == water && (a == 0))
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("water 2.00 SA ");
tone(14,350);
delay(5);
tone(14,350);
total = total + 2.00;
p3++;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
count_prod++;
delay (3000);
}

else if (content.substring(1) == water && (a == 1))
{
if(p3>0)
{lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Removed!!! ");
tone(14,350);
delay(5);
noTone(14,350);
total = total - 2.00;
p3--;
lcd.setCursor(0, 1);
lcd.print("Total=");
lcd.print(total);
delay (3000);
}
else
{lcd.print("Not in cart!!! ");
delay (3000);
}}
}

 

X
Product added to the cart