• Tidak ada hasil yang ditemukan

BAB V KESIMPULAN DAN SARAN

5.2 Saran

Berdasarkan hasil implementasi yang diperoleh, untuk pengembangan lebih lanjut terdapat beberapa saran agar alat ini dapat bekerja lebih baik, yaitu :

1. Penggantian webcam dengan spesifikasi yang lebih baik seperti tingkat resolusi gambar HD (High Definition) dan autofocus sehingga pendeteksian barcode dapat lebih cepat pembacaannya.

2. Pembuatan hardware agar sistem dapat di implementasikan pada ruangan yang sebenarnya.

3. Penggantian tampilan pada GUI agar tampilan lebih baik dan user-friendly. 4. Pembenahan bug pada program pengondisian jika tidak ada nama dalam

43

DAFTAR PUSTAKA

[1] Schmidt, M., 2012, Raspberry Pi: A Quick-Start Guide, The Pramatic Programmers,

United States of America.

[2] Richardson, M., Wallace S., 2012, Getting Started with Raspberry Pi, O’Reilly Media,

United States of America.

[3] McManus, Sean., Mike Cook, 2013, Raspberry Pi For Dummies, Wiley Brand, United

States of America.

[4] Bresert, E., 2013, SciPy and NumPy, 2nded, O’Reilly Media, United States of America.

[5] ----, ----, Motor Servo,

http://elektronika-dasar.web.id/teori-elektronika/motor-servo/ , diakses pada tanggal 2 Mei 2016

[6] Facemyer, Joshua, Inkscape E-Book, Free Software Foundation, Inc., United States of

America.

[7] Raharjo, Budi, 2015, Mudah Belajar Python Untuk Aplikasi Desktop dan Web, Penerbit Informatika, Indonesia.

[8] ----, ----, Bar Coding for Books E-Book

http://www.barcodefaq.com/ , diakses pada tanggal 13 Juni 2016.

[9] Downey, Allen, 2012, Think Python, Green Tea Press, United States of America. [10] Lundh, Fredrik, 1999, An Introduction to Tkinter, ----, United States of America.

[11] http://www.tutorialspoint.com/sqlite/sqlite_python.htm diakses pada tanggal 12 Juni 2016.

[12] Owens, M., 2006, The Definitve Guide To SQLite, Apress, United States of America. [13] ----, ----, Raspberry Pi Forum

[14] ----, ----, Python Coding Forum

LISTING PROGRAM PYTHON 2.7

from Tkinter import *

from tkMessageBox import * import tkMessageBox as mb import MySQLdb import sys import ttk import time import zbar import os

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False)

GPIO.setup(16, GPIO.OUT) #LED Masuk GPIO.setup(20, GPIO.OUT) #LED Keluar GPIO.setup(13, GPIO.OUT) #Buzzer

GPIO.setup(19, GPIO.OUT) #Solenoid Masuk GPIO.setup(26, GPIO.OUT) #Solenoid Keluar

judul_kolom = ("WAKTU MASUK", "WAKTU KELUAR", "NIM")

class Data(Frame):

def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.parent.geometry("900x500") self.parent.resizable(False, False) self.teksJam = StringVar() self.initUI()

self.koneksi() self.isiidentitas(self.sql) self.isiTabel() self.detail() self.listboxData.bind('<ButtonRelease>', self.klik) self.closecam() def initUI(self):

self.update() # memanggil def update dan menjalankanya self.teksJam = StringVar()

self.datJam_menu = time.strftime("SECURITY ROOM ACCESS BASED ON RASPI WITH BARCODE - BONIFASIUS KRISTIAWAN", time.localtime())

# atur ukuran window

# menempatkan window di tengah layar PC/Laptop lebar = 850

tinggi = 500

# ************************* penggunaan fungsi winfo_screenwidth() ************************ #

setTengahX = (self.parent.winfo_screenwidth() - lebar) // 2

# ************************* penggunaan fungsi winfo_screenheight() setTengahY = (self.parent.winfo_screenheight() - tinggi) // 2

self.parent.geometry("%ix%i+%i+%i" % (lebar, tinggi, setTengahX, setTengahY))

# ****************************************************************

mainFrame = Frame(self.parent, bg='blue', relief=RIDGE, bd=7) mainFrame.pack(fill=BOTH, expand=YES)

self.main = mainFrame self.parent.title(self.datJam_menu) # *********************** tampilan menubar ********************* # self.menubar = Menu(self.parent) self.parent.config(menu=self.menubar) self.menu = Menu(self.menubar)

self.menu.add_command(label="Aktifkan Webcam 1", command=self.runscan) self.menu.add_command(label="EXIT", command=quit)

self.menubar.add_cascade(label="Utama", menu=self.menu)

