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

Decisiones con botones: tu primer programa interactivo

Objetivos

En este laboratorio aprenderás a:


Material necesario


Introducción

Hasta ahora, tu programa hacía algo muy simple:

👉 Encender una luz y luego apagarla.

Pero los programas reales hacen algo más interesante:

👉 reaccionan a lo que ocurre

Por ejemplo:

Esto se llama programación interactiva.


¿Qué es una variable?

Una variable es como una caja donde guardas información.

Imagina una caja con una etiqueta:

Dentro puedes guardar valores que pueden cambiar.

Ejemplo:


🧠 Curiosidad:
Las variables son como post-its digitales que la computadora puede leer y cambiar.


¿Qué es una condición?

Una condición es una pregunta que el programa se hace.

Ejemplo:

Dependiendo de la respuesta:


Conociendo la interacción de la placa

En este laboratorio usaremos:


🔘 Botones A y B

Los botones son como interruptores de decisión.

Ejemplo mental:


🔵 NeoPixels como respuesta

Las luces ahora no solo se encienden:

👉 reaccionan a lo que tú haces


Nuestro segundo programa

Vamos a crear un programa donde:


Código completo

import time
from adafruit_circuitplayground import cp

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

cp.pixels.brightness = 0.2

while True:

    if cp.button_a:
        cp.pixels[0] = VERDE

    elif cp.button_b:
        cp.pixels[0] = ROJO

    else:
        cp.pixels[0] = APAGADO

    time.sleep(0.1)

Explicación del código


1. Bucle infinito

while True:

Esto significa:

👉 “repite esto para siempre”

Es como un videojuego que nunca se detiene.


2. Leer el botón A

if cp.button_a:

Esto pregunta:

👉 ¿El usuario está presionando el botón A?

Si la respuesta es sí → entra aquí.


3. Encender luz verde

cp.pixels[0] = VERDE

Si presionas el botón A, la luz se vuelve verde.


4. Condición alternativa (B)

elif cp.button_b:

“elif” significa:

👉 “si no fue A, entonces revisa B”


5. Luz roja

cp.pixels[0] = ROJO

Botón B → luz roja.


6. Si no haces nada

else:
    cp.pixels[0] = APAGADO

Si no presionas nada:

👉 la luz se apaga


💡 Curiosidad:
Los videojuegos usan este mismo principio: botones + decisiones + resultados.


Cómo funciona físicamente

Cuando presionas un botón:

  1. El circuito se cierra
  2. La placa detecta corriente eléctrica
  3. El microcontrolador lo interpreta como “True”
  4. El programa ejecuta una acción

Es como si la placa “sintiera” tus acciones.


Retos del laboratorio


🟢 Reto 1: Tres colores, tres acciones

Modifica el programa:

💡 Pista: para saber si están los dos botones presionados a la vez, une las dos
condiciones con and:

if cp.button_a and cp.button_b:
    cp.pixels[0] = AZUL

💡 Objetivo: aprender combinaciones de condiciones.


🟡 Reto 2: Modo semáforo

Haz un sistema tipo semáforo:

💡 Objetivo: lógica aplicada a situaciones reales.


🔴 Reto 3: Mensaje oculto

Haz que:

💡 Objetivo: controlar diferentes LEDs.


🍎 Proyecto: convierte una fruta en un botón

Hasta ahora usaste los botones A y B de la placa. Pero… ¿y si te dijéramos que
puedes convertir un plátano en un botón?

👉 En este proyecto vas a crear botones usando objetos cotidianos, como frutas.

Esto se llama toque capacitivo, y es la misma tecnología que usan las pantallas
de los celulares.


🧪 Material extra para este proyecto

También puedes probar con otros objetos: una cuchara de metal, una moneda, agua…


⚡ Principio físico: el toque capacitivo

Tu cuerpo guarda pequeñas cargas eléctricas.

La placa mide algo llamado capacitancia en unos puntos especiales llamados
pads de toque. Cuando tocas uno de esos pads:

👉 tu cuerpo cambia esa capacitancia y la placa lo detecta como un toque.

No necesitas apretar nada: basta con tocar.

¿Y por qué funciona una fruta? Porque las frutas tienen agua y sales, y eso
conduce la electricidad. Al conectar la fruta al pad con un cable, la fruta se
convierte en una “extensión” del pad:

👉 tocar la fruta es como tocar el pad.


💡 Curiosidad:
Los objetos que conducen electricidad (frutas, metal, agua) pueden ser botones.
Los que no conducen (plástico, madera seca) no funcionan.


🔌 Cómo se implementa en Circuit Playground Express

La placa tiene 7 pads de toque en su borde, marcados A1 a A7.

En el código se leen así:

cp.touch_A1
cp.touch_A2
cp.touch_A3

Cada uno devuelve True cuando lo tocas (o cuando tocas la fruta conectada a él).

Pasos para conectar una fruta:

  1. Conecta un extremo del cable con pinza de cocodrilo al pad (por ejemplo, A1).
  2. Conecta el otro extremo a la fruta (clávalo en un plátano).
  3. Con todo ya conectado, reinicia el programa (guarda code.py otra vez o pulsa
    reset). La placa se calibra al arrancar, así que si conectas las pinzas después
    creerá que ya la estás tocando. Conecta primero, arranca después.
  4. Al tocar el plátano, cp.touch_A1 se vuelve True.

