← Índice Valentina Tech
Laboratorio 3 · Curso de Programación · CircuitPython

Patrones con luces: bucles y repetición inteligente

Objetivos

En este laboratorio aprenderás a:


Material necesario


Introducción

Hasta ahora has aprendido a:

Pero hay un problema importante:

👉 ¿Qué pasa si quieres repetir una acción muchas veces?

Por ejemplo:

Si lo haces manualmente, sería muy largo y aburrido.

Aquí es donde aparece una de las ideas más importantes de la programación:


🔁 ¿Qué es un bucle?

Un bucle es una instrucción que permite repetir algo automáticamente.

Es como decir:

“Haz esto muchas veces sin que yo lo escriba una y otra vez”


Ejemplo cotidiano

Imagina que tienes que decir:

Sin bucles sería:

Con bucles es solo:

👉 “repite 100 veces: hola”


🧠 Curiosidad:
Los bucles son la base de los videojuegos, animaciones y robots.


Conociendo los NeoPixels como matriz

La placa tiene varias luces LED (NeoPixels).

Podemos imaginarlas como una fila:

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

Cada número representa una luz diferente.


Nuestro tercer programa

Vamos a crear una animación simple:

👉 Una luz verde que se mueve de un LED a otro


Código completo

import time
from adafruit_circuitplayground import cp

VERDE = (0, 255, 0)
APAGADO = (0, 0, 0)

cp.pixels.brightness = 0.2

while True:

    for i in range(10):

        cp.pixels[i] = VERDE
        time.sleep(0.2)
        cp.pixels[i] = APAGADO

Explicación del código


1. Bucle infinito

while True:

Significa:

👉 “repite todo para siempre”

Esto crea una animación sin fin.


2. Bucle FOR

for i in range(10):

Esto significa:

👉 “repite esto 10 veces”

La variable i cambia así:

Cada número representa un LED.


3. Encender LED actual

cp.pixels[i] = VERDE

Esto enciende una luz específica.


4. Pausa

time.sleep(0.2)

Esto hace que podamos ver el movimiento.


5. Apagar LED

cp.pixels[i] = APAGADO

Esto limpia la luz antes de pasar a la siguiente.


💡 Curiosidad:
Este tipo de efecto se usa en letreros LED, robots y videojuegos retro.


Cómo funciona físicamente

El microcontrolador:

  1. Ejecuta el bucle
  2. Cambia el LED activo uno por uno
  3. Envía señales eléctricas a cada NeoPixel
  4. Crea la ilusión de movimiento

👉 En realidad NO se mueve la luz
👉 Solo se encienden LEDs diferentes muy rápido


Retos del laboratorio


🟢 Reto 1: Ida y vuelta

Haz que la luz:

💡 Pista: para la ida ya sabes usar range(10) (cuenta 0, 1, 2 … 9). Para la
vuelta necesitas contar al revés. range puede hacerlo si le das tres números:
dónde empieza, dónde termina y de cuánto en cuánto avanza (aquí, -1, o sea
hacia atrás):

for i in range(10):          # ida: 0, 1, 2 ... 9
    cp.pixels[i] = VERDE
    time.sleep(0.2)
    cp.pixels[i] = APAGADO

for i in range(9, -1, -1):   # vuelta: 9, 8, 7 ... 0
    cp.pixels[i] = VERDE
    time.sleep(0.2)
    cp.pixels[i] = APAGADO

En range(9, -1, -1): empieza en 9, baja de -1 en -1 y se detiene antes del
-1, así que el último que enciende es el 0. Pon los dos bucles dentro del
while True: para que el vaivén se repita sin parar.

💡 Objetivo: aprender bucles dobles.


🟡 Reto 2: Dos luces al mismo tiempo

Modifica el programa para que:

Ejemplo:

💡 Pista: si el LED de ahora es i, el siguiente es i + 1. Enciende los dos y
luego apágalos:

for i in range(9):           # ¡ojo! hasta 8, no hasta 9
    cp.pixels[i] = VERDE         # LED actual
    cp.pixels[i + 1] = VERDE     # el siguiente
    time.sleep(0.2)
    cp.pixels[i] = APAGADO
    cp.pixels[i + 1] = APAGADO

⚠️ Fíjate que aquí usamos range(9) (llega solo hasta 8), no range(10). ¿Por qué?
Porque el "siguiente" es i + 1: si i valiera 9, el siguiente sería el LED 10…
¡y ese no existe! Los LEDs van del 0 al 9, así que pedir el 10 da error.

💡 Objetivo: manipular múltiples posiciones.


🔴 Reto 3: Efecto “respiración”

Haz que:

💡 Pista: aquí no cambias qué LED enciendes, sino qué tan fuerte brilla, con
cp.pixels.brightness. Ese valor va de 0.0 (apagado) a 1.0 (máximo). Como range
solo cuenta números enteros, cuenta de 0 a 100 y divide entre 100 para obtener
el brillo:

for brillo in range(0, 100, 5):    # sube: 0, 5, 10 ... 95
    cp.pixels.brightness = brillo / 100
    cp.pixels.fill(VERDE)
    time.sleep(0.03)

for brillo in range(100, 0, -5):   # baja: 100, 95 ... 5
    cp.pixels.brightness = brillo / 100
    cp.pixels.fill(VERDE)
    time.sleep(0.03)

cp.pixels.fill(VERDE) enciende todas las luces del mismo color. El primer bucle
sube el brillo (inhala) y el segundo lo baja (exhala); ponlos dentro del while True:
para que respire sin parar. Cambia el 0.03 para respirar más rápido o más lento.

💡 Objetivo: controlar intensidad y ritmo.


Resumen del laboratorio

En este laboratorio aprendiste:

Ahora ya puedes crear movimiento con código:

👉 las luces ya no son estáticas, ahora se comportan como una animación viva

Valentina Tech · Circuit Playground Express · CircuitPython