DOOR LOCK
Peralatan yang diperlukan :
Komponen Raspberry Pi
Raspberry Pi
Berfungsi sebagai otak dari rangkaian serta memonitoring gerak rangkaian
Adaptor Raspberry Pi
Berfungsi sebagai pemasok daya untuk Raspberry Pi
Kabel VGA
Berfungsi untuk menampilkan layar pada monitor dari Raspberry Pi
Perangkat utama
Monitor
Berfungsi Sebagai tampilan visual untuk melakukan setup dan coding pada Raspberry Pi
Mouse
Berfungsi Sebagai komponen kendali untuk monitor
Keyboard
Berfungsi Sebagai komponen kendali untuk mengetik
Komponen elektronika
Door Lock
Breadboard
Berfungsi sebagai tempat dimana komponen diletakkan dan teraliri aliran listrik
Kabel Male-Female
Berfungsi untuk menghubungkan Pin dari Raspberry pada komponen
LCD + I2C module
GPIO Extension Cable
RFID Card Reader
Relay
Buzzer
Power Supply 12V
Langkah Langkah :
Persiapan Hardware :
Hubungkan modul RFID ke Raspberry Pi menggunakan kabel jumper.
Hubungkan layar LCD ke Raspberry Pi menggunakan modul I2C.
Hubungkan modul relay ke Raspberry Pi.
Hubungkan buzzer ke Raspberry Pi.
Hubungkan papan ekstensi GPIO ke Raspberry Pi.
Pasang kunci pintu ke modul relay.
Persiapan Software
Buat folder di lokasi /home/pi dengan nama “DOORLOCK”, setelah itu buka folder DOORLOCK tersebut dan buatlah folder lagi di dalamnya dengan nama “drivers”
Setelah itu Buka Thonny Python IDE lalu klik New
Setelah itu ketik
from .i2c_dev import Lcd, CustomCharacters
Setelah itu di save ke folder drivers yang sudah dibuat tadi dengan nama “__init__”
Setelah itu buka kembali Thonny Python IDE lalu klik New
Setelah itu ketik
from smbus import SMBus
from RPi.GPIO import RPI_REVISION
from time import sleep
from re import findall, match
from subprocess import check_output
from os.path import exists
# RPi versi lama dan baru telah menukar dua bus i2c
# mereka dapat diidentifikasi dengan RPI_REVISION (atau periksa sysfs)
BUS_NUMBER = 0 if RPI_REVISION == 1 else 1
# perintah lainnya
LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80
# tanda untuk mode entri tampilan
LCD_ENTRYRIGHT = 0x00
LCD_ENTRYLEFT = 0x02
LCD_ENTRYSHIFTINCREMENT = 0x01
LCD_ENTRYSHIFTDECREMENT = 0x00
# tanda untuk menampilkan kontrol hidup/mati
LCD_DISPLAYON = 0x04
LCD_DISPLAYOFF = 0x00
LCD_CURSORON = 0x02
LCD_CURSOROFF = 0x00
LCD_BLINKON = 0x01
LCD_BLINKOFF = 0x00
# tanda untuk tampilan/pergeseran kursor
LCD_DISPLAYMOVE = 0x08
LCD_CURSORMOVE = 0x00
LCD_MOVERIGHT = 0x04
LCD_MOVELEFT = 0x00
# tanda untuk kumpulan fungsi
LCD_8BITMODE = 0x10
LCD_4BITMODE = 0x00
LCD_2LINE = 0x08
LCD_1LINE = 0x00
LCD_5x10DOTS = 0x04
LCD_5x8DOTS = 0x00
# tanda untuk kontrol lampu latar
LCD_BACKLIGHT = 0x08
LCD_NOBACKLIGHT = 0x00
SESSION_STATE_BACKLIGHT = ''
En = 0b00000100 # Enable bit
Rw = 0b00000010 # Read/Write bit
Rs = 0b00000001 # Register select bit
class I2CDevice:
def __init__(self, addr=None, addr_default=None, bus=BUS_NUMBER):
if not addr:
# coba deteksi otomatis alamat, jika tidak gunakan default jika tersedia
try:
self.addr = int('0x{}'.format(
findall("[0-9a-z]{2}(?!:)", check_output(['/usr/sbin/i2cdetect', '-y', str(BUS_NUMBER)]).decode())[0]), base=16) \
if exists('/usr/sbin/i2cdetect') else addr_default
except:
self.addr = addr_default
else:
self.addr = addr
self.bus = SMBus(bus)
# tulis satu perintah
def write_cmd(self, cmd):
self.bus.write_byte(self.addr, cmd)
sleep(0.0001)
# menulis perintah dan argumen
def write_cmd_arg(self, cmd, data):
self.bus.write_byte_data(self.addr, cmd, data)
sleep(0.0001)
# menulis blok data
def write_block_data(self, cmd, data):
self.bus.write_block_data(self.addr, cmd, data)
sleep(0.0001)
# membaca satu byte
def read(self):
return self.bus.read_byte(self.addr)
# membaca
def read_data(self, cmd):
return self.bus.read_byte_data(self.addr, cmd)
# membaca blok data
def read_block_data(self, cmd):
return self.bus.read_block_data(self.addr, cmd)
class Lcd:
def __init__(self, addr=None):
self.addr = addr
self.lcd = I2CDevice(addr=self.addr, addr_default=0x27)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x02)
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
sleep(0.2)
# jam EN untuk mengunci perintah
def lcd_strobe(self, data):
if SESSION_STATE_BACKLIGHT == 0:
LCD = LCD_NOBACKLIGHT
else:
LCD = LCD_BACKLIGHT
self.lcd.write_cmd(data | En | LCD)
sleep(.0005)
self.lcd.write_cmd(((data & ~En) | LCD))
sleep(.0001)
def lcd_write_four_bits(self, data):
if SESSION_STATE_BACKLIGHT == 0:
LCD = LCD_NOBACKLIGHT
else:
LCD = LCD_BACKLIGHT
self.lcd.write_cmd(data | LCD)
self.lcd_strobe(data)
# tulis perintah ke LCD
def lcd_write(self, cmd, mode=0):
self.lcd_write_four_bits(mode | (cmd & 0xF0))
self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
# letakkan fungsi string
def lcd_display_string(self, string, line):
if line == 1:
self.lcd_write(0x80)
if line == 2:
self.lcd_write(0xC0)
if line == 3:
self.lcd_write(0x94)
if line == 4:
self.lcd_write(0xD4)
for char in string:
self.lcd_write(ord(char), Rs)
# masukkan fungsi string yang diperluas. String yang diperluas mungkin berisi placeholder seperti {0xFF} untuk
# menampilkan simbol tertentu dari tabel simbol
def lcd_display_extended_string(self, string, line):
if line == 1:
self.lcd_write(0x80)
if line == 2:
self.lcd_write(0xC0)
if line == 3:
self.lcd_write(0x94)
if line == 4:
self.lcd_write(0xD4)
# Proses stringnya
while string:
# Trying to find pattern {0xFF} representing a symbol
result = match(r'\{0[xX][0-9a-fA-F]{2}\}', string)
if result:
self.lcd_write(int(result.group(0)[1:-1], 16), Rs)
string = string[6:]
else:
self.lcd_write(ord(string[0]), Rs)
string = string[1:]
# bersihkan lcd dan atur ke rumah
def lcd_clear(self):
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_RETURNHOME)
# kontrol lampu latar (hidup/mati)
# pilihan: lcd_backlight(1) = ON, lcd_backlight(0) = OFF
def lcd_backlight(self, state):
global SESSION_STATE_BACKLIGHT
if state == 1:
self.lcd.write_cmd(LCD_BACKLIGHT)
elif state == 0:
self.lcd.write_cmd(LCD_NOBACKLIGHT)
if state == 1 or state == 0: # Save backlight settings
SESSION_STATE_BACKLIGHT = state
class CustomCharacters:
def __init__(self, lcd):
self.lcd = lcd
# Data untuk karakter khususr #1. Code {0x00}.
self.char_1_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #2. Code {0x01}
self.char_2_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #3. Code {0x02}
self.char_3_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #4. Code {0x03}
self.char_4_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #5. Code {0x04}
self.char_5_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #6. Code {0x05}
self.char_6_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #7. Code {0x06}
self.char_7_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# Data untuk karakter khusus #8. Code {0x07}
self.char_8_data = ["11111",
"10001",
"10001",
"10001",
"10001",
"10001",
"10001",
"11111"]
# memuat data karakter khusus ke CG RAM untuk digunakan nanti dalam string yang diperluas. Data untuk
# karakter disimpan di file custom_characters.txt di folder yang sama dengan i2c_dev.py
# berkas. Karakter khusus ini dapat digunakan dalam pencetakan string yang diperluas
# placeholder dengan kode karakter yang diinginkan: ke-1 - {0x00}, ke-2 - {0x01}, ke-3 - {0x02},
# ke-4 - {0x03}, ke-5 - {0x04}, ke-6 - {0x05}, ke-7 - {0x06} dan ke-8 - {0x07}.
def load_custom_characters_data(self):
self.chars_list = [self.char_1_data, self.char_2_data, self.char_3_data,
self.char_4_data, self.char_5_data, self.char_6_data,
self.char_7_data, self.char_8_data]
# perintah untuk memuat alamat karakter ke RAM mulai dari alamat dasar yang diinginkan:
char_load_cmds = [0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78]
for char_num in range(8):
# command to start loading data into CG RAM:
self.lcd.lcd_write(char_load_cmds[char_num])
for line_num in range(8):
line = self.chars_list[char_num][line_num]
binary_str_cmd = "0b000{0}".format(line)
self.lcd.lcd_write(int(binary_str_cmd, 2), Rs)
Pastikan yang diketik sudah benar, ketika sudah benar klik Save dan simpan di folder drivers yang sudah dibuat tadi dengan nama “i2c_dev”
Setelah itu kembali lagi ke Thonny Python IDE dan klik New
setelah itu Ketik
# Memasukkan library
import drivers
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
from time import sleep
# Inisialiasikan pin bel
buzzer = 19
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(buzzer,GPIO.OUT)
# Buat objek untuk LCD
display = drivers.Lcd()
# Buat objek untuk modul RFID
scan = SimpleMFRC522()
try:
print("Sekarang tempatkan kartu Anda untuk dipindai")
display.lcd_display_string("Tempatkan kartu Anda",1)
scan.write("ID kartu")
id,Tag = scan.read()
print("Your Tag ID is : " + str(id))
display.lcd_clear()
display.lcd_display_string("Tag ID",1)
display.lcd_display_string(str(id),2)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.5)
GPIO.output(buzzer,GPIO.LOW)
finally:
GPIO.cleanup()
Setelah itu save di folder DOORLOCK yang sudah dibuat tadi, ingat berada di luar folder drivers!, lalu berilah dengan nama “kartuidcheck”, setelah itu run
Maka dari LCD akan tertampil seperti ini “Tempelkan kartunya pada RFID”
Lalu copy dan paste ID kartu yang sudah tertampil pada LCD
Setelah itu ketik
# Memasukkan library
import drivers
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
from time import sleep
# Inisialisasi pin buzzer
buzzer = 19
# Inisialisasi pin relay
relay = 26
# Masukkan ID kartu Anda
Tag_ID = "(TEMPELKAN/PASTE ID KARTU YANG DI SCAN SEBELUMNYA)"
door = True
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(buzzer,GPIO.OUT)
GPIO.setup(relay,GPIO.OUT)
# Buat objek untuk LCD
display = drivers.Lcd()
# Buat objek untuk modul RFID
read = SimpleMFRC522()
# Program utama
display.lcd_display_string("Sistem Doorlock Menyala",1)
for a in range (0,15):
display.lcd_display_string(".",2)
sleep(0.1)
while True:
display.lcd_clear()
display.lcd_display_string("Tempelkan kartunya ke RFID",1)
id,Tag = read.read()
id = str(id)
if id == Tag_ID:
display.lcd_clear()
display.lcd_display_string("Berhasil",1)
if door == True:
display.lcd_display_string("Pintu terkunci!",2)
GPIO.output(relay,GPIO.HIGH)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.5)
GPIO.output(buzzer,GPIO.LOW)
door = False
sleep(3)
elif door == False:
display.lcd_display_string("Pintu terbuka!",2)
GPIO.output(relay,GPIO.LOW)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.5)
GPIO.output(buzzer,GPIO.LOW)
door = True
sleep(3)
else:
display.lcd_clear()
display.lcd_display_string("Kartu tidak terdaftar!",1)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.3)
GPIO.output(buzzer,GPIO.LOW)
sleep(0.3)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.3)
GPIO.output(buzzer,GPIO.LOW)
sleep(0.3)
GPIO.output(buzzer,GPIO.HIGH)
sleep(0.3)
GPIO.output(buzzer,GPIO.LOW)
GPIO.cleanup()
Jangan lupa mengganti Tag_ID nya sesuai ID kartu yang sudah di scan sebelumnya, lalu Save dan Run.
Maka output yang tertampil pada LCD adalah sebagai berikut
LCD menampilkan “Tempelkan kartu ke RFID” menunjukkan program berjalan dengan benar.
Silahkan tempelkan kartunya untuk membuka pintunya, maka solenoid akan bergerak membuka kuncinya dan LCD kan tertampil “Berhasil, Pintu terbuka!”.
Gunakan kartunya untuk menuntup kembali solenoidnya, dan LCD nya akan tertampil “Berhasil, Pintu tertutup!”
SELESAI
No comments:
Post a Comment