# Jugando fuerte con Python

# Ventajas y desventajas Python

{{@12287}}

# Editores

{{@12291}}

# Introducción al Python

{{@12327}}

# Micropython de microbit

{{@12433}}

# Solo placa: Hola Mundo

{{@12288}}

# Solo placa: Imágenes

{{@12289}}

# Solo placa: Imágenes estáticas y animadas

{{@12441}}

# Solo placa: Eventos para los botones

{{@12443}}

# Solo placa: Botones

{{@12292}}

# Solo sensores de la placa

Podríamos continuar, pero **solo con la placa** podemos hacer muchos más programas con Python

#### [Nivel de luz](https://prelibros.catedu.es/books/microbit-y-python/page/nivel-de-luz)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA Vamos a ver como utilizar ...

#### [Temperatura](https://prelibros.catedu.es/books/microbit-y-python/page/temperatura)

La función en micropython para leer la temperatura de la placa en ºC interna y devuelve un valor ...

#### [Magnetómetro](https://prelibros.catedu.es/books/microbit-y-python/page/magnetometro)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA Este módulo permite accede...

#### [Acelerómetro](https://prelibros.catedu.es/books/microbit-y-python/page/acelerometro)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA Este objeto permite accede...

#### [Micrófono](https://prelibros.catedu.es/books/microbit-y-python/page/microfono)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA ATENCIÓN SÓLO VÁLIDO PARA ...

#### [Radio](https://prelibros.catedu.es/books/microbit-y-python/page/radio)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA El módulo de radio permite...

#### [Pines de Entrada/salida](https://prelibros.catedu.es/books/microbit-y-python/page/pines-de-entradasalida)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA En MicroPython, cada pin e...

#### [Input output](https://prelibros.catedu.es/books/microbit-y-python/page/input-output)

Una manera rápida de probar las entradas y salidas de microbit es utilizar el código predefinido ...

#### [Música predefinida o crea tu música](https://prelibros.catedu.es/books/microbit-y-python/page/musica-predefinida-o-crea-tu-musica)

SALIDAS DE AUDIO La placa Microbit v2 tiene un altavoz incorporado que se puede anular o activar...

#### [Musica](https://prelibros.catedu.es/books/microbit-y-python/page/musica)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA MicroPython de BBC micro:b...

#### [Putty](https://prelibros.catedu.es/books/microbit-y-python/page/putty)

Putty es un programa que nos permite realizar comunicaciones, normalmente se usa en protocolo SSH...

#### [UART](https://prelibros.catedu.es/books/microbit-y-python/page/uart)

Página extraída de Federico Coca Guia de Trabajo de Microbit  https://fgcoca.github.io/Guia-de-tr...

#### [Registro de datos](https://prelibros.catedu.es/books/microbit-y-python/page/registro-de-datos)

Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA Grabar datos Para utiliza...

# Solo placa: Música

Tan fácil como elegir la música y arrastrar el código:

[![2026-01-08 22&#95;32&#95;49-Greenshot.png](https://prelibros.catedu.es/uploads/images/gallery/2026-01/scaled-1680-/2026-01-08-22-32-49-greenshot.png)](https://prelibros.catedu.es/uploads/images/gallery/2026-01/2026-01-08-22-32-49-greenshot.png)

Si te sabe a poco aquí tienes más

- [Música predefinida o crear tu música](https://prelibros.catedu.es/books/microbit-y-python/page/musica-predefinida-o-crea-tu-musica)
- [Más música](https://prelibros.catedu.es/books/microbit-y-python/page/musica)

# Maqueta: Intermitente led amarillo

Nos vamos a [https://python.microbit.org/](https://python.microbit.org/) y ponemos este código:

```python
from microbit import *
display.show(Image.HOUSE)
pin16.write_digital(0)
while True:
    pin16.write_digital(1)
    sleep(1000)
    pin16.write_digital(0)
    sleep(1000)
```

[![2025-11-06 14&#95;56&#95;27-Mattermost Desktop App.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-56-27-mattermost-desktop-app.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-56-27-mattermost-desktop-app.png)

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="874" src="https://www.youtube.com/embed/fjCu82BzQE4" title="4 de noviembre de 2025" width="492"></iframe>

# Maqueta: LED amarillo intermitente gradual

Vamos a hace lo mismo pero que el brillo vaya del mínimo 0 al máximo 255 y viceversa, aprovechando las señales PWM

```
from microbit import *
display.show(Image.HOUSE)
pin16.write_digital(0)
brillo=0
while True:
    for brillo in range (0, 255):
        pin16.write_analog(brillo)
        sleep(5)
    while brillo >0 :
        pin16.write_analog(brillo)
        brillo = brillo -1
        sleep(5)
```

  
<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="715" src="https://www.youtube.com/embed/YvICMfKfx9Y" title="5 de noviembre de 2025" width="402"></iframe>

##### <span style="color: rgb(22, 145, 121);">**¿Qué es eso de señal PWM?**</span>

{{@2946}}

# Maqueta: Neopixel RGB

Vamos a hacer una discoteca !!!

```
from microbit import *
import neopixel
NEOPIXEL = neopixel.NeoPixel(pin14, 4)
from random import randint

while True:
   for index in range(0, 4):
        NEOPIXEL.clear()
        NEOPIXEL[index] = (randint(10, 255), randint(10, 255), randint(10, 255))
        NEOPIXEL.show()
        sleep(100)
```

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="715" src="https://www.youtube.com/embed/rJDlR56GRLI" title="disco neopixel rgb" width="402"></iframe>

# Maqueta : Sensor PIR

Vamos a visualizar la lectura del sensor PIR por el puerto serie:

```
from microbit import *
DETECTO = 0
display.show(Image.SILLY)
while True:
    DETECTO = pin15.read_digital()
    print("digital signals:", DETECTO)
    sleep(100)
```

El resultado :

[![2025-11-06 14&#95;58&#95;25-Mattermost Desktop App.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-58-25-mattermost-desktop-app.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-58-25-mattermost-desktop-app.png)

# Servos

Hay varias opciones para manejar servos con micro:bit y python

##### <span style="color: rgb(22, 145, 121);">**Opción A: Lo más sencillo enviar un pulso adecuado**</span>

Los servos funcionan según la anchura del pulso que se envía, siendo los pulsos de 20mseg. Se explica mejor con una imagen :

[![arduino-servo-funcionamiento.webp](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/arduino-servo-funcionamiento.webp)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/arduino-servo-funcionamiento.webp)  
Autor Luis Llamas CC-BY-SA [https://www.luisllamas.es/controlar-un-servo-con-arduino/](https://www.luisllamas.es/controlar-un-servo-con-arduino/)

1. Por lo tanto podríamos establecer primero pulsos de 20 mseg con la instrucción adecuada (por ejemplo en la pueta pin 8 sería **pin8.set\_analog\_period(20)** )
2. Enviar pulsos de forma adecuada. Ejemplo en puerta pin 8 
    1. si queremos 0º enviamos pulsos de 1mseg que equivale a **pin8.write\_analog(50)**
    2. si queremos 90º enviamos pulsos de 1.5mseg que equivale a **pin8.write\_analog(75)**
    3. si queremos 180º enviamos pulsos de 2mseg que equivale a **pin8.write\_analog(100)**

<p class="callout warning">Los valores no responden a una regla de tres (en teoría 20mseg serían 255 en formato PWM) sino a **la experiencia-ensayo-prueba-error**. Hemos probado que para la puerta los valores 50-75-100 son correctos. Para la ventana que se ve bien la apertura y cierre los valores son 30-60-100</p>

Mas info en [https://support.microbit.org/support/solutions/articles/19000101864-using-a-servo-with-the-micro-bit](https://support.microbit.org/support/solutions/articles/19000101864-using-a-servo-with-the-micro-bit)

##### <span style="color: rgb(22, 145, 121);">**Opción B Cargar una librería servo.py**</span>

1. Nos vamos a [https://github.com/microbit-playground/microbit-servo-class](https://github.com/microbit-playground/microbit-servo-class) y descargamos servo.py
2. Lo grabamos en la carpeta /mu\_code/ donde se ha instalado el editor Mu
3. Utilizamos el código usando esta librería y poniendo los grados como grados

Por ejemplo para la puerta pin 8

```
sv1 = Servo(pin8)
sv1.write_angle(50) # turn servo to 50 degrees 
```

<p class="callout info"><span style="color: rgb(0, 0, 0);">Si quieres saber cómo se instala una librería, consulta la página LCD que ahí se ha instalado una librería [https://prelibros.catedu.es/books/smart-home-para-microbit/page/maqueta-lcd](https://prelibros.catedu.es/books/smart-home-para-microbit/page/maqueta-lcd)</span></p>

##### <span style="color: rgb(22, 145, 121);">**Opción C Crea tu una librería en tu programa**</span>

Esta opción esta extraída del tutorial del fabricante [https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-6-servo](https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-6-servo)

No explicamos el código pues se extiende de los objetivos del curso

```
from microbit import *

class Servo:
    def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
        self.min_us = min_us
        self.max_us = max_us
        self.us = 0
        self.freq = freq
        self.angle = angle
        self.analog_period = 0
        self.pin = pin
        analog_period = round((1/self.freq) * 1000)  # hertz to miliseconds
        self.pin.set_analog_period(analog_period)

    def write_us(self, us):
        us = min(self.max_us, max(self.min_us, us))
        duty = round(us * 1024 * self.freq // 1000000)
        self.pin.write_analog(duty)
        sleep(100)
        self.pin.write_analog(0)

    def write_angle(self, degrees=None):
        if degrees is None:
            degrees = math.degrees(radians)
        degrees = degrees % 360
        total_range = self.max_us - self.min_us
        us = self.min_us + total_range * degrees // self.angle
        self.write_us(us)

Servo(pin8).write_angle(0)
display.show(Image.HAPPY)

while True:
        Servo(pin8).write_angle(0)
        sleep(1000)
        Servo(pin8).write_angle(45)
        sleep(1000)
        Servo(pin8).write_angle(90)
        sleep(1000)
        Servo(pin8).write_angle(135)
        sleep(1000)
        Servo(pin8).write_angle(180)
        sleep(1000)
```

# Maqueta puerta

Utilizaremos la versión sencilla de manejo de los servos :

```
from microbit import * 
 
pin8.set_analog_period(20) # pulsos de 20 milisegundos cada uno

while True: 
  
  pin8.write_analog(50)  #equivale a 1mseg de pulso a la derecha
  sleep(1000)
  pin8.write_analog(75) #equivale a a 1.5mseg
  sleep(1000)
  pin8.write_analog(100) #equivale a 2mseg de pulso todo a la izquierda
  sleep(1000)
```

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="715" src="https://www.youtube.com/embed/rYYWD_RAx7o" title="servo en python con microbit" width="402"></iframe>

# Maqueta: Ventana

Para la ventana hemos usado el mismo código pero jugando, hemos visto que la ventana cierra mejor a valores más bajos

- **pin9.write\_analog(30)** todo abierto
- **pin9.write\_analog(60)**  media ventana
- **pin9.write\_analog(100)**  ventana cerrada

el código

```
from microbit import * 
 
pin9.set_analog_period(20) # pulsos de 20 milisegundos cada uno

while True: 
  
  pin9.write_analog(30)  #equivale a 1mseg de pulso a la derecha
  sleep(1000)
  pin9.write_analog(60) #equivale a a 1.5mseg
  sleep(1000)
  pin9.write_analog(100) #equivale a 2mseg de pulso todo a la izquierda
  sleep(1000)
```

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="715" src="https://www.youtube.com/embed/WHRpQ1IjrBo" title="servo python smart home micro:bit ventana" width="402"></iframe>

# Maqueta: Motor

El motor tiene un sencillo funcionamiento:

<table border="1" id="bkmrk-pin12-pin13-motor-0-"><colgroup><col></col><col></col><col></col></colgroup><thead><tr><td>PIN12</td><td>PIN13</td><td>MOTOR</td></tr></thead><tbody><tr><td>0</td><td>0</td><td>PARADO</td></tr><tr><td>0</td><td>1</td><td>ROTACIÓN SENTIDO RELOJ</td></tr><tr><td>1</td><td>0</td><td>ROTACIÓN SENTIDO ANTIRELOJ</td></tr><tr><td>1</td><td>1</td><td>PARADO</td></tr></tbody></table>

Pero con Pytho no sólo podemos poner los pines 12 y 13 a 0 o 1 sino también podemos poner su potencia

Valora qué pasa en cada una de las 4 situaciones siguiente

```python
from microbit import *

pin12.write_digital(0)
pin13.write_digital(0)

while True:
    # 1 Que pasa 1 ##########♥1
    display.scroll('1')
    pin12.write_digital(1)
    pin13.write_analog(50)
    sleep(5000)
    # Paramos 
    pin12.write_digital(0)
    pin13.write_analog(0)
    sleep(1000)
    # 2 Que pasa 2  ##########♥2
    display.scroll('2')
    pin12.write_digital(1)
    pin13.write_analog(255)
    sleep(5000)
    # Paramos 
    pin12.write_digital(0)
    pin13.write_analog(0)
    sleep(1000)
    # 3 Que pasa 3  ##########♥3
    display.scroll('3')
    pin12.write_digital(1)
    pin13.write_digital(0)
    sleep(5000)
    # Paramos 
    pin12.write_digital(0)
    pin13.write_analog(0)
    sleep(1000)
    # 4 Que pasa 4  ##########♥4
    display.scroll('4')
    pin12.write_digital(1)
    pin13.write_digital(1)
    sleep(5000)
    # Paramos 
    pin12.write_digital(0)
    pin13.write_analog(0)
    sleep(1000)
    # 5 Que pasa 5  ##########♥5
    display.scroll('5')
    pin12.write_digital(0)
    pin13.write_digital(1)
    sleep(5000)
    # Paramos 
    pin12.write_digital(0)
    pin13.write_analog(0)
    sleep(1000)
```

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="874" src="https://www.youtube.com/embed/LpngWgMuGgk" title="MOTOR PYTHON MICROBIT SMART HOME" width="492"></iframe>

# Maqueta: LCD

El display LCD no es nativo, y no hay una solución simple como en los servos (ver [https://prelibros.catedu.es/books/smart-home-para-microbit/page/servos](https://prelibros.catedu.es/books/smart-home-para-microbit/page/servos)) luego tenemos que incorporar **UNA LIBRERIA EXTERNA** para LCS 16x2 (16 columnas 2 filas)

##### <span style="color: rgb(22, 145, 121);">**La librería mb\_i2c\_lcd1602.py**</span>

La puedes descargar aquí [https://github.com/Pratt-Institute/MicroPython4MicroBit/blob/master/mb\_i2c\_lcd1602.py](https://github.com/Pratt-Institute/MicroPython4MicroBit/blob/master/mb_i2c_lcd1602.py)

[![2025-11-06 14&#95;04&#95;54-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-04-54-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-04-54-configuracion.png)

Vamos a utilizar el editor Python online [https://python.microbit.org/](https://python.microbit.org/)

Abrimos un nuevo proyecto y le damos a **Open**

[![2025-11-06 14&#95;07&#95;22-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-07-22-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-07-22-configuracion.png)

Abrimos el fichero **mb\_i2c\_lcd1602.py** que hemos descargado anteriormente

<p class="callout danger">nos pide si queremos reemplazar el contenido de main.py **LE DECIMOS QUE NO**, que añada un nuevo fichero mb\_i2c\_lcd1602.py **OJO QUE HAY QUE DAR AL ICONO PEQUEÑO** que pone en esa imagen</p>

**[![2025-11-06 14&#95;08&#95;31-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-08-31-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-08-31-configuracion.png)**

##### <span style="color: rgb(22, 145, 121);">**Nuestro programa**</span>

**Confirmamos**, vamos al **main.py** y pegamos este código

```
from mb_i2c_lcd1602 import *

l = LCD1620()
l.puts("Hola microbit!")
```

Y **send to micro:bit**

[![2025-11-06 14&#95;15&#95;04-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-15-04-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-15-04-configuracion.png)

**Resultado**

[![2025-11-06 14&#95;16&#95;34-WhatsApp.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-16-34-whatsapp.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-16-34-whatsapp.png)

# Maqueta Sensor lluvia

No necesitamos ninguna librería especial. Simplemente leer los valores analógicos del Pin 0. En este caso lo visualizamos por el puerto serie :

```
from microbit import *
while True:
    val = pin0.read_analog()
    print("Humedad=", val)
    sleep(100)
```

Para leer el puerto serie en [https://python.microbit.org/](https://python.microbit.org/) lo tienes aquí :

[![2025-11-06 14&#95;24&#95;00-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-06-14-24-00-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-06-14-24-00-configuracion.png)

##### <span style="color: rgb(22, 145, 121);">**ALARMA LLUVIA**</span>

El proyecto pide una alarma. El siguiente código es extraído de [https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-11-rains-alarm](https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-11-rains-alarm)

```
from microbit import *
import music
display.show(Image.HAPPY)

pin16.write_digital(0)

while True:
    if pin0.read_analog() > 500:
        music.play("C5:4")
        pin16.write_digital(1)
        sleep(100)
        music.reset()
        pin16.write_digital(0)
        sleep(100)
        music.play("C5:4")
        pin16.write_digital(1)
        sleep(100)
        music.reset()
        pin16.write_digital(0)
        sleep(100)
    else:
        music.reset()
        pin16.write_digital(0)
```

Una vez mojado el sensor, si se seca y queda por debajo de 500 se apaga la alarma:

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="874" src="https://www.youtube.com/embed/SuW51rT8lRI" title="ALARMA LLUVIA MICROBIT PYTHON" width="492"></iframe>

# Maqueta: Sensor Gas

Vamos a realizar un detector de gas

```
from microbit import *
import music

pin16.write_digital(0)

while True:

    if pin1.read_digital() == 0:
        music.play("C4:4")
        pin16.write_digital(1)
        sleep(100)
        music.reset()
        pin16.write_digital(0)
        sleep(100)
    else:
        music.reset()
        pin16.write_digital(0)
```

En este caso acercamos una botella de Alcohol

<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" frameborder="0" height="874" src="https://www.youtube.com/embed/jBXuNFGVf2Q" title="DETECTOR ALCOHOL MICROBIT PYTHON SMART HOME" width="492"></iframe>

<p class="callout success">RETO visualiza la lectura del sensor gas por el pueto serie:  
Solución [https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-12-analog-gas-mq-2-sensor](https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#project-12-analog-gas-mq-2-sensor)</p>

# Maqueta DHT11

Se ha intentado el código de [fgcoca ](https://fgcoca.github.io/Guia-de-trabajo-para-microbit/actividades/A26/)y no ha resultado

Se ha intentado con la librería [version\_2 ](https://github.com/rhubarbdog/microbit-dht11/blob/master/version_2.py)y con el siguiente código

```
# Imports go at the top
from microbit import *
from version_2 import *

SENSOR = DHT11(pin2)
while True:
    display.show(Image.HEART)
    t , h = SENSOR.read()
    print("Temperatura=",t)
    print("Humedad=",h)
    sleep(2000)
```

Y tampoco ha funcionado, el error lo sigue dando el chequeo de error. Si en la librería version\_2 se anula, por el puerto serie no salen los valores correctos.

<p class="callout success">Si consigues hacer funcionar el DHT11 de la maqueta con Python dínoslo, [https://catedu.es/informacion/](https://catedu.es/informacion/)</p>

<p class="callout info">🤔🤔Que curioso que el fabricante no ha puesto código Python en su tutorial [https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#expansion-projects](https://docs.keyestudio.com/projects/KS4027-KS4028/en/latest/Python.html#expansion-projects)  
  
[![2025-11-08 12&#95;59&#95;46-Configuración.png](https://prelibros.catedu.es/uploads/images/gallery/2025-11/scaled-1680-/2025-11-08-12-59-46-configuracion.png)](https://prelibros.catedu.es/uploads/images/gallery/2025-11/2025-11-08-12-59-46-configuracion.png)</p>