#Imports para la correcta funcionalidad de la microbit
from microbit import *
import radio
import music
#Lineas de Configuración
#Los ID son asignados manualmente
ID=1
miembros=3
radio.on()
radio.config(channel=7)
set_volume(75)
LUZ_MINIMA_PARA_USAR=25
#Array dedicado a la traducción del abecedario a morse
morse_code = {
'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.',
'f': '..-.', 'g': '--.', 'h': '....', 'i': '..', 'j': '.---',
'k': '-.-', 'l': '.-..', 'm': '--', 'n': '-.', 'o': '---',
'p': '.--.', 'q': '--.-', 'r': '.-.', 's': '...', 't': '-',
'u': '..-', 'v': '...-', 'w': '.--', 'x': '-..-', 'y': '-.--',
'z': '--..'}
#Variable para el signo de interrogante a mostrar en pantalla
interrogante="E o R?"
#Esto se muestra, ya que el botón A *izquierda* selecciona el modo Emisor y
#el botón B *derecha*, selecciona el modo Receptor
interroganteDestino="B o U?"
#Esto se muestra, ya que el botón A *izquierda* selecciona el destino Broadcast y
#el botón B *derecha*, selecciona el destino Unicast
def modoEmisor():
#Variable reservada a guardar el abecedario
abecedario = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z']
contador=0
message=""
while (display.read_light_level()>LUZ_MINIMA_PARA_USAR):
sleep(250)
#Caso 1: cambios de posición en base al accionar de los botones
if button_a.is_pressed():
contador -= 1
if button_b.is_pressed():
contador += 1
#Caso 2: se encuentra el display en a y se presiona el botón
#izquierdo.
if contador == -1:
contador = len(abecedario) -1
#Caso 3: se encuentra el display en z y se presiona el botón
#derecho.
if contador >= len(abecedario):
contador = 0
#Caso 4: actualización del mensaje, añadiendo letra por letra.
if accelerometer.was_gesture('shake'):
message += str(abecedario[contador])
display.show(Image.YES)
sleep(400)
#Caso 5: actualización del mensaje, añadiendo espacios
if accelerometer.was_gesture('left'):
message += "/"
display.show("/")
sleep(400)
#Caso 6: el mensaje es enviado por radio.
if button_a.is_pressed() and button_b.is_pressed():
destino = asignarDestino()
messageFinal = message+ ", " + str(destino)
print(messageFinal)
radio.send(messageFinal)
display.show(Image.HAPPY)
#Reset de variables, para evitar mandar mensajes iguales,
#dos veces seguidas, sin intención
message=""
messageFinal=""
destino=None
contador=0
sleep(400)
#Muestra de la letra en pantalla en base al contador.
display.show(str(abecedario[contador]))
print(message)
sleep(250)
def asignarDestino():
sleep(500)
destino = None
while destino is None:
display.scroll(interroganteDestino)
sleep(500)
if button_a.is_pressed():
display.show('B')
destino = 0
if button_b.is_pressed():
display.show('U')
sleep(500)
display.scroll("OP: ", delay=75)
sleep(200)
listaPosiblesDestinatarios = list((range(1,(miembros+1))))
listaPosiblesDestinatarios.remove(ID)
display.show(str(listaPosiblesDestinatarios))
contador=0
while display.read_light_level()>LUZ_MINIMA_PARA_USAR:
display.show(listaPosiblesDestinatarios[contador])
print(contador)
sleep(250)
if button_a.is_pressed():
contador-=1
if button_b.is_pressed():
contador+=1
if contador < 0:
contador = 0
if contador >= len(listaPosiblesDestinatarios):
contador = 0
destino=listaPosiblesDestinatarios[contador]
print("destino: " + str(destino))
return destino
def modoReceptor():
while (display.read_light_level()>LUZ_MINIMA_PARA_USAR):
message = radio.receive() # Espera un mensaje de radio
# Formato del mensaje = ("MENSAJE",ID)
# Mensaje = primera parte del mensaje (dividio por la coma) ->
# condición. (si el id recibido = al id propio, entonces
# play_letter(mensaje))
if message is not None:
message.lower() #Transforma el mensaje en minuscula
idDestino = message.split(", ",2)[1]
messageDestino = message.split(", ",2)[0]
if int(idDestino) == ID or int(idDestino) == 0:
for letter in messageDestino:
play_letter(letter) # Reproduce el código Morse
sleep(1000) # Pausa entre letras
else:
display.show('L')
# Muestra un mensaje de "Listening" cuando no se recibe nada
sleep(500) # Espera un corto período para reducir el parpadeo
display.show(ID)
sleep(500)
# Función para emitir sonido según código Morse
def play_morse(symbol):
if symbol == '.':
music.pitch(440, 100) # Punto: Sonido corto
elif symbol == '-':
music.pitch(440, 300) # Raya: Sonido largo
sleep(200) # Pausa entre símbolos
# Función para reproducir el código Morse de una letra
def play_letter(letter):
display.show(letter) # Muestra la letra en el display
if letter in morse_code:
code = morse_code[letter]
for symbol in code:
play_morse(symbol)
sleep(600) # Pausa entre letras
while True:
sleep(200)
display.scroll(interrogante)
if button_a.is_pressed():
modoEmisor()
if button_b.is_pressed():
modoReceptor()