self.fr_inti = Frame(mainFrame, bg='black') self.fr_inti.pack(expand=YES)

# ************************* Fitur Entry ********************** #

fr_c = Frame(self.fr_inti, bg='black') fr_c.pack(expand = YES)

self.button1 = Button(fr_c, text='INPUT :', bg='gray', fg='black', relief=RAISED, bd=2, command=self.masuk)

self.button1.pack(side=LEFT)

self.entryc = Entry(fr_c, relief=RIDGE, bd=2)

self.entryc.pack(side=LEFT, ipadx=20, expand=YES)

# *********************** BUAT TABEL *********************** #

# buat frame untuk tabel beserta scrollbar-nya fr_data = Frame(self.fr_inti, bd=2)

# buat tabel dengan Treeview

self.trvTabel = ttk.Treeview(fr_data, columns=judul_kolom, show='headings')

# buat scrollbar

sbVer = Scrollbar(fr_data, orient='vertical', command=self.trvTabel.yview)

sbVer.pack(side=LEFT, fill=BOTH)

self.trvTabel.pack(side=RIGHT, fill=Y, expand=NO)

# ************************* fitur listbox n scroll *************************

self.listboxData = Listbox(self.fr_inti, bg='black', fg='white', width=25, height=3) self.listboxData.pack(side=TOP, expand=NO)

s = ttk.Style()

s.theme_use('default')

# ************************* fitur detail identitas ************************* #

self.fr_kanan = LabelFrame(self.fr_inti, text='DETAIL', fg='white', bg='black') self.fr_kanan.pack(side=RIGHT, padx=2, pady=2 , expand=NO )

fr_hdr = Frame(self.fr_kanan, bg='black')

fr_hdr.pack(side=BOTTOM , expand=YES, pady=10)

# ************************* fitur detail nama, nim dan jabatan *************************

fr_nn=Frame(self.fr_kanan, bg='black')

self.entrynn4 = Entry(fr_nn, relief=RIDGE, bd=4)

self.entrynn4.pack(side=BOTTOM, fill=X, expand=YES, pady=3)

self.entrynn3 = Entry(fr_nn, relief=RIDGE, bd=4)

self.entrynn3.pack(side=BOTTOM, fill=X, expand=YES, pady=3)

self.entrynn2 = Entry(fr_nn, relief=RIDGE, bd=4)

self.entrynn2.pack(side=BOTTOM, fill=X, expand=YES, pady=3)

self.entrynn1 = Entry(fr_nn, relief=RIDGE, bd=4)

self.entrynn1.pack(side=BOTTOM, fill=X, expand=YES, pady=3)

# ************************* label untuk jam() *************************

self.fr_out = LabelFrame(mainFrame, bg='grey') self.fr_out.pack(side=RIGHT , expand=YES)

self.jam = Label(self.fr_out, bg='black', textvariable=self.teksJam , compound='right', fg='white', font=('Comic Sans MS', 10)) self.jam.pack(side=BOTTOM)

#***********************Fungsi-Fungsinya*************************

# *********************** Koneksi Database *****************************#

def koneksi(self):

self.conn = MySQLdb.connect("localhost", "root", "raspberry", "roomaccess") self.cur = self.conn.cursor()

self.sql = "SELECT * FROM identitas"

def eksekusi(self, sql):

self.cur.execute(self.sql) result = self.cur.fetchall() totData = len(result) return result, totData

# ******************************* Menampilkan Isi tabel identitas *********************** #

def isiidentitas(self, sql=None): self.listboxData.delete(0, END)

sql = self.sql + "ORDER BY ididentitas" baris, jumData = self.eksekusi(sql)

if jumData == 0:

print("from isiidentitas") mb.showwarning("Perhatian!",

"Tidak Ada Nama Dalam Database!")

else:

for data in range(jumData):

teks = "%s" %(baris[data][1]) self.listboxData.insert(END, teks) self.listboxData.selection_set(0) self.baris = baris self.jumData = jumData

# ****************************** Fungsi Untuk menampilkan Detail Nama ********************* #

index = self.listboxData.curselection() kode = self.listboxData.get(index)

sql ="SELECT * FROM identitas WHERE nama = '%s'"%kode #print 'kode: ', kode

self.cur.execute(sql) result = self.cur.fetchall() #print 'result :', result

self.entryKosong() self.entrynn1.insert(END, result[0][0]) self.entrynn2.insert(END, result[0][1]) self.entrynn3.insert(END, result[0][2]) self.entrynn4.insert(END, result[0][3]) #print sql # ************************** Isi Tabel *********************** # def isiTabel(self):

sql = "SELECT history.*, identitas.ididentitas FROM history LEFT JOIN identitas ON history.member = identitas.ididentitas ORDER BY idhistory ASC"

