Loopbit

Síntesis ServicioTI: Loopbit: Controladora: La micro:bit controladora (myID = 1) envía comandos para cambiar iconos y activar efectos de ola, y también recibe sus propios...

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.

❓ Preguntas Frecuentes (FAQ)

¿Qué conceptos técnicos aborda el recurso 'Loopbit'?

Este material desarrollado por Andrés Franchi en ServicioTI aborda Pensamiento Computacional, Algoritmos y Programación en Python, orientado a la aplicación práctica mediante ejercicios, código funcional y resolución de problemas paso a paso.

¿Para qué nivel educativo o perfil técnico está recomendado?

Está diseñado tanto para estudiantes y docentes de Educación Básica Integrada (EBI) y Educación Media Superior (EMS - ANEP Uruguay) en Ciencias de la Computación, como para autodidactas y entusiastas de Programación, Educación Tecnológica, Informática Uruguay, ServicioTI.

¿Qué herramientas o software se necesitan para ponerlo en práctica?

Para aprovechar al máximo esta guía se recomienda utilizar Python 3, estructuras de control (if/else, for, while), listas, funciones y algoritmos, pudiendo ejecutarse directamente desde el navegador o descargando los recursos adjuntos en este artículo.

Entradas populares de este blog

P7H 7H P7A P759 Horarios Pando-Suarez Días Hábiles Invierno 2026 Actualizado Copsa

701 703 704 724 706 Horarios Días Hábiles Invierno 2026 Actualizado Copsa

Horarios 700, 710 y 711 Verano 2026 COPSA (Interbalnearia) Días Hábiles - Sábados y Domingos