Loopbit
Código para la Micro:bit Controladora (myID = 1)
pythonimport 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)
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
pythonimport 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)
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.
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.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
.jpg)
.jpg)