Loopbit

Código para la Micro:bit Controladora (myID = 1)

python
import radio from microbit import * # ======================================================= # Configuración Inicial y Constantes # ======================================================= # Configuramos el radio en el grupo 1 radio.config(group=1) radio.on() # Esta micro:bit es la controladora y también forma parte de la pantalla gigante myID = 1 # Ubicada en la posición (0,0) matrixX = (myID - 1) % 5 # Resultado: 0 matrixY = (myID - 1) // 5 # Resultado: 0 # Array de iconos disponibles (usando imágenes predefinidas) icons = [Image.HEART, Image.HAPPY, Image.SQUARE] currentIcon = 0 # ======================================================= # Funciones Modulares # ======================================================= def sendIcon(icon): """ Envía el icono a la red para formar la imagen en la pantalla gigante. Primero limpia la pantalla, luego recorre cada pixel del icono y envía un comando 'ledOn' al dispositivo correspondiente. """ # Limpia la pantalla en todas las micro:bits radio.send("ledClear:0") sleep(100) # Pausa breve para asegurar la limpieza # Recorremos la imagen de 5x5 pixeles for y in range(5): for x in range(5): if icon.get_pixel(x, y) > 0: # Calcula el ID destino según la posición (de 1 a 25) targetID = x + y * 5 + 1 radio.send("ledOn:" + str(targetID)) sleep(50) # Pausa para evitar colisiones en la red def displayWave(direction): """ Ejecuta el efecto de ola en esta micro:bit (controladora), iluminando su columna. El retardo se ajusta según la posición para sincronizar el efecto en la pantalla. :param direction: -1 para ola hacia la izquierda, 1 para ola hacia la derecha. """ if direction == -1: sleep(matrixX * 200) elif direction == 1: sleep((4 - matrixX) * 200) for y in range(5): display.set_pixel(matrixX, y, 9) sleep(50) display.clear() def processRadioMessage(msg): """ Procesa los mensajes recibidos por radio. Los mensajes deben tener el formato 'comando:valor', por ejemplo: 'ledOn:3'. """ try: parts = msg.split(":") if len(parts) != 2: return # Formato incorrecto command = parts[0] value = int(parts[1]) except: return # Error al procesar el mensaje if command == "ledOn": if value == myID: display.set_pixel(matrixX, matrixY, 9) elif command == "ledClear": display.clear() elif command == "wave": displayWave(value) # ======================================================= # Bucle Principal: Eventos y Procesamiento # ======================================================= while True: # Procesa mensajes de radio (para encender LED en la posición correspondiente) msg = radio.receive() if msg: processRadioMessage(msg) # Botón B: Cambiar icono y enviarlo a la pantalla gigante if button_b.was_pressed(): currentIcon = (currentIcon + 1) % len(icons) sendIcon(icons[currentIcon]) # Botón A: Mostrar el identificador único (para verificar la posición) if button_a.was_pressed(): display.show(str(myID)) sleep(1000) display.clear() # Gestos para activar el efecto de ola if accelerometer.was_gesture("left"): radio.send("wave:-1") elif accelerometer.was_gesture("right"): radio.send("wave:1") sleep(100)

Código para las Micro:bits Receptoras

python
import radio from microbit import * # ======================================================= # Configuración Inicial y Constantes # ======================================================= # Configuramos el radio en el grupo 1 radio.config(group=1) radio.on() # Cada receptor debe tener un identificador único (modificá este número en cada micro:bit) myID = 2 # Ejemplo: en otra micro:bit, asigná 2, 3, 4, etc. matrixX = (myID - 1) % 5 # Calcula la columna en la matriz (0 a 4) matrixY = (myID - 1) // 5 # Calcula la fila en la matriz (0 a 4) # ======================================================= # Funciones Modulares # ======================================================= def displayWave(direction): """ Ejecuta el efecto de ola en esta micro:bit, iluminando su columna. El retardo se ajusta según la posición para sincronizar el efecto. :param direction: -1 para ola hacia la izquierda, 1 para ola hacia la derecha. """ if direction == -1: sleep(matrixX * 200) elif direction == 1: sleep((4 - matrixX) * 200) for y in range(5): display.set_pixel(matrixX, y, 9) sleep(50) display.clear() def processRadioMessage(msg): """ Procesa el mensaje recibido por radio, con formato 'comando:valor'. """ try: parts = msg.split(":") if len(parts) != 2: return # Mensaje con formato incorrecto command = parts[0] value = int(parts[1]) except: return # Error en el procesamiento del mensaje if command == "ledOn": # Si el mensaje es para este micro:bit, enciende el LED correspondiente if value == myID: display.set_pixel(matrixX, matrixY, 9) elif command == "ledClear": display.clear() elif command == "wave": displayWave(value) # ======================================================= # Bucle Principal: Procesamiento de Mensajes # ======================================================= while True: # Recibe y procesa mensajes enviados por la controladora msg = radio.receive() if msg: processRadioMessage(msg) # Botón A: Muestra el identificador único (para confirmar la posición) if button_a.was_pressed(): display.show(str(myID)) sleep(1000) display.clear() sleep(100)

Consideraciones Finales

  • Controladora:
    La micro:bit controladora (myID = 1) envía comandos para cambiar iconos y activar efectos de ola, y también recibe sus propios mensajes para formar parte de la pantalla (posición 0:0).

  • Receptoras:
    Cada micro:bit receptora debe tener un myID único y solo se encarga de recibir y procesar los comandos enviados por la controladora, encendiendo el LED correspondiente en la matriz.

Entradas populares