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

متوسط

image_pdf

البرمجة

أولا : قراءة البيانات من 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