← Índice Valentina Tech
Misión 4 · Bitácora de Misiones · Astra-7

Los ojos de la nave

La Astra-7 quedó atrapada en una zona a oscuras y no encuentra la salida. En algún
punto del cuarto hay una fuente de luz —una grieta hacia la superficie, un faro, el
sol— y tú tienes que encontrarla.

La nave tiene un sensor de luz escondido en la placa. En esta misión vas a
encenderle los ojos y convertirla en un rastreador con dos modos: primero la vas a
calibrar (enseñarle cómo es la luz de tu cuarto) y luego la usarás para buscar la
fuente de luz, cambiando de color y de ritmo según se acerque.

Cuando la nave encuentre la luz, sus paneles solares podrán recargarse y por fin
podremos pensar en volver a casa.

🧭 ¿Qué es calibrar?

Antes de buscar, la nave necesita calibrarse. Pero… ¿qué significa eso?

🧭 Calibrar es enseñarle a un aparato cuáles son los extremos de lo que va a
medir, para que después entienda todo lo que hay en medio.

Imagina que llegas a un cuarto nuevo y a oscuras. Todavía no sabes qué tan oscuro puede
ponerse ni qué tan brillante. Calibrar es justo eso: le muestras a la nave lo más oscuro
(tapando el sensor) y lo más brillante (apuntándola a la lámpara) de este lugar. La
nave guarda esos dos extremos —el menor y el mayor— y con ellos arma su regla.

Piénsalo así:

Lo mejor: como cada salón tiene su propia luz, calibrar hace que la nave funcione en
cualquier lado
sin que tú tengas que cambiar números a mano.

🎯 Tu misión

Hacer una nave con dos modos: con el botón A entra en calibración (mueves la
placa y aprende el menor y mayor nivel de luz), y con el botón B entra en búsqueda
(usa esos dos valores para cambiar de color y de ritmo según cuánta luz encuentre). Además,
la nave muestra sus números en la consola todo el tiempo.

🕹️ Los dos modos

🎨 Ficha técnica (valores exactos)

Ajustes generales

🅰️ Modo CALIBRAR (Botón A)

🅱️ Modo BUSCAR (Botón B)

nivel = (luz - luz_min) / (luz_max - luz_min)
Nivel Color Tono Pausa Cómo se oye
< 0.25 🔴 Rojo (255,0,0) 300 Hz 0.9 s ti......ti......ti
< 0.5 🟡 Amarillo (255,255,0) 500 Hz 0.45 s ti...ti...ti
< 0.75 🟢 Verde (0,255,0) 800 Hz 0.18 s ti.ti.ti
≥ 0.75 🔵 Azul (0,0,255) 1200 Hz 0.04 s titititit

🖥️ Mira los números en la consola

Tu programa va a imprimir lo que siente, para que veas por dentro cómo piensa la nave.
Esos mensajes aparecen en la consola serie de tu editor (en Mu, el botón Serial; en
Thonny, la Shell).

🛠️ Lo que tiene que hacer tu programa (obligatorio)

Empieza en modo "calibrando", con luz_min = 1000 y luz_max = 0. Dentro de un
while True:, cada vuelta:

  1. Revisa los botones: A → calibrar (y reinicia min/max); B → buscar.
  2. Lee luz estable: promedia 20 lecturas en ~100 ms y suaviza con memoria.
  3. Si calibras: actualiza luz_min y luz_max, pon blanco tenue e imprime los
    valores.
  4. Si buscas: calcula nivel, elige color/tono/pausa, muéstralo, da el pulso e
    imprime la luz y el nivel.

👉 Primero pulsa A y pasea la placa (tápala y acércala a la luz) unos segundos. Luego
pulsa B: ahora la nave rastrea usando lo que aprendió, ¡y funciona en tu salón sin
tocar ningún número!

🧱 Dale cuerpo a la nave: la cacería de luz

El sensor de luz es "el ojo" de la nave. Vas a usarlo para cazar una fuente de luz
escondida en un cuarto a oscuras, guiándote por el color y el ritmo del pitido.

🔎 Primero localiza el sensor de luz en la placa: está marcado con un dibujito de un
ojo 👁️ junto a uno de los agujeritos. Ese es el ojo que hay que "apuntar".

💡 Ideas de material (elige una)

🛠️ Cómo hacerlo (paso a paso)

  1. Oscurece el cuarto lo más que puedas.
  2. Pulsa A y calibra: tapa el sensor y luego acércalo a la linterna un par de veces.
  3. Pide a alguien que esconda la fuente de luz apuntando a una pared o esquina.
  4. Pulsa B y barre el cuarto: rojo y lento = frío; conforme te acercas pasa a
    amarillo → verde → azul y el pitido se acelera = caliente.
  5. Gana cuando la nave se ponga azul con un titititit rapidísimo: ¡la encontraste!

🧰 Tips para que lo hagas tú solo/a

