top of page

BOTONES INTEGRADOS EN MICRO:BIT, APRIÉTALOS

  • Joan A. Marí
  • 30 sept 2017
  • 4 Min. de lectura

Hasta ahora hemos creado código donde el dispositivo hace algo. Esto se llama “output”. Sin embargo necesitamos que el dispositivo reaccione a cosas. Esas cosas las llamamos “inputs”.


Es fácil de recordar: output es lo que el dispositivo puede decir al mundo y un input es lo que entra al dispositivo para el proceso.


El input más obvio en micro:bit son los dos botones llamados A y B. Sin embargo, necesitamos microPython para reaccionar a la pulsación de los botones.


Esto es realmente sencillo:


from microbit import*

sleep(10000)

display.scroll(str(button_a.get_presses()))


Lo que simplemente realiza este código es una espera de diez mil milisegundos (10 segundos) y después muestra el número de veces que se ha pulsado el botón A. Esto es todo.


Aunque es un script muy poco útil, introduce un par de buenas ideas:

  • La función hace que micro:bit esté a la espera un número concreto de milisegundos. Si quieres pausar un programa, esta es la manera. Una es simplemente como un , pero no está unido por un punto a un .

  • Existe un método llamado “” y permite saber cuántas veces se ha pulsado el botón A con el método “”.

Como “get_presses” devuelve un valor numérico y “display.scroll” solo muestra caracteres, necesitamos convertir el valor numérico en un carácter. Hacemos eso con la función “str” (abreviatura de string, convierte otros formatos en caracteres).


La tercera línea es un poco como una cebolla. Si los paréntesis son la piel de la cebolla, date cuenta de que “display.scroll” contiene “str” que al mismo tiempo contiene a “button_a.get_presses”. Python intenta resolver el problema interno, por lo tanto primero responde lo de dentro antes de pasar a la capa superior. Esto se llama nesting (anidación) – lo equivalente a programar una muñeca Matrioshka rusa.


Vamos a ver un ejemplo de la línea comentada en última instanacia


Si pulsamos 10 veces el botón A en el tiempo de espera programado. Python ve la línea entera de código y coge el valor de “get_presses” que en este caso es 10:


display.scroll(str(10))


Ahora Python sabe las veces que se ha pulsado el botón A y convierte el valor numérico a un string de caracteres:


display.scroll(“10”)


Finalmente, Python sabe lo que tiene que mostrar en el display.


Aunque parece mucha faena, MicroPython hace que esto suceda extremadamente rápido.



Eventos loop


Normalmente necesitamos que el programa esté esperando a que algo suceda. Para conseguir esto tenemos que ejecute un loop de código que define como reaccionar a ciertos eventos definidos como por ejemplo esperar a que un botón sea pulsado.


Para hacer loops en Python utilizamos while. Verifica si algo es True (Verdadero). Si lo es, ejecuta el código especificado en el código llamado “cuerpo del loop”. Si no lo es, salta el loop (ignorando el cuerpo del loop) y el resto del programa puede continuar.


Python hace que sea sencillo definir bloques de código. Es como si tuvieras una lista de cosas por hacer en un papel. Probablemente sería algo similar a lo siguiente:


Comprar

Reparar la canaleta

Cortar el césped


Si quisiera desglosar un poco más la lista tendría que escribir algo como lo siguiente


Comprar:

Huevos

Bacon

Tomates

Reparar la canaleta:

Pedir prestada una escalera al vecino

Encontrar martillo y clavos

Devolver escalera

Cortar el césped

Revisar el césped alrededor del camino

Revisar el nivel de gasolina del cortador de césped


Es obvio que las principales tareas se han definido en sub – tareas que han sido identadas debajo de la tarea principal a las cuales pertenecen. Entonces huevos, bacon y tomates están obviamente relacionadas a comprar. Con la identación hacemos más fácil la visualización de la relación entre las tareas.


Esto se llama anidación (nesting). Utilizamos la anidación para definir bloques de código como el siguiente (c3_while.py)


