import machine
import time
from neopixel import Neopixel
# --- Configurações Iniciais ---
NUM_LEDS = 4
pixels = Neopixel(NUM_LEDS, 0, 6, "GRB")
COLOR_ON = (255, 0, 0)
COLOR_OFF = (0, 0, 0)
# --- Pinos da Matriz ---
col_pins_nums = [16, 17] # Coluna Esquerda: 16, Coluna Direita: 17
row_pins_nums = [18, 19] # Linha Superior: 18, Linha Inferior: 19
# --- MAPEAMENTO CORRETO ---
# O código escaneia na ordem: superior-esq, superior-dir, inferior-esq, inferior-dir.
# Este mapa traduz a ordem do escaneamento para a sua numeração de botões.
# Ordem do Scan (Índice): 0, 1, 2, 3
# Seu Botão Correspondente: 3, 1, 2, 0
KEY_MAP = [3, 1, 2, 0]
def scan_matrix_final_attempt():
"""
Escaneia a matriz usando a técnica de isolamento de pinos mais forte.
Retorna um conjunto com os NÚMEROS REAIS dos botões pressionados (0, 1, 2 ou 3).
"""
pressed_keys = set()
num_cols = len(col_pins_nums)
# Itera sobre cada coluna para testá-la isoladamente
for c_idx, c_pin_num in enumerate(col_pins_nums):
# Isola o estado anterior. Configura a coluna ATIVA como SAÍDA.
col_pin_active = machine.Pin(c_pin_num, machine.Pin.OUT)
# Configura as linhas como ENTRADA com pull-down para ler o sinal.
row_pins = [machine.Pin(p, machine.Pin.IN, machine.Pin.PULL_DOWN) for p in row_pins_nums]
# Envia o sinal para a coluna ativa
col_pin_active.value(1)
time.sleep_us(50) # Delay para estabilização
# Lê as linhas para ver qual botão na coluna ativa foi pressionado
for r_idx, row_pin in enumerate(row_pins):
if row_pin.value():
scan_index = r_idx * num_cols + c_idx
actual_key = KEY_MAP[scan_index] # Traduz o índice para seu número de botão
pressed_keys.add(actual_key)
# CRUCIAL: "Desliga" completamente a coluna, reconfigurando-a como entrada.
# Isso quebra o caminho fantasma antes de testar a próxima coluna.
col_pin_active.init(mode=machine.Pin.IN)
return pressed_keys
def update_leds(pressed_buttons):
"""Acende os LEDs correspondentes aos botões pressionados."""
for i in range(NUM_LEDS):
if i in pressed_buttons:
pixels.set_pixel(i, COLOR_ON)
else:
pixels.set_pixel(i, COLOR_OFF)
pixels.show()
# --- Loop Principal ---
last_pressed_buttons = set()
print("Iniciando varredura com mapeamento corrigido e lógica final.")
while True:
current_pressed_buttons = scan_matrix_final_attempt()
if current_pressed_buttons != last_pressed_buttons:
update_leds(current_pressed_buttons)
last_pressed_buttons = current_pressed_buttons
if current_pressed_buttons:
print("Botões pressionados:", sorted(list(current_pressed_buttons)))
time.sleep(0.05)