prototipe sistem penerangan otomatis yang diimplementasikan pada miniatur tangga biosko

SISTEM LAMPU TANGGA OTOMATIS BERBASIS RASPBERRY PI PICO DENGAN SENSOR INFRAMERAH DAN SHIFT REGISTER 74HC595

Kelompok RE-3D/6 — 

Dhesta Athaya S., Khoirudin, Rachmadhani Aji K., Theofilus Ogawa G.

ABSTRAK

Lampu tangga yang menyala terus-menerus atau dikendalikan saklar manual menyebabkan pemborosan daya pada bangunan bertingkat dengan lalu lintas pejalan kaki yang jarang. Artikel ini membahas rancangan sistem lampu tangga otomatis yang menyalakan LED anak tangga secara berurutan mengikuti arah pergerakan orang, menggunakan Raspberry Pi Pico sebagai pengendali, dua IC 74HC595 sebagai penggerak 20 LED (10 kanal), dan empat sensor inframerah FC-51 sebagai pendeteksi arah. Pengendalian animasi menyala dan padam disusun sebagai mesin keadaan (state machine) dengan empat kondisi, yaitu MATI, NYALA, HIDUP, dan PADAM, yang diperbarui menggunakan time.ticks_ms() dan time.ticks_diff(), bukan time.sleep(), sehingga kedua arah tangga (naik dan turun) dapat diproses bergantian dalam satu putaran program tanpa saling menunggu. Jeda antar anak tangga diatur melalui konstanta JEDA_MS = 120 ms. Analisis kode menunjukkan bahwa pendekatan non-blocking ini menghindari keterlambatan yang lazim terjadi pada implementasi berbasis time.sleep() bertingkat. Analisis juga menemukan satu kesalahan penulisan pada nama metode konstruktor kelas Tangga yang menyebabkan objek tidak dapat dibuat sebelum diperbaiki.

Kata kunci: lampu tangga otomatis, Raspberry Pi Pico, 74HC595, sensor inframerah, mesin keadaan, non-blocking

I. PENDAHULUAN

A. Latar Belakang

Tangga pada bangunan bertingkat umumnya diterangi dengan lampu yang menyala sepanjang waktu atau dikendalikan saklar manual di setiap lantai. Kondisi ini menimbulkan dua persoalan praktis: lampu tetap menyala saat tidak ada orang yang melintas, dan pengguna harus meraba saklar dalam kondisi gelap sebelum menaiki atau menuruni tangga. Sensor gerak pasif seperti PIR memang sudah lazim dipasang untuk menyalakan lampu tangga secara otomatis, tetapi kebanyakan implementasinya menyalakan seluruh anak tangga sekaligus, tanpa efek berjalan yang mengikuti posisi orang.

Efek berjalan (chasing light) pada LED anak tangga biasanya diprogram dengan fungsi tunda time.sleep() di antara penyalaan tiap anak tangga. Pendekatan ini menghentikan seluruh eksekusi program selama jeda berlangsung, sehingga pembacaan sensor pada arah yang berlawanan tidak dapat dilakukan bersamaan. Akibatnya, apabila ada dua orang berjalan berlawanan arah pada waktu yang berdekatan, salah satu gerakan berpotensi tidak terdeteksi selama animasi arah yang lain sedang berjalan.

B. Rumusan Masalah

Berdasarkan uraian di atas, rumusan masalah pada rancangan ini adalah bagaimana menyusun program pengendali animasi LED anak tangga yang berjalan mengikuti arah pergerakan orang tanpa memblokir pembacaan sensor pada arah yang berlawanan, serta bagaimana mengendalikan 10 kanal keluaran LED hanya dengan memanfaatkan 3 pin GPIO pada mikrokontroler.

C. Tujuan

Rancangan ini bertujuan untuk: (1) menyusun mesin keadaan non-blocking yang mengendalikan animasi menyala dan padam pada dua objek tangga (arah naik dan arah turun) secara bergantian dalam satu putaran program; (2) mengurangi jumlah pin GPIO yang digunakan melalui penambahan dua IC shift register 74HC595 yang disusun bertingkat (cascade); (3) menganalisis kebenaran logika program pada tingkat kode, termasuk memeriksa potensi kesalahan penulisan yang dapat menghentikan eksekusi.

II. METODOLOGI

Perancangan dilakukan melalui empat tahap. Pertama, pemilihan komponen berdasarkan kebutuhan sistem, yaitu mikrokontroler dengan dukungan MicroPython, IC penggerak LED yang hemat pin, dan sensor inframerah dengan keluaran digital. Kedua, penyusunan diagram blok untuk menggambarkan aliran data dari sensor menuju indikator LED. Ketiga, perancangan algoritma pengendali dalam bentuk mesin keadaan per objek tangga, dituangkan ke diagram alir sebelum dituliskan sebagai kelas Tangga pada program MicroPython. Keempat, analisis kode (code review) terhadap program yang telah ditulis, mencakup pemeriksaan jalur eksekusi tiap keadaan, perhitungan waktu animasi dari konstanta JEDA_MS, serta pemeriksaan sintaks Python pada bagian yang berpotensi menimbulkan galat saat program dijalankan.

Perlu dicatat bahwa artikel ini menyajikan hasil analisis desain dan kode, bukan hasil pengujian pada rangkaian fisik yang sudah dirakit. Pengukuran waktu tanggap sensor pada perangkat keras sebenarnya perlu dilakukan pada tahap lanjutan untuk memverifikasi angka yang diperoleh dari perhitungan pada Bagian IV.

III. KAJIAN PUSTAKA

A. Komponen

Sistem ini disusun dari komponen berikut:

1. Raspberry Pi Pico 

Gambar 1.Rasberry Pi 4

Raspberry Pi Pico merupakan papan mikrokontroler yang menggunakan chip RP2040 sebagai pusat pengendali sistem. Mikrokontroler ini diprogram menggunakan bahasa MicroPython untuk menjalankan seluruh logika pengendalian. Pada sistem ini, Raspberry Pi Pico berfungsi sebagai pengolah data dari sensor inframerah sekaligus pengendali IC shift register 74HC595. Komunikasi dengan shift register dilakukan melalui tiga jalur utama, yaitu Data (SER), Clock (SRCLK), dan Latch (RCLK). Selain itu, beberapa pin GPIO digunakan sebagai masukan (input) untuk membaca kondisi empat sensor inframerah yang dipasang pada kedua ujung tangga.

2. IC 74HC595 (2 buah) 

Gambar 2.IC 74HC595

IC 74HC595 merupakan register geser (Shift Register) tipe Serial-In Parallel-Out (SIPO) 8-bit yang berfungsi untuk memperbanyak jumlah keluaran digital dari mikrokontroler. Pada sistem ini digunakan dua buah IC 74HC595 yang disusun secara bertingkat (cascade), sehingga mampu menghasilkan hingga 16 kanal keluaran digital. Meskipun tersedia 16 keluaran, hanya 10 kanal yang dimanfaatkan untuk mengendalikan lampu tangga. Data dikirim secara serial dari Raspberry Pi Pico, kemudian diubah menjadi keluaran paralel melalui proses pergeseran data menggunakan sinyal clock dan latch. Dengan penggunaan shift register, kebutuhan pin GPIO pada mikrokontroler dapat dikurangi secara signifikan.

3. Sensor inframerah FC-51 (4 buah) 

Gambar 3.Sensor inframerah FC-51 

Sensor inframerah FC-51 digunakan sebagai pendeteksi keberadaan pengguna pada area tangga. Sensor bekerja berdasarkan prinsip pemancaran sinar inframerah yang dipantulkan oleh objek di depannya. Ketika objek terdeteksi pada jarak tertentu, keluaran sensor akan berubah menjadi kondisi aktif-LOW (logika 0). Empat sensor dipasang pada sistem, yaitu IR1 dan IR2 ditempatkan di bagian bawah dan bagian atas jalur tangga naik, sedangkan IR3 dan IR4 dipasang di bagian atas dan bagian bawah jalur tangga turun. Susunan ini memungkinkan sistem mengenali arah pergerakan pengguna sehingga urutan penyalaan LED dapat disesuaikan dengan arah naik maupun turun.

4. LED indikator anak tangga (20 buah) 

Gambar 4.LED merah

LED digunakan sebagai indikator visual yang merepresentasikan pencahayaan pada setiap anak tangga. Total terdapat 20 LED yang dibagi menjadi 10 kelompok logis, di mana setiap kelompok terdiri dari dua LED yang dipasang secara paralel sehingga menyala secara bersamaan. Setiap kelompok LED dikendalikan oleh satu kanal keluaran dari IC 74HC595. Untuk membatasi arus yang mengalir dan melindungi LED dari kerusakan, setiap kelompok LED dilengkapi dengan resistor seri sebesar 330 Ω. Dengan konfigurasi ini, sistem mampu menghasilkan efek penyalaan lampu secara berurutan sesuai arah pergerakan pengguna.

5. Catu daya 5V 

Gambar 5.Catu daya 5V 

Catu daya 5 Volt berfungsi sebagai sumber energi bagi seluruh rangkaian. Tegangan 5 Volt digunakan untuk menyuplai Raspberry Pi Pico melalui pin VBUS atau VSYS, sekaligus memberikan catu daya pada kedua IC 74HC595. Penggunaan sumber tegangan yang stabil sangat penting agar mikrokontroler, sensor, dan shift register dapat bekerja secara optimal tanpa mengalami gangguan akibat penurunan atau fluktuasi tegangan selama sistem beroperasi.

B. Diagram Blok

Diagram blok pada Gambar 1 menunjukkan aliran sinyal dari sensor inframerah menuju mikrokontroler, diteruskan ke shift register, kemudian ke indikator LED. Catu daya menyuplai baik mikrokontroler maupun rangkaian keluaran.


Gambar 1. Diagram blok sistem lampu tangga otomatis

C. Diagram Alir

Diagram pada Gambar 2 menggambarkan transisi keadaan pada objek Tangga sebagaimana didefinisikan pada kelas Tangga di dalam program. Setiap objek tangga (tangga_naik dan tangga_turun) menjalankan diagram yang identik, dan keduanya diperbarui pada tiap putaran loop utama tanpa saling menunggu.



Gambar 2. Diagram alir (transisi keadaan) objek Tangga

Keadaan MATI berpindah ke NYALA saat fungsi deteksi() pada sensor masuk bernilai benar; anak tangga ke-0 langsung dinyalakan tanpa jeda. Selama keadaan NYALA, tiap kali selisih waktu sekarang dengan waktu tercatat (self.t) mencapai JEDA_MS, indeks idx bertambah satu dan anak tangga berikutnya dinyalakan, hingga seluruh anak tangga menyala dan keadaan berpindah ke HIDUP. Keadaan HIDUP bertahan sampai sensor keluar mendeteksi objek, lalu berpindah ke PADAM dan anak tangga dimatikan berurutan dari ujung terakhir menuju ujung pertama dengan pola jeda yang sama, sebelum kembali ke MATI.

D. Rangkaian Skematik

Gambar 3 menampilkan hubungan pin pengendali antara Raspberry Pi Pico dan dua IC 74HC595. Pin GP18 dihubungkan ke pin 14 (DS) IC1 sebagai jalur data, GP19 ke pin 12 (STCP) sebagai jalur latch, dan GP20 ke pin 11 (SHCP) sebagai jalur clock. Pin 9 (Q7') pada IC1, yaitu keluaran serial yang diteruskan ke IC berikutnya, dihubungkan ke pin 14 (DS) IC2, sedangkan jalur STCP dan SHCP pada kedua IC disatukan sehingga kedua register bergeser dan mengunci data secara bersamaan.


Gambar 3. Rangkaian skematik Pico — 74HC595 — LED

Setiap keluaran Q0 hingga Q7 pada kedua IC diberi resistor seri sebelum dihubungkan ke dua LED yang dipasang paralel. Susunan ini memungkinkan 10 kanal logis pada program (channel 0-9 di dalam fungsi refresh()) memetakan langsung ke 10 pasang LED fisik.

E. Diagram Pengawatan

Gambar 4 menunjukkan pengawatan empat sensor inframerah ke pin masukan Pico. IR1 terhubung ke GP10, IR2 ke GP11, IR3 ke GP12, dan IR4 ke GP13. Keempat sensor mendapat suplai 3V3 dan GND dari Pico, sedangkan pin keluaran (OUT) masing-masing sensor dibaca sebagai masukan digital.


Gambar 4. Diagram pengawatan sensor inframerah

Polaritas keluaran sensor diatur melalui konstanta AKTIF_LOW pada program. Ketika bernilai True, fungsi deteksi() menganggap sensor mendeteksi objek saat nilai pin bernilai 0, sesuai karakteristik modul FC-51 yang digunakan pada rancangan ini.

IV. HASIL DAN PEMBAHASAN

Pembahasan berikut disusun berdasarkan pembacaan langsung terhadap program yang telah ditulis, tanpa data pengujian perangkat keras.

A. Fungsi kirim() dan Waktu Pengiriman Data

Fungsi kirim(byte_ic2, byte_ic1) menurunkan pin STCP sebelum menggeser bit agar perubahan pada register geser tidak langsung tampak di keluaran, kemudian menggeser 16 bit satu per satu dari bit paling signifikan (MSB) memakai pasangan turun-naik pada SHCP, dan menaikkan STCP di akhir untuk mengunci seluruh data ke keluaran secara serentak. Karena byte_ic2 dikirim lebih dahulu, data tersebut akan bergeser melewati IC1 menuju IC2 pada pengiriman byte kedua, sesuai dengan susunan cascade pada Gambar 3. Program tidak menyisipkan jeda eksplisit pada setiap toggle pin, sehingga durasi pengiriman 16 bit bergantung pada kecepatan eksekusi Python pada RP2040, yang pada praktiknya berorde puluhan mikrodetik dan jauh lebih singkat dibanding JEDA_MS = 120 ms yang dipakai untuk animasi.

B. Mesin Keadaan dan Perhitungan Waktu Animasi

Objek Tangga menyimpan lima nilai boolean pada self.steps, dan animasi menyala dimulai dengan menyalakan anak tangga indeks ke-0 secara langsung saat sensor masuk terdeteksi, tanpa menunggu JEDA_MS. Empat anak tangga berikutnya masing-masing menyala setelah selisih waktu mencapai JEDA_MS, sehingga total waktu dari deteksi awal hingga seluruh lima anak tangga menyala adalah (n-1) × JEDA_MS, atau 4 × 120 ms = 480 ms untuk kelima anak tangga pada satu arah. Perhitungan yang sama berlaku untuk animasi padam, yang berjalan mundur dari indeks terakhir menuju indeks pertama.

Loop utama memanggil update() pada kedua objek tangga di setiap putaran dan hanya menjeda 5 ms melalui time.sleep_ms(5). Nilai ini jauh lebih kecil dibanding JEDA_MS sehingga galat waktu penyalaan tiap anak tangga tidak lebih dari 5 ms, nilai yang tidak signifikan secara visual pada animasi LED. Pendekatan berbasis time.ticks_diff() ini yang membuat kedua arah tangga dapat diperbarui pada putaran loop yang sama tanpa satu arah menunggu animasi arah lain selesai, berbeda dari pendekatan time.sleep() bertingkat yang disebutkan pada Bagian I.

C. Fungsi refresh() dan Pemetaan Kanal

Fungsi refresh() menggabungkan lima elemen steps milik tangga_naik dan lima elemen steps milik tangga_turun menjadi satu daftar sepuluh kanal (indeks 0-4 untuk tangga naik, indeks 5-9 untuk tangga turun). Kanal indeks 0 hingga 7 dipetakan ke byte b1 (IC1) dan kanal indeks 8 hingga 9 dipetakan ke byte b2 (IC2) melalui operasi bitwise. Pemetaan ini konsisten dengan urutan pengiriman pada fungsi kirim(), yaitu byte_ic2 dikirim sebelum byte_ic1.

D. Temuan: Kesalahan Penulisan Konstruktor Kelas

Kelas Tangga menuliskan metode inisialisasi sebagai def _init_(self, ...) dengan garis bawah tunggal pada awal dan akhir nama metode. Python hanya mengenali metode konstruktor apabila ditulis dengan garis bawah ganda, yaitu __init__. Selama nama metode ditulis dengan garis bawah tunggal, Python akan memperlakukannya sebagai metode biasa, bukan konstruktor, sehingga baris tangga_naik = Tangga(ir1, ir2) akan menimbulkan TypeError karena konstruktor bawaan object tidak menerima argumen posisi. Perbaikan yang diperlukan adalah mengubah _init_ menjadi __init__ pada definisi kelas Tangga agar program dapat dijalankan sebagaimana mestinya.

E. Keterbatasan

Analisis pada bagian ini terbatas pada pembacaan kode dan perhitungan berdasarkan konstanta yang tertulis di dalamnya. Program belum diuji pada rangkaian fisik, sehingga waktu tanggap sensor FC-51 yang sebenarnya, termasuk kemungkinan pantulan sinyal (debounce) akibat gerakan tangan atau benda lain yang melintas di depan sensor, belum dapat dipastikan. Program pada versi ini juga tidak menyertakan mekanisme debounce maupun penundaan minimum antar-deteksi pada sensor yang sama.

V. PROGRAM

# =====================================================================
# Lampu Tangga Otomatis - versi NON-BLOCKING (20 LED)
# Raspberry Pi Pico + 2x 74HC595 + 4 sensor IR
# Setiap baris diberi keterangan.
#   Naik  1..5 (bawah->atas) -> IC1 Q0..Q4
#   Turun 1..3 (atas->bawah) -> IC1 Q5..Q7
#   Turun 4..5               -> IC2 Q0..Q1
# =====================================================================

from machine import Pin   # ambil kelas Pin untuk mengendalikan kaki GPIO Pico
import time               # ambil modul time untuk fungsi waktu (ticks_ms)

# ---------- Pengaturan yang bisa diubah ----------
JEDA_MS   = 120     # jeda antar anak tangga (ms); makin besar = makin pelan
AKTIF_LOW = True    # True bila sensor memberi sinyal 0 (LOW) saat mendeteksi (FC-51)
TUNGGU_MS = 20000   # lama countdown sebelum LED mulai padam (ms) = 20 detik

# ---------- Pin kontrol 74HC595 ----------
DS   = Pin(18, Pin.OUT)  # GP18 output -> jalur DATA ke pin 14 (DS) IC1
STCP = Pin(19, Pin.OUT)  # GP19 output -> jalur LATCH (pengunci) ke pin 12
SHCP = Pin(20, Pin.OUT)  # GP20 output -> jalur CLOCK (penggeser) ke pin 11

# ---------- Pin sensor IR ----------
ir1 = Pin(10, Pin.IN)  # GP10 input -> sensor bawah tangga naik
ir2 = Pin(11, Pin.IN)  # GP11 input -> sensor atas  tangga naik
ir3 = Pin(12, Pin.IN)  # GP12 input -> sensor atas  tangga turun
ir4 = Pin(13, Pin.IN)  # GP13 input -> sensor bawah tangga turun


def kirim(byte_ic2, byte_ic1):       # fungsi mengirim 16 bit ke dua IC
    STCP.value(0)                    # tutup latch: output LED tak berubah saat menggeser
    for b in (byte_ic2, byte_ic1):   # proses 2 byte; IC2 (terjauh) dikirim lebih dulu
        for i in range(7, -1, -1):   # ulangi bit dari nomor 7 turun ke 0 (MSB dulu)
            SHCP.value(0)            # turunkan clock (persiapan)
            DS.value((b >> i) & 1)   # taruh bit ke-i ke jalur data (hasil 0 atau 1)
            SHCP.value(1)            # naikkan clock: 1 bit digeser masuk ke register
    STCP.value(1)                    # buka latch: semua data tampil serentak ke LED


def deteksi(pin):                    # fungsi cek apakah sensor mendeteksi orang
    if AKTIF_LOW:                    # jika sensor bertipe aktif-LOW
        return pin.value() == 0      # terdeteksi bila nilai pin = 0
    return pin.value() == 1          # selain itu, terdeteksi bila nilai pin = 1


class Tangga:                                          # mesin keadaan untuk satu tangga
    def __init__(self, sensor_masuk, sensor_keluar):  # dijalankan saat objek dibuat
        self.steps  = [0, 0, 0, 0, 0]   # kondisi 5 anak tangga (0=mati,1=nyala); idx0 = ujung masuk
        self.n      = len(self.steps)   # jumlah anak tangga (= 5)
        self.masuk  = sensor_masuk      # sensor pemicu MENYALA
        self.keluar = sensor_keluar     # sensor pemicu PADAM
        self.state  = "MATI"            # keadaan awal: siaga (semua mati)
        self.idx    = 0                 # penanda langkah animasi saat ini
        self.t      = 0                 # mencatat waktu langkah terakhir / awal countdown

    def update(self, sekarang):         # dipanggil terus; majukan animasi bila waktunya tiba
        berubah = False                 # penanda apakah ada perubahan kondisi

        if self.state == "MATI":                # --- keadaan SIAGA ---
            if deteksi(self.masuk):             # bila sensor masuk mendeteksi orang
                self.state = "NYALA"            # mulai proses menyala
                self.idx = 0                    # mulai dari anak tangga pertama
                self.steps[0] = 1               # nyalakan anak tangga pertama
                self.t = sekarang               # catat waktunya
                berubah = True                  # tandai ada perubahan

        elif self.state == "NYALA":             # --- merambat MENYALA ---
            if time.ticks_diff(sekarang, self.t) >= JEDA_MS:  # bila sudah lewat JEDA_MS
                self.t = sekarang               # perbarui catatan waktu
                self.idx += 1                   # maju ke anak tangga berikutnya
                if self.idx < self.n:           # bila masih ada anak tangga
                    self.steps[self.idx] = 1    # nyalakan anak tangga itu
                    berubah = True              # tandai ada perubahan
                else:                           # bila semua sudah menyala
                    self.state = "HIDUP"        # pindah ke keadaan menyala penuh

        elif self.state == "HIDUP":             # --- semua nyala, tunggu sampai ujung ---
            if deteksi(self.keluar):            # bila sensor keluar mendeteksi orang
                self.state = "TUNGGU"           # mulai countdown, LED tetap menyala dulu
                self.t = sekarang               # catat waktu mulai countdown
                # LED belum dipadamkan di sini -> tidak perlu set berubah

        elif self.state == "TUNGGU":            # --- countdown 20 detik sebelum padam ---
            if deteksi(self.masuk):             # bila ada pengguna baru lewat sensor masuk
                self.state = "HIDUP"            # batalkan countdown, LED tetap menyala penuh
            elif time.ticks_diff(sekarang, self.t) >= TUNGGU_MS:  # bila countdown habis
                self.state = "PADAM"            # mulai proses memadamkan
                self.idx = self.n - 1           # mulai dari anak tangga terakhir
                self.steps[self.idx] = 0        # matikan anak tangga terakhir
                self.t = sekarang               # catat waktunya (untuk animasi padam)
                berubah = True                  # tandai ada perubahan

        elif self.state == "PADAM":             # --- merambat PADAM ---
            if time.ticks_diff(sekarang, self.t) >= JEDA_MS:  # bila sudah lewat JEDA_MS
                self.t = sekarang               # perbarui catatan waktu
                self.idx -= 1                   # mundur ke anak tangga sebelumnya
                if self.idx >= 0:               # bila masih ada anak tangga
                    self.steps[self.idx] = 0    # matikan anak tangga itu
                    berubah = True              # tandai ada perubahan
                else:                           # bila semua sudah padam
                    self.state = "MATI"         # kembali ke keadaan siaga

        return berubah                          # beri tahu pemanggil apakah ada perubahan


# buat objek untuk masing-masing tangga
tangga_naik  = Tangga(ir1, ir2)   # naik : masuk dari bawah (ir1), keluar di atas (ir2)
tangga_turun = Tangga(ir3, ir4)   # turun: masuk dari atas (ir3), keluar di bawah (ir4)


def refresh():                                       # susun kondisi tangga -> kirim ke IC
    state = tangga_naik.steps + tangga_turun.steps   # gabung jadi 10 channel (naik 0-4, turun 5-9)
    b1 = 0                                            # data untuk IC1 (mula-mula kosong)
    b2 = 0                                            # data untuk IC2 (mula-mula kosong)
    for ch in range(10):                             # periksa 10 channel satu per satu
        if state[ch]:                               # bila channel itu menyala
            if ch < 8:                              # channel 0-7 ada di IC1
                b1 |= (1 << ch)                     # set bit ke-ch pada b1
            else:                                   # channel 8-9 ada di IC2
                b2 |= (1 << (ch - 8))               # set bit ke-(ch-8) pada b2 (Q0,Q1)
    kirim(b2, b1)                                    # kirim kedua byte ke shift register


refresh()                              # pastikan semua LED mati saat program mulai

while True:                               # ulang selamanya
    sekarang = time.ticks_ms()         # baca waktu sekarang (ms)
    a = tangga_naik.update(sekarang)   # perbarui tangga naik
    b = tangga_turun.update(sekarang)  # perbarui tangga turun (bersamaan dengan naik)
    if a or b:                         # bila salah satu menghasilkan perubahan
        refresh()                      # kirim kondisi baru ke LED
    time.sleep_ms(5)                   # jeda polling kecil (bukan pengatur kecepatan animasi)

VI. KESIMPULAN

Rancangan mesin keadaan dengan empat kondisi (MATI, NYALA, HIDUP, PADAM) yang diperbarui memakai time.ticks_diff() berhasil menghindari pemblokiran eksekusi yang biasa terjadi pada penggunaan time.sleep() bertingkat, sehingga kedua arah tangga dapat diproses dalam satu putaran loop yang sama. Penggunaan dua IC 74HC595 yang disusun cascade mengurangi kebutuhan pin GPIO dari 10 pin keluaran langsung menjadi 3 pin (DS, STCP, SHCP), dengan total waktu animasi dari anak tangga pertama hingga anak tangga kelima sebesar 480 ms sesuai konstanta JEDA_MS = 120 ms. Analisis kode juga menemukan kesalahan penulisan pada metode konstruktor kelas Tangga (_init_ alih-alih __init__) yang perlu diperbaiki agar program dapat dijalankan. Pengujian pada rangkaian fisik, termasuk pengukuran waktu tanggap sensor dan penambahan mekanisme debounce, disarankan sebagai tahap lanjutan sebelum sistem ini dipasang pada tangga sebenarnya.


VII. LAMPIRAN

link YT : https://youtu.be/Q-2GJtSEedw
link PPT :https://canva.link/lsg1sf0m7pk2js9

Komentar

Postingan populer dari blog ini

SISTEM KONVEYOR OTOMATIS DENGAN SENSOR INFRARED DAN KONTROL MANUAL

Pompa Air Otomatis Berbasis ATMega8535

SISTEM PEMANTAUAN SUHU DAN KELEMBABAN PADA SUATU RUANGAN MENGGUNAKAN SENSOR DHT22 BERBASIS MIKROKONTROLLER ARDUINO UNO ATMEGA328P