from microbit import*

while running_time() < 10000:

display.show(Image.ASLEEP)

display.show(Image.SURPRISED)


La función “running_time” devuelve el número de milisegundos que el dispositivo se encuentra en marcha.


La línea “running_time < 10000” chequea si el tiempo que se encuentra en marcha es menor a 10000 milisegundos (10 segundos). Si es cierto mostrará en el display “Image.ASLEEP”. Hay que fijarse en la identación del código que se encuentra debajo de “while”, tal y como hemos comentado anteriormente con la lista.


Obviamente si el tiempo de ejecución es igual o mayor a 10000 milisegundos, entonces el display mostrará “Image.SURPRISED”. ¿Porque? Porque la condición de “while” será falsa (“running_time” no es menor a 10000 milisegundos). En ese caso el loop ha finalizado y el programa continua después del bloque de código del “while”. Es como si el dispositivo estuviera durmiendo durante 10 segundos y después se despertara con una expresión de sorpresa.



Gestionando un evento.


Si queremos que MicroPython reaccione al evento de la pulsación de un botón tendremos que ponerlo en un bucle infinito y chequear si el botón ha sido pulsado “is_pressed”.


Un bucle infinito es sencillo, veamos el ejemplo


while True

# Haz cosas


Recuerda, “while” chequea si algo es “True” (verdadero) para saber si debe ejecutar su código. Como obviamente “True” será siempre verdadero, tenemos un loop infinito!


Vamos a hacer una simple ciber – mascota. Siempre estará triste a menos que se pulse el botón A. Si se pulsa el botón B morirá (Sé que no es un juego muy agradable, por lo tanto te reto a que lo mejores) (c4_mascota):


from microbit import*

while True:

if button_a.is_pressed():

display.show(Image.HAPPY)

elif button_b.is_pressed():

break

else:

display.show(Image.SAD)

display.clear()


¿Puedes ver como se ha comprobado que botón se ha pulsado? Utilizamos “if”, “elif” (abreviatura de else if) y “else”. Son llamados condicionales y funcionan como lo siguiente:


if algo es verdadero:

# Haz lo siguiente

elif otra cosa es verdadera:

# Haz esto otro siguiente

else:

# Haz otra cosa diferente


El “else” se suele utilizar muchas veces como seguridad y/o control, ya que su significado sería que se realice su código si ninguno de los anteriores se ha cumplido.


El método “is.pressed” sólo tiene dos resultados, si estás pulsando el botón será “True” y si no lo estás pulsando será “false”.


El código del ejemplo “3.3_mascota” nos está diciendo que mientras que el botón A esté pulsado mostraremos una cara contenta. Si pulsamos el botón B se interrumpirá el loop. Si ninguna de las dos cosas pasa se mostrará una cara triste. Con el código “break” rompemos el bucle (paramos el programa).


Cuando el proceso ha finalizado con el comando y la ciber – mascota está muerta, limpiamos el display.


¿Se te ocurren más maneras de hacer este juego menos trágico? ¿Cómo podrías comprobar que ambos botones están pulsados? (Truco: Python tiene los operadores lógicos “and”, “or” y “not” para comprobar múltiples estados (también devuelven resultado “True” y “False”)


En los siguientes enlaces se pueden descargar los archivos en micropython de los ejemplos:

https://drive.google.com/file/d/1n0SEJW3Bqf5jD8sX7ZcUnBtLPDP0JJ4C/view?usp=sharing

https://drive.google.com/file/d/1gQfC0-Du9ldJW81Zh_ZNE3Na9N_5j33k/view?usp=sharing

https://drive.google.com/file/d/14oILqRNyqh02zMU23qEMbLT0vSKnkLnD/view?usp=sharing


Fuente: https://microbit-micropython.readthedocs.io/en/latest/tutorials/buttons.html

 
 
 

Comments


© 2016 by Joan A. Marí

  • LinkedIn Social Icon
  • FRAUDE
bottom of page