# ESP32 MicroPython — 4-bit LED Chaser (Knight Rider)
from machine import Pin
import time
# --- LED pin order (left -> right) ---
LED_PINS = [19, 18, 5, 17]
leds = [Pin(p, Pin.OUT, value=0) for p in LED_PINS]
# --- 4-bit software register (leftmost bit is index 0) ---
register = [1, 0, 0, 0] # start with the left LED ON
direction = 1 # +1 = move right, -1 = move left
def shift_right(reg, new_bit):
"""Slide all bits one position to the RIGHT; insert new_bit at left (index 0)."""
for i in range(len(reg) - 1, 0, -1):
reg[i] = reg[i - 1]
reg[0] = new_bit
return reg
def shift_left(reg, new_bit):
"""Slide all bits one position to the LEFT; insert new_bit at the right end."""
for i in range(0, len(reg) - 1):
reg[i] = reg[i + 1]
reg[len(reg) - 1] = new_bit
return reg
def write_register_to_leds():
"""Parallel-out: show the whole register on the LEDs at once."""
for i, led in enumerate(leds):
led.value(register[i])
# --- Main loop = software clock ---
while True:
# Show current register state on LEDs
write_register_to_leds()
# Small delay controls animation speed
time.sleep_ms(150)
# Decide which way to shift
if direction == 1:
shift_right(register, 0)
if register == [0, 0, 0, 1]:
direction = -1
else:
shift_left(register, 0)
if register == [1, 0, 0, 0]:
direction = 1