آموزش رزبری پایپروژه رزبری پای

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

در این پروژه قصد داریم یک سبد خرید هوشمند با چاپگر رسید حرارتی، ال سی دی و اسکنر بارکد 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 و یک چاپگر رسید حرارتی برای چاپ فاکتور است. ما می‌توانیم از تنظیمات یکسانی به صورت چندگانه استفاده کنیم. اگر سوال یا پیشنهادی دارید می توانید در قسمت نظرات مطرح کنید یا از انجمن ما استفاده کنید.

موارد موجود در فایل : سورس

دانلود فایل های پروژه

3.7/5 - (3 امتیاز)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.
تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

2 نظر

  1. محمد درگاه زاده گفت:

    ببخشید میشه یک فیلم کامل امتحان کردن و نحوه استفاده از آن را در سایت قرار دهید

    1. محمد رحیمی گفت:

      سلام عزیز
      اگر بشه حتما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.