🔧 Notas:

  • El pad A0 no sirve para toque (se usa para sonido). Usa de A1 a A7.
    Si lo pides en el código (cp.touch_A0), la placa dará el error
    AttributeError: 'Express' object has no attribute 'touch_A0'.
  • A diferencia de otros kits, aquí no necesitas un cable de tierra: el toque
    funciona solo con tu cuerpo.
  • Si aun así se enciende solo, baja la sensibilidad con cp.adjust_touch_threshold(200)
    al inicio (número más alto = menos sensible; prueba 100, 200, 300…).

Código de ejemplo

Tres frutas, tres colores:

import time
from adafruit_circuitplayground import cp

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

cp.adjust_touch_threshold(200)   # menos sensible (evita falsos toques)
cp.pixels.brightness = 0.2

while True:

    if cp.touch_A1:
        cp.pixels.fill(VERDE)

    elif cp.touch_A2:
        cp.pixels.fill(ROJO)

    elif cp.touch_A3:
        cp.pixels.fill(AZUL)

    else:
        cp.pixels.fill(APAGADO)

    time.sleep(0.1)

Explicación del código

1. Leer un pad de toque

if cp.touch_A1:

Pregunta: ¿estás tocando la fruta conectada al pad A1?


2. Encender todas las luces

cp.pixels.fill(VERDE)

fill es un atajo nuevo: enciende todas las luces de golpe con el mismo color,
sin escribirlas una por una.


3. Otras frutas

elif cp.touch_A2:
    cp.pixels.fill(ROJO)

Cada fruta enciende un color distinto.


4. Sin tocar nada

else:
    cp.pixels.fill(APAGADO)

Si no tocas ninguna fruta, las luces se apagan.


🔧 Retos del proyecto


🟢 Reto 1: Cuarta fruta

Conecta una cuarta fruta al pad A4 y haz que encienda un color nuevo
(por ejemplo, amarillo).

💡 Objetivo: ampliar el sistema con más entradas.


🟡 Reto 2: Piano de frutas

Haz que cada fruta suene como una nota musical usando:

cp.play_tone(262, 0.3)   # 262 Hz = nota Do

Notas de la escala de Do (en Hz):

La placa tiene 7 pads de toque (A1–A7), así que puedes asignar 7 frutas (de Do a Si).
Para completar la octava, usa un botón (A o B) para el Do alto.

Código completo del piano de frutas:

import time
from adafruit_circuitplayground import cp

cp.adjust_touch_threshold(200)   # menos sensible (evita falsos toques)
cp.pixels.brightness = 0.2

while True:

    if cp.touch_A1:
        cp.pixels.fill((255, 0, 0))       # rojo
        cp.play_tone(262, 0.3)            # Do

    elif cp.touch_A2:
        cp.pixels.fill((255, 128, 0))     # naranja
        cp.play_tone(294, 0.3)            # Re

    elif cp.touch_A3:
        cp.pixels.fill((255, 255, 0))     # amarillo
        cp.play_tone(330, 0.3)            # Mi

    elif cp.touch_A4:
        cp.pixels.fill((0, 255, 0))       # verde
        cp.play_tone(349, 0.3)            # Fa

    elif cp.touch_A5:
        cp.pixels.fill((0, 255, 255))     # cian
        cp.play_tone(392, 0.3)            # Sol

    elif cp.touch_A6:
        cp.pixels.fill((0, 0, 255))       # azul
        cp.play_tone(440, 0.3)            # La

    elif cp.touch_A7:
        cp.pixels.fill((255, 0, 255))     # magenta
        cp.play_tone(494, 0.3)            # Si

    elif cp.button_a:
        cp.pixels.fill((255, 255, 255))   # blanco
        cp.play_tone(523, 0.3)            # Do alto

    else:
        cp.pixels.fill((0, 0, 0))         # apagado

    time.sleep(0.05)

Cada nota enciende un color distinto y suena con cp.play_tone. El Do alto se
toca con el botón A.

💡 Objetivo: combinar toque con sonido y crear un instrumento.


🔴 Reto 3: Detector de materiales

Prueba a conectar distintos objetos y descubre cuáles funcionan como botón:

💡 Objetivo: entender qué materiales conducen la electricidad.


🔴 Reto avanzado: Combinación secreta

Haz que solo se “desbloquee” cuando se tocan dos frutas a la vez.

Para comprobar dos condiciones al mismo tiempo se usa la palabra and:

if cp.touch_A1 and cp.touch_A2:
    cp.pixels.fill((0, 255, 0))    # verde: desbloqueado
else:
    cp.pixels.fill((255, 0, 0))    # rojo

💡 Objetivo: combinar dos condiciones con and.

🔒 ¿Y una clave por orden (A1 → A2 → A1)?
Esa es más difícil: la placa tiene que recordar por dónde vas en la secuencia.
Para eso hacen falta los estados, que verás en el Laboratorio 8. ¡Ahí está el reto!


Resumen del laboratorio

En este laboratorio aprendiste:

Ahora tu programa ya no solo ejecuta instrucciones:

👉 ahora toma decisiones contigo

Valentina Tech · Circuit Playground Express · CircuitPython