import time
import board
import digitalio
import pulseio
import adafruit_irremote
IR_PIN = board.GP6
LED_PINS = [board.GP2, board.GP3, board.GP4, board.GP5]
ACTIVE_LOW = True
# IR setup
ir_pulsein = pulseio.PulseIn(IR_PIN, maxlen=200, idle_state=True)
decoder = adafruit_irremote.GenericDecode()
# LED setup
leds = []
for p in LED_PINS:
d = digitalio.DigitalInOut(p)
d.direction = digitalio.Direction.OUTPUT
d.value = True if ACTIVE_LOW else False
leds.append(d)
def write_led(i, on):
leds[i].value = not on if ACTIVE_LOW else on
def read_led(i):
return not leds[i].value if ACTIVE_LOW else leds[i].value
def toggle_led(i):
write_led(i, not read_led(i))
def set_all(on):
for i in range(len(leds)):
write_led(i, on)
def any_off():
return any(not read_led(i) for i in range(len(leds)))
# Learn phase (runs at startup)
def learn_codes():
learned = {}
print("=== IR Setup: Press buttons 1–5 on the remote ===")
for label in ["1", "2", "3", "4", "5"]:
while True:
try:
pulses = decoder.read_pulses(ir_pulsein, blocking=True)
code = decoder.decode_bits(pulses)
print(f"Learned {label}: {code}")
learned[label] = tuple(code)
time.sleep(0.5)
break
except (adafruit_irremote.IRDecodeException, adafruit_irremote.IRNECRepeatException):
pass
print("Learning complete.")
return learned
# Main loop
def main():
mapping = learn_codes()
debounce = 0.25
last_cmd_time = 0.0
print("Mode: 1–4 toggle each LED, 5 toggles all.")
while True:
now = time.monotonic()
try:
pulses = decoder.read_pulses(ir_pulsein, blocking=False)
if pulses is None:
time.sleep(0.01)
continue
try:
code = tuple(decoder.decode_bits(pulses))
if now - last_cmd_time < debounce:
continue
last_cmd_time = now
key = None
for k, v in mapping.items():
if code == v:
key = k
break
if not key:
continue
if key in ["1", "2", "3", "4"]:
toggle_led(int(key) - 1)
elif key == "5":
set_all(True if any_off() else False)
except (adafruit_irremote.IRNECRepeatException, adafruit_irremote.IRDecodeException):
pass
except Exception as e:
print("IR error:", e)
time.sleep(0.05)
main()