سبد خرید هوشمند رزبری پای با بارکدخوان و پرینتر حرارتی

محتویات
در این پروژه قصد داریم یک سبد خرید هوشمند با چاپگر رسید حرارتی، ال سی دی و اسکنر بارکد USB را با برد Raspberry Pi بسازیم. این سبد خرید هوشمند بارکد کالا را اسکن میکند، اطلاعات آن را بر روی LCD 20×4 نمایش میدهد، فاکتور را ایجاد میکند و آن را با استفاده از چاپگر حرارتی Point of Service (POS) چاپ میکند. ما از spreadsheet Google برای بازیابی داده های مرتبط با بارکد اسکن شده مربوطه، مانند نام مورد، قیمت و … استفاده خواهیم کرد. همچنین، یک پایگاه داده آنلاین با استفاده از spreadsheet Google ایجاد خواهیم کرد که در آن اطلاعات همه موارد قبلاً ذخیره شده است. اگر می خواهید ارتباط رزبری پای و اسکنر بارکد یا رزبری پای با چاپگر حرارتی یا رزبری پای با ال سی دی 20*4 را بدانید، باید مقالات قبلی ما را بررسی کنید.
مدار سبد خرید هوشمند با رزبری پای
تصویر بالا شماتیک اتصال یک اسکنر بارکد، چاپگر حرارتی و LCD با Raspberry Pi 3 را به شما نشان می دهد. همچنین می توانید اتصالات را از جدول اتصال زیر بگیرید.
پرینتر حرارتی | رزبری پای |
RXD | TXD i.e. GPIO 14 |
TXD | RXD i.e. GPIO 15 |
TDR | GND |
GND | GND |
بارکدخوان | |
USB | USB |
20×4 LCD | |
SCL | SCL i.e. GPIO 3 |
SDA | SDA i.e. GPIO 2 |
GND | GND |
VCC | +5V |
قطعات مورد نیاز
رزبری پای | 1 |
اسکنر باکد | 1 |
ال سی دی کاراکتری 20*4 | 1 |
پرینتر حرارتی | 1 |
منبع تغذیه | 1 |
سیم جامپر | به تعداد لازم |
ما از آداپتور 9 ولت برای چاپگر حرارتی و آداپتور 5 ولت برای Raspberry Pi استفاده می کنیم.
در تصویر بالا، اجزای این پروژه و مدار من را مشاهده میکنید.
برای محفظه اجزاء، من یک جعبه مقوایی در حدود 15 سانتی متر در 12 سانتی متر ساخته ام.
برنامه نویسی سبد خرید هوشمند در رزربری پای
اکنون پس از اتصال همه اجزا، زمان آن رسیده است که به بخش کد نویسی سبد خرید هوشمند خود برویم. کد کامل در فایل دانلودی انتهای صفحه قرار گرفته است. در اینجا قسمت های مهم کد را بررسی میکنیم.
import gspread from time import sleep from RPLCD.i2c import CharLCD lcd = CharLCD('PCF8574', 0x27) from escpos.printer import Serial from datetime import datetime now = datetime.now() dt_string = now.strftime("%b/%d/%Y %H:%M:%S") lcd.cursor_pos = (0, 0) lcd.write_string("Initiallising...") #locating the spread sheet json file gc = gspread.service_account(filename='/home/pi/Ali Proj/Proj 4 Shoping Cart with Thermal Printer/Shopping Cart on 20_4 LCD/shop-data-thermal-585dc7bffa1f.json') #sheet name is to be passed sh = gc.open("Shop Data for Thermal") worksheet=sh.get_worksheet(0)
در کد بالا، ما تمام کتابخانههای لازم مانند gspread را برای API برگههای Google، زمان و sleep برای عملکرد تاخیر یا خواب، RPLCD برای LCD 20X4، و escpos برای کنترل سریال چاپگر حرارتی و datetime برای دریافت تاریخ جاری و زمان را فراخوانی میکنیم
من یک برگه Google با نام «Shop Data for Thermal» با استفاده از حساب Google خود ایجاد کردهام. شما می توانید با هر نامی که دوست دارید برگه خود را بسازید.
اکنون worksheet 1 را با فراخوانی get_worksheet(0) باز می کنیم.
""" 9600 Baud, 8N1, Flow Control Enabled """ p = Serial(devfile='/dev/serial0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1.00, dsrdtr=True)
با این قطعه کد، پورت سریال را با پارامترهای داده شده مقداردهی اولیه و راه اندازی می کنیم.
count=0 item_cost=0 totalCost=0 SNo=0 scode="" qty=1 scodePrev=0 item_name="" entryF=[] p.set( align="center", font="a", width=1, height=1, )
اکنون متغیرهای مورد نیاز را با “0” یا ” ” مقداردهی اولیه می کنیم تا حاوی هیچ مقداری نباشند. همچنین با تابع set() حالت پیش فرض چاپ را برای چاپگر حرارتی تنظیم می کنیم.
def print_receipt(): p.text("\n") p.set( align="center", font="a", width=1, height=1, ) #Printing the image p.image("/home/pi/Ali Proj/Proj 3 Interfacing thermal printer with pi/CD_new_Logo_black.png",impl="bitImageColumn") #printing the initial data p.set(width=2, height=2, align="center",) p.text(" ===============\n") p.text("Tax Invoice\n") p.text(" ===============\n") p.set(width=1, height=1, align="left",) p.text("CIRCUIT DIGEST\n") p.text("AIRPORT ROAD\n") p.text("LOCATION : JAIPUR\n") p.text("TEL : 0141222585\n") p.text("GSTIN : 08AAMFT88558855\n") p.text("Bill No. : \n\n") p.text("DATE : ") p.text(dt_string) p.text("\n") p.text("CASHIER : \n") p.text(" ===========================\n") p.text("S.No ITEM QTY PRICE\n") p.text(" ------------------------------\n") print(text_F) p.text(text_F) p.text(" -------------------------------\n") p.set( # underline=0, align="right", ) p.text(" SUBTOTAL: ") p.text(totalCostS) p.text("\n") p.text(" DISCOUNT: 0\n") p.text(" VAT @ 0%: 0\n") p.text(" ===========================\n") p.set(align="center", ) p.text(" BILL TOTAL: ") p.text(totalCostS) p.text("\n") p.text(" --------------------------\n") p.text("THANK YOU\n") p.set(width=2, height=2, align="center",) p.text(" ===============\n") p.text("Please scan\nto Pay\n") p.text(" ===============\n") p.set( align="center", font="a", width=1, height=1, density=2, invert=0, smooth=False, flip=False, ) p.qr("9509957951@ybl",native=True,size=12) p.text("\n") p.barcode('123456', 'CODE39') #if your printer has paper cuting facility then you can use this function p.cut() print("prnting done")
اکنون با کد بالا، تابعی ایجاد می کنیم که صورتحساب را چاپ می کند. فرمت فاکتور در همان تابع تنظیم شده است.
تابع p.barcode() به شما امکان می دهد بارکد حاوی «123456» را چاپ کنید.
ما برای بررسی اینکه آیا بارکد اسکن شده با برگه پایگاه داده مطابقت دارد یا خیر از try and استفاده می کنیم، اگر بارکد اسکن شده ناشناخته یا غیرمجاز باشد، پیام زیر روی LCD و در ترمینال چاپ می شود:
“Unknown Barcode or Item Not Registered”
این را می توان در کد زیر مشاهده کرد.
lcd.cursor_pos = (0, 0) lcd.write_string('Please Scan...') while 1: try: scode=input("Scan the barcode") if scode=="8906128542687": #Bill Printing Barcode pasted on the Thermal Printer print("done shopping ") lcd.clear() print(*entryF) print("in string") print(len(entryF)) text_F=" " for i in range(0,len(entryF)): text_F=text_F+entryF[i] i=i+1 lcd.cursor_pos = (0, 0) lcd.write_string("Thanks for Shopping") lcd.cursor_pos = (1, 7) lcd.write_string("With Us") lcd.cursor_pos = (3, 0) lcd.write_string("Printing Invoice...") print_receipt() else: cell=worksheet.find(scode) print("found on R%sC%s"%(cell.row,cell.col)) item_cost = worksheet.cell(cell.row, cell.col+2).value item_name = worksheet.cell(cell.row, cell.col+1).value lcd.clear() SNo=SNo+1 entry = [SNo,item_name,qty,item_cost] entryS=str(entry)+'\n' print("New Item ",*entry) lcd.cursor_pos = (0, 2) lcd.write_string(str(SNo)) lcd.cursor_pos = (0, 5) lcd.write_string("Item(s) added") lcd.cursor_pos = (1, 1) lcd.write_string(item_name) lcd.cursor_pos = (2, 5) lcd.write_string("of Rs.") lcd.cursor_pos = (2, 11) lcd.write_string(item_cost) item_cost=int(item_cost) totalCost=item_cost+totalCost lcd.cursor_pos = (3, 4) lcd.write_string("Cart Total") lcd.cursor_pos = (3, 15) lcd.write_string(str(totalCost)) entryF.append(entryS) #adding entry in Final Buffer sleep(2) except: print("Unknown Barcode or Item Not Registered") lcd.clear() lcd.cursor_pos = (0, 0) lcd.write_string("Item Not Found...") lcd.cursor_pos = (2, 0) lcd.write_string("Scan Again...") sleep(2)
نحوه استفاده از سبد خرید
- بارکد مورد نظر را اسکن کنید
- آن را در سبد خرید قرار دهید
- بررسی کنید که آیا جزئیات نشان داده شده در LCD درست است یا خیر
- مورد دیگری را اسکن کنید و همین کار را انجام دهید
- پس از دریافت تمام موارد مورد نیاز، بارکد فعال کننده صورتحساب را که روی چاپگر حرارتی چسبانده شده است اسکن کنید
- فاکتور را جمع آوری کنید و QR را برای پرداخت از طریق UPI اسکن کنید.
بنابراین به این ترتیب میتوانیم سبد خرید هوشمند خود را بسازیم که دارای یک اسکنر بارکد برای اسکن بارکد کالا، گرفتن قیمت از پایگاه داده، نمایش جزئیات اقلام اسکن شده در LCD و یک چاپگر رسید حرارتی برای چاپ فاکتور است. ما میتوانیم از تنظیمات یکسانی به صورت چندگانه استفاده کنیم. اگر سوال یا پیشنهادی دارید می توانید در قسمت نظرات مطرح کنید یا از انجمن ما استفاده کنید.
موارد موجود در فایل : سورس
ببخشید میشه یک فیلم کامل امتحان کردن و نحوه استفاده از آن را در سایت قرار دهید
سلام عزیز
اگر بشه حتما