self.cur.execute(sql) result = self.cur.fetchall() c = 0

for kolom in result:

self.trvTabel.insert('', 'end', text=str(c), values=(kolom[1], kolom[2], kolom[3])) c += 1

# isi judul tabel

for kolom in judul_kolom:

self.trvTabel.heading(kolom, text=kolom)

# ************************* Fungsi Kejadian Untuk Klik Detail Nama *************************** #

##

def masuk(self):

ididentitas = str(self.entryc.get())

joinSQL = "SELECT identitas.ididentitas FROM history LEFT JOIN identitas ON identitas.ididentitas = history.member WHERE identitas.ididentitas = '%s'"%(ididentitas) self.cur.execute(joinSQL)

cekIdentitas = len(self.cur.fetchall()) == 0 if cekIdentitas:

historySQL = "SELECT * FROM history WHERE member = '%s' AND waktu_keluar = '0000-00-00 00:00:00'"%(ididentitas)[:9]

self.cur.execute(historySQL)

cekHistory = len(self.cur.fetchall()) == 0 if cekHistory:

SQL = "INSERT INTO history(waktu_masuk, waktu_keluar, member) VALUES (NOW(), '0000-00-00 00:00:00', '%s')"%(ididentitas)[:9]

mb.showwarning("Perhatian!", "SELAMAT DATANG") self.pintuMasuk()

else:

SQL = "UPDATE history SET waktu_keluar = Now() WHERE member = '%s' AND waktu_keluar = '0000-00-00 00:00:00'"%(ididentitas)[:9]

mb.showwarning("Perhatian!", "SELAMAT JALAN") self.cur.execute(SQL) self.conn.commit() self.isiTabel() self.pintuKeluar() else:

mb.showwarning("Perhatian!", "Tidak Ada Nama Dalam Database!") self.buzzer()

# ********************************** Aktifkan barcode scanner dari webcam **************#

def runscan(self): try:

p = os.popen('LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so zbarcam /dev/video','r') print('Scanning') data = p.readline() print(data) qrcode = str(data)[8:] self.entryc.insert(END, qrcode) if(qrcode): test = qrcode print(test) finally: p.close() def closecam(self): ididentitas = str(self.entryc.get())[8:] # ************************* OUTPUT *************************** # def pintuMasuk(self):

##coding LED & Solenoid for i in range(0, 1): GPIO.output(16, GPIO.HIGH) GPIO.output(19, GPIO.HIGH) time.sleep(1.5) GPIO.output(16, GPIO.LOW) GPIO.output(19, GPIO.LOW) time.sleep(0.5) GPIO.cleanup() root.update()

def pintuKeluar(self): for i in range (0, 1): GPIO.output(20, GPIO.HIGH) GPIO.output(26, GPIO.HIGH) time.sleep(1.5) GPIO.output(20, GPIO.LOW) GPIO.output(26, GPIO.LOW) time.sleep(0.5) GPIO.cleanup() root.update() def buzzer(self): for i in range (0, 2): GPIO.output(13, GPIO.HIGH) time.sleep(0.1) GPIO.output(13, GPIO.LOW) time.sleep(0.1) GPIO.output(13, GPIO.HIGH) time.sleep(0.1) GPIO.output(13, GPIO.LOW) time.sleep(0.1) GPIO.output(13, GPIO.HIGH) time.sleep(0.1) GPIO.output(13, GPIO.LOW) time.sleep(1) GPIO.cleanup() root.update()

# ************************* Fungsi Kejadian Untuk Klik Detail Nama *************************** #

def klik(self, event): self.detail()

def dblklik(self, event):

self.entrynn1.configure(state=NORMAL) self.entrynn2.configure(state=NORMAL) self.entrynn3.configure(state=NORMAL) self.entrynn4.configure(state=NORMAL) self.listboxData.configure(state=DISABLED) self.entrynn1.focus_set() self.klik() def entryKosong(self): self.entrynn1.delete(0, END) self.entrynn2.delete(0, END) self.entrynn3.delete(0, END) self.entrynn4.delete(0, END)

# **************************** Insert Hasil Input Ke Tampilan Grid GUI ******************** #

def update(self):

# strftime() berfungsi untuk merubah data waktu secara lokal # menjadi bentuk string yang kita inginkan.

datJam = time.strftime("%d / %m / %Y %H : %M : %S %p ", time.localtime())

# mengubah teks jam sesuai dengan waktu saat ini self.teksJam.set(datJam)

# perubahan teks jam dalam selang waktu 1 detik (1000 ms) self.timer = self.parent.after(1000, self.update)

if __name__ =='__main__': root = Tk()

app = Data(root) root.mainloop()

Dokumen terkait