🧩 Cómo usar esta sección: no te damos el programa de golpe. Aquí está partido en
pasos para que lo escribas tú, pieza por pieza. Al final tienes el código
completo
por si te atoras o quieres compararlo. ¡Intenta armarlo antes de mirarlo!

Paso 1 — Preparar (antes del bucle):

import time
from adafruit_circuitplayground import cp

cp.pixels.brightness = 0.2
modo = "calibrando"
luz_min = 1000
luz_max = 0
luz = cp.light        # valor inicial para suavizar

Paso 2 — Cambiar de modo con los botones:

if cp.button_a:
    modo = "calibrando"
    luz_min = 1000        # reinicia la calibración
    luz_max = 0
if cp.button_b:
    modo = "buscando"

Paso 3 — Leer la luz estable (apaga, promedia y suaviza):

cp.pixels.fill((0, 0, 0))      # apaga: no medirte a ti mismo
time.sleep(0.02)
suma = 0
for _ in range(20):
    suma = suma + cp.light
    time.sleep(0.005)          # 20 lecturas en ~100 ms
promedio = suma / 20
luz = luz * 0.6 + promedio * 0.4

Paso 4 — Modo CALIBRAR (botón A): guarda el menor y el mayor:

if luz < luz_min:
    luz_min = luz
if luz > luz_max:
    luz_max = luz
cp.pixels.fill((60, 60, 60))   # blanco tenue = calibrando

Paso 5 — Modo BUSCAR (botón B): calcula el nivel, elige color/tono/pausa y responde:

rango = luz_max - luz_min
if rango < 1:
    rango = 1                  # evita dividir entre cero
nivel = (luz - luz_min) / rango

if nivel < 0.25:               # oscuro
    color = (255, 0, 0)        # rojo
    tono = 300
    pausa = 0.9
elif nivel < 0.5:
    color = (255, 255, 0)      # amarillo
    tono = 500
    pausa = 0.45
elif nivel < 0.75:
    color = (0, 255, 0)        # verde
    tono = 800
    pausa = 0.18
else:                          # mucha luz
    color = (0, 0, 255)        # azul
    tono = 1200
    pausa = 0.04

cp.pixels.fill(color)          # muestra el color del nivel
cp.play_tone(tono, 0.04)       # da un pulso
time.sleep(pausa)              # la pausa marca el ritmo

💻 Código completo (todo junto)

Junta los pasos así. Fíjate en los letreros que marcan qué código es de cada modo:

import time
from adafruit_circuitplayground import cp

cp.pixels.brightness = 0.2

modo = "calibrando"      # empieza calibrando
luz_min = 1000
luz_max = 0
luz = cp.light           # valor inicial para suavizar

while True:

    # --- cambiar de modo con los botones ---
    if cp.button_a:
        modo = "calibrando"
        luz_min = 1000       # reinicia la calibración
        luz_max = 0
    if cp.button_b:
        modo = "buscando"

    # --- leer la luz estable (apagar, promediar, suavizar) ---
    cp.pixels.fill((0, 0, 0))    # apaga: no medirte a ti mismo
    time.sleep(0.02)
    suma = 0
    for _ in range(20):
        suma = suma + cp.light
        time.sleep(0.005)        # 20 lecturas en ~100 ms
    promedio = suma / 20
    luz = luz * 0.6 + promedio * 0.4

    if modo == "calibrando":
        # ===== MODO CALIBRAR (botón A) =====
        if luz < luz_min:
            luz_min = luz
        if luz > luz_max:
            luz_max = luz
        print("CALIBRA min", int(luz_min), "max", int(luz_max))
        cp.pixels.fill((60, 60, 60))   # blanco tenue = calibrando
        cp.play_tone(700, 0.03)
        time.sleep(0.08)

    else:
        # ===== MODO BUSCAR (botón B) =====
        rango = luz_max - luz_min
        if rango < 1:
            rango = 1            # evita dividir entre cero
        nivel = (luz - luz_min) / rango
        if nivel < 0:
            nivel = 0
        if nivel > 1:
            nivel = 1

        if nivel < 0.25:
            color = (255, 0, 0)     # rojo
            tono = 300
            pausa = 0.9             # ti......ti......ti
            nombre = "rojo"
        elif nivel < 0.5:
            color = (255, 255, 0)   # amarillo
            tono = 500
            pausa = 0.45            # ti...ti...ti
            nombre = "amarillo"
        elif nivel < 0.75:
            color = (0, 255, 0)     # verde
            tono = 800
            pausa = 0.18            # ti.ti.ti
            nombre = "verde"
        else:
            color = (0, 0, 255)     # azul
            tono = 1200
            pausa = 0.04            # titititit
            nombre = "azul"

        print("BUSCA luz", int(luz), "nivel", round(nivel, 2), nombre)
        cp.pixels.fill(color)
        cp.play_tone(tono, 0.04)
        time.sleep(pausa)

🌟 Si quieres ir más allá (reto opcional)

✅ Misión cumplida cuando…

🏅 Insignia: "Sensores en línea".

Valentina Tech · Circuit Playground Express · CircuitPython