Simulasi LED dan Push Button ESP32 dan MicroPython 2

Assalamualaikum, pada tutorial kali ini kita akan mencoba untuk mengeksplor microPython lebih dalam lagi. Kali ini kita akan mencoba untuk mengendalikan 5 buah LED dengan menggunakan 1 tombol saja. 5 LED akan kita hidupkan satu persatu dengan cara menekan tombol. Jika tombol ditekan 1 kali lampu 1 on, jika tombol ditekan lagi lampu 2 on dst. Untuk yang baru berkunjung, kamu bisa buka kembali post sebelumnya tentang Simulasi LED dan Push Button ESP32 dan MicroPython 1

Baiklah, tanpa panjang lebar lagi, langsung saja kita mulai

Persiapan Awal

Arahkan browser kamu ke https://wokwi.com/, cari microPython, lalu klik tombol new project dan pilih Micropython on ESP32.

Gambar Rangkaian 1 LED

Kita akan menggunakan 5 buah LED dan 1 buah tombol push button. Rangkaian push button juga membutuhkan sebuah resistor 10K ohm agar penekanan tombol tidak mengambang. Buatlah rangkaian seperti gambar dibawah ini:

Menulis Program / Coding

Setelah rangkaian selesai dibuat, kita arahkan fokus kita ke panel sebelah kiri untuk menulis program. Program kali ini agak sedikit panjang, namun saya akan coba untuk menjelaskannya satu persatu secara detail.

Langkah pertama kita panggil 2 modul machine dan time supaya kita bisa mengendalikan pin pada ESP32 dan membuat delay /sleep dengan mengetikkan:

from machine import Pin
from time import sleep

Berikutnya kita buat sebuah variabel dalam bentuk list untuk mendaftarkan semua pin LED yang akan kita gunakan dengan cara:

from machine import Pin
from time import sleep

led_pins = [16, 17, 18, 19, 21]

Karena kita menggunakan pin 16,17,18, 19 dan 21 maka list harus berisi angka-angka tersebut. Jika kalian menggunakan pin lain, silahkan sesuaikan dengan nomor pin yang digunakan.

Selanjutnya kita buat variabel dengan list comprehension yang berupa list baru berdasarkan list yang sudah ada sebelumnya. Sebelumnya kita sudah membuat list bernama “led_pins” yang menentukan pin mana saja yang akan digunakan, namun kita belum menugaskan pin-pin tersebut sebagai output. nah, list comprehension ini akan membuat list baru berdasarkan list “led_pins” dengan tambahan fungsi output. Cara ini jauh lebih gampang jiika dibandingkan harus membuat variabel untuk masing-masing pin. caranya:

from machine import Pin
from time import sleep

led_pins = [16, 17, 18, 19, 21]
leds = [Pin(pin, Pin.OUT) for pin in led_pins]

Sampai disini kita sudah memberi tugas kepada 5 buah pin sebagai output untuk menghidupkan LED. Berikutnya kita buat variabel “button” dan menugaskan pin 15 sebagai input.

led_pins = [16, 17, 18, 19, 21]
leds = [Pin(pin, Pin.OUT) for pin in led_pins]
button = Pin(15, Pin.IN)

Buat lagi dua buah variabel yang berfungsi untuk melacak status tekanan tombol. Variabel pertama bernama current_led dan diberi nilai awal 0. Variabel ini berfungsi untuk melacak jumlah tekanan tombol. Variabel yang kedua diberi nama button_pressed dengan nilai awal false. Variabel ini akan melacak status tekanan tombol sedang ditekan atau tidak. Jika sedang ditekan, maka button_pressed akan bernilai true dan sebaliknya.

led_pins = [16, 17, 18, 19, 21]  # GPIO untuk LED
leds = [Pin(pin, Pin.OUT) for pin in led_pins]
button = Pin(15, Pin.IN)  # Tombol dengan pull-down resistor

current_led = 0
button_pressed = False

Saat mesin pertama kali hidup, saya ingin secara default semua LED tidak menyala. Untuk itu maka kita perlu mendefinisikan sebuah fungsi yang bernama clear_leds(). Fungsi ini akan dibaca pertama kali sebelum loop terjadi untuk memastikan semua LED mati saat start.

current_led = 0
button_pressed = False

def clear_leds():
    for led in leds:
        led.value(0)

Setelah itu, panggil fungsi clear_leds dan tambahkan perintah print untuk monitoring lewat console

def clear_leds():
    for led in leds:
        led.value(0)

clear_leds()
print("Program dimulai. Semua LED dimatikan.")

Berikutnya kita masuk ke loop utama. Semua logika untuk membaca tombol, memodifikasi status LED, dan mengatur debounce tombol berada di dalam loop ini. Sama seperti sebelumnya, kita mulai dengan while True:

while True:

Dibawah nya, kita tambahkan logika if untuk mengendalikan LED dengan tekanan push button.

