Untitled
unknown
python
3 years ago
7.2 kB
13
Indexable
import cv2
import pyzbar.pyzbar as pyzbar
import math
import RPi.GPIO as GPIO
import time, sys
import pandas as pd
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from time import sleep
misstime = 0 ##global variable to check how many times of frame it misses
Item_name = ["Juice", "LaysChips", "Biscuit", "Cake", "Maggi", "Bananas", "NoteBook", "Shampoo"]
Price = [20, 20, 20, 15, 10, 30, 50, 170]
items = {Item_name[i]: Price[i] for i in range(len(Item_name))}
m11=16
m12=15
m21=18
m22=22
def stop()
GPIO.output(m11, 0)
GPIO.output(m12, 0)
GPIO.output(m21, 0)
GPIO.output(m22, 0)
def forward():
GPIO.output(m11, 1)
GPIO.output(m12, 0)
GPIO.output(m21, 1)
GPIO.output(m22, 0)
print ("Forward")
def back():
print ("back")
GPIO.output(m11, 0)
GPIO.output(m12, 1)
GPIO.output(m21, 0)
GPIO.output(m22, 1)
def stop(ina, inb)
print("stop")
GPIO.output(in1,GPIO.LOW)
GPIO.output(in2,GPIO.LOW)
def forward(ina, inb)
print("forward")
GPIO.output(ina,GPIO.HIGH)
GPIO.output(inb,GPIO.LOW)
def backward(ina, inb)
print("backward")
GPIO.output(ina,GPIO.HIGH)
GPIO.output(inb,GPIO.LOW)
def left(ina, inb)
print("left")
GPIO.output(m11, 0)
GPIO.output(m12, 0)
GPIO.output(m21, 1)
GPIO.output(m22, 0)
def right(ina, inb)
print("right")
GPIO.output(m11, 1)
GPIO.output(m12, 0)
GPIO.output(m21, 0)
GPIO.output(m22, 0)
def obstacle(TRIG, ECHO):
print("obstacle")
i=0
avgDistance=0
for i in range(5):
GPIO.output(TRIG, False) #Set TRIG as LOW
time.sleep(0.001) #Delay
GPIO.output(TRIG, True) #Set TRIG as HIGH
time.sleep(0.00001) #Delay of 0.00001 seconds
GPIO.output(TRIG, False) #Set TRIG as LOW
while GPIO.input(ECHO)==0:
pass #Check whether the ECHO is LOW
pulse_start = time.time()
while GPIO.input(ECHO)==1: #Check whether the ECHO is HIGH
pass
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start #time to get back the pulse to sensor
distance = pulse_duration * 17150 #Multiply pulse duration by 17150 (34300/2) to get distance
distance = round(distance,2) #Round to two decimal points
avgDistance=avgDistance+distance
avgDistance=avgDistance/5 ##average the distance value and return the value
return avgDistance
def decodeDisplay(image, orders):
global misstime
barcodes = pyzbar.decode(image)
flag = 0
for barcode in barcodes: ##process every capture of frame of camera
misstime = 0
flag = 1
barcodeData = barcode.data.decode("utf-8")
print("barcodedata")
barcodeType = barcode.type
if barcodeData == 'avni.mittal2002@gmail.com': ##check if the information of QRcode mathces
# (p1,p2,p3,p4) = barcode.polygon ##get four points from image
# (x, y, w, h) = barcode.rect
print("Before obstacle")
sensor_front_left = obstacle(31,29) ##get distance from two front ultrasonic sensors
sensor_front_right = obstacle(40,37)
print("sensorRight Distance: {} sensorLeft Distance:{}".format(sensor_front_right, sensor_front_left))
avgDistance = (sensor_left_front+sensor_right_front)/2
flag=0
if avgDistance < 15: #Check whether the distance is within 15 cm range
count=count+1
stop()
time.sleep(1)
back()
time.sleep(1.5)
if (count%3 ==1) & (flag==0):
right()
flag=1
else:
left()
flag=0
time.sleep(1.5)
stop()
time.sleep(1)
else:
forward()
flag=0
if barcodeData in Item_name:
if barcodeData not in orders:
orders.add(barcodeData)
data=[]
for i in orders:
data.append([i, items[i]])
df = pd.DataFrame(data, columns=["ItemName", "Price"], index=None)
df.to_csv("data.csv", index=None)
scope = ["https://spreadsheets.google.com/feeds", 'https://www.googleapis.com/auth/spreadsheets',
"https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive"]
credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(credentials)
spreadsheet = client.open('CSV-to-Google-Sheet')
with open('data.csv', 'r') as file_obj:
content = file_obj.read()
client.import_csv(spreadsheet.id, data=content)
if flag == 0:
misstime += 1
if misstime > 10:
stop(m11, m12)
stop(m21, m22)
def detect():
camera = cv2.VideoCapture(-1) ##initialize camera
camera.set(cv2.CAP_PROP_FRAME_WIDTH,640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT,400)
# items that are bought by the user
orders = set()
print("working")
while True:
ret, frame = camera.read() ##read from camera
if ret == True:
c = cv2.waitKey(5)
cv2.imshow('video',frame) ## commwnt out if don't want to see video
if c == 27: ##press 'esc' to exit program
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
decodeDisplay(gray,orders) ##image processing
else:
break
camera.release()
cv2.destroyAllWindows() ##finish program and close windows
GPIO.cleanup()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(40,GPIO.OUT) ##right ultrasonic sensor
GPIO.setup(37,GPIO.IN)
GPIO.setup(31,GPIO.OUT) ##left ultrasonic sensor
GPIO.setup(29,GPIO.IN)
GPIO.setup(35,GPIO.OUT) ##lower left ultrasonic sensor
GPIO.setup(33,GPIO.IN)
GPIO.setup(36,GPIO.OUT) ##lower right ultrasonic sensor
GPIO.setup(38,GPIO.IN)
# 12,13 --> speed control
# 16,15 -> motor left-> 12 en
# 18,22 -> motor left-> 32 en
GPIO.setup(12,GPIO.OUT) ##12-16, motor on the left
GPIO.setup(32,GPIO.OUT) ##13-18, motor on the right
GPIO.setup(16,GPIO.OUT) # in1
GPIO.setup(15,GPIO.OUT) # in2
GPIO.setup(18,GPIO.OUT) #in3
GPIO.setup(22,GPIO.OUT) #in4
# intializing parameters
GPIO.output(16, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
GPIO.output(18, GPIO.LOW)
GPIO.output(22, GPIO.LOW)
motor1_speed = GPIO.PWM(12, 1000) #en1
motor2_speed = GPIO.PWM(32, 1000) #en2
motor1_speed.start(100)
motor2_speed.start(100)
print("Setup ok")
detect()
Editor is loading...