Tuesday, June 24, 2025

Doorlock

 DOOR LOCK


Peralatan yang diperlukan :

  1. 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

 



  1. 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 


  1. 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