في هذا الدرس سنتعلم كيف نبرمج الاردوينو وقارئ (RFID) لصنع عربة تسوق ذكية واضافة شريحة (RFID) إلى المنتجات. و يمكن معرفة سعر المنتج مباشرة بتمريره على القارئ بالعربة، وحساب فاتورة المشتريات، وعرض البيانات على الشاشة الكريستالية (LCD) ، كما يمكن حذف المنتج بالضغط على ضغاط التحكم و تمرير المنتج على قارئ (RFID)
المواد والأدوات
X1اردوينو
X 1قارئ (RFID)
X1 40 رأس دبوس
X1 لوحة تجارب
X1 سلك أردوينو
X1 مصدر صوت
X1 ضغاط تحكم
أسلاك توصيل (ذكر/ ذكر)
توصيل الدائرة
تم توصيل القارئ بالأردوينو كما يلي :
قارئ 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)وارفع ملف البرمجة على الاردوينو
ثم قم بفتح الشاشة التسلسلية، يجب أن تظهر النافذة كالتالي :
عند تمرير بطاقة (RFID) ستظهر كافة بيانات البطاقة على نافذة شاشة الاتصال التسلسلي
كما هو موضح بالصورة السابقة، هذه المعلومات التي يمكنك قراءتها من البطاقة، بما في ذلك 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); }} }