while True:
    if button.value() == 0 and not button_pressed:
        button_pressed = True
        current_led += 1

Logika if diatas mempunyai 2 kondisi yang harus terpenuhi, yaitu nilai button.value() bernilai 0 yang artinya tombol sedang ditekan dan not button_pressed yang artinya variabel button_pressed sedang bernilai false. Jika diterjemahkan, “jika tombol sedang ditekan dan variabel button_pressed bernilai false maka……”

dibawah baris logika if kita tambahkan tugas yang harus dilakukan jika kedua kondisi diatas terpenuhi yaitu merubah variabel button_pressed menjadi True dan menambahkan nilai current_led menjadi 1.

Variabel current_led saat program pertama kali dijalankan adalah 0, dengan perintah current_led +=1 maka current_led berubah nilainya menjadi 0 + 1 = 1. Nilai ini nantinya akan menentukan LED mana yang akan hidup. jika nilai current_led = 1 maka lampu 1 akan hidup, jika bernilai 3 maka lampu ke 3 akan hidup.

Berikutnya saya ingin membuat semua LED mati saat tekanan ke 6 (karena hanya ada 5 LED). Untuk itu kita perlu mengembalikan nilai current_led menjadi 0 saat current_led bernilai 6 atau lebih dari 5. caranya, kita tambahkan logika if baru dibawah logika if sebelumnya (perlu diingat bahwa indentasi sangat penting) :

while True:
    if button.value() == 0 and not button_pressed:
        button_pressed = True
        current_led += 1

        if current_led > 5:
            current_led = 0

Sampai disini kita sudah berhasil membuat status tekan tombol dan pendeteksi tekanan. Langkah berikutnya, kita akan menghidupkan lampu LED berdasarkan nilai current_led.

Pertama-tama, kita matikan semua lampu LED dengan fungsi clear_leds()

        if current_led > 5:
            current_led = 0

        clear_leds()

Berikutnya kita hidupkan lampu LED satu persatu secara bergantian dengan memanfaatkan nilai current_led. Jika nilai current_led lebih besar dari 0, maka program akan memerintahkan lampu untuk hidup berdasarkan list yang dibuat sebelumnya dan jika nilai lebih dari 5 dan kembali ke 0 maka semua lampu akan mati. Tambahkan juga fungsi print untuk monitoring lampu.

        clear_leds()  
        if current_led > 0:
            leds[current_led - 1].value(1)  #nyalakan LED sesuai nilai current_led
            print(f"Tombol ditekan. LED {current_led} menyala.")
        else:
            print("Tombol ditekan. Semua LED mati.")

        sleep(0.2)  # Debouncing tombol, supaya pembacaan tidak melayang antara HIGH / LOW

Terakhir, kita tambahkan deteksi pelepasan tombol dan merubah variabel button_pressed menjadi false kembali saat tombol dilepas. Untuk menjalankan logika ini, kita tambahkan logika if dengan kondisi “jika tombol dilepas (bernilai 1), maka variabel button_pressed menjadi false”

    if button.value() == 1:
        button_pressed = False

Tanpa logika ini, tombol tidak akan berfungsi sebagaimana mestinya.

Keseluruhan program dapat kita lihat dibawah ini:

from machine import Pin
from time import sleep

# Inisialisasi LED dan tombol
led_pins = [16, 17, 18, 19, 21]  # GPIO untuk LED
leds = [Pin(pin, Pin.OUT) for pin in led_pins]
button = Pin(15, Pin.IN)  # Tombol dengan pull-down resistor

# Variabel untuk melacak status
current_led = 0
button_pressed = False

# Fungsi untuk mematikan semua LED
def clear_leds():
    for led in leds:
        led.value(0)

# Matikan semua LED saat awal
clear_leds()
print("Program dimulai. Semua LED dimatikan.")

while True:
    # Periksa apakah tombol ditekan
    if button.value() == 0 and not button_pressed:
        button_pressed = True
        current_led += 1

        # Reset saat tekanan ke-6
        if current_led > 5:
            current_led = 0

        # Update LED berdasarkan tekanan
        clear_leds()  # Matikan semua LED
        if current_led > 0:
            leds[current_led - 1].value(1)  # Nyalakan LED yang sesuai
            print(f"Tombol ditekan. LED {current_led} menyala.")
        else:
            print("Tombol ditekan. Semua LED mati.")

        sleep(0.2)  # Debouncing tombol

    # Deteksi pelepasan tombol
    if button.value() == 1:
        button_pressed = False

Saya juga sudah menambahkan beberapa komentar untuk mempermudah pembacaan program.

Hasil

Akhirnya selesai sudah seluruh rangkaian proses simulasi dan kita bisa langsung coba simulasikan hasil rangkaian dan program yang telah buat dengan cara klik tombol start simulation pada panel bagian kanan. Hasilnya akan terlihat seperti video dibawah ini:

Demikian untuk tutorial kali ini, sampai jumpa di tutorial berikutnya.