El proyecto del bloque C no es una libreta de fragmentos. Es un programa que resuelve un problema definido, con la sintaxis y la depuración que ya has practicado, y con una salida que se pueda mirar. El problema definido de este hilo sigue siendo el patio: a partir de varias lecturas, decidir si se avisa. Puedes cambiar el sitio (aula de música, pasillo, invernadero del instituto) si la frase de problema sigue teniendo un dato, una regla y un efecto. «Hacer un programa bonito» no es un problema.
Se escribe antes del código y cabe en pocas líneas. Quién lo necesita: el grupo de la visita. Qué entra: cuatro lecturas de luz en la escala 0–1023. Qué se calcula: la media. Qué sale: HIGH si la media es menor que 500, LOW en caso contrario, y el valor de la media para que una persona pueda comprobarlo. Qué no entra: la foto del patio, el mapa, la música del acto. Esas piezas fueron del bloque A. Meterlas otra vez sin que la regla las use es disfrazar un programa corto.
Hace falta un vector, porque el problema habla de varias lecturas y no de una. Hace falta una función media, porque el cálculo se nombra y se prueba aparte. Hace falta un si, porque hay dos salidas. No hace falta un objeto, ni un juego, ni un segundo bucle. El proyecto no se valora por el número de estructuras: se valora porque las que hacen falta están y las que no hacen falta no estorban. Quitar es parte de diseñar.
Antes de ejecutar, escribe tres casos. Uno: [100, 100, 100, 100], media 100, HIGH. Dos: el del editor, media 480, HIGH. Tres: [700, 700, 700, 700], media 700, LOW. Y el empate: [500, 500, 500, 500], media 500, LOW, porque la condición es estricta. Si no tienes el cuarto caso, no has cerrado la regla. El laboratorio confirma; no inventa los casos por ti.
Si la media no es 480, no sigas con el LED. El fallo está en el vector o en la función, lección 27 y 29. Si la media es 480 y el estado es LOW, el fallo está en el si. Un cambio cada vez. El interruptor de GPIO 18 no forma parte de los casos: es la maqueta de la salida para enseñarla al lado. Si lo usas como si fuera la variable estado, falseas la prueba.
El pseudocódigo en el editor, la traza de los casos en el cuaderno, una frase de qué simula el pin 13 y el GPIO 18, y la cabecera de licencia de la lección 29 si el código es del grupo. No se entrega una captura de un IDE que no se ha abierto ni un vídeo del LED real que no existe. Si el centro tiene placas y el profesor amplía fuera de esta página, ese montaje es otra actividad: no sustituye a la traza que sí se puede repetir en cualquier aula de Castilla y León sin material.
No hay usuario y contraseña, no hay servidor, no hay «publicar el proyecto». El bloque A ya explicó el alojamiento como concepto. El proyecto C se abre con file://, como el resto del curso. Si tu programa necesita una librería que no está en la página, no es entregable aquí: reescríbelo con el pseudocódigo del laboratorio. Eso también es una decisión de ingeniería, no una limitación que se esconde.
Cuando funcione el ejemplo, cambia una sola lectura y predice el estado antes de pulsar Ejecutar. Si aciertas tres veces, el proyecto ya no depende de un número memorizado. Esa es la diferencia entre entregar 480 y entregar un avisador.
Problema definido. Una frase con dato, regla y efecto. No es un tema libre.
Caso de prueba. Entrada escrita de antemano y salida esperada.
Empate. Media igual al umbral. Con <, la salida es LOW.
Alcance. Lo que el programa no hace y dices que no hace: red, placa, fotos.
Entrega. Editor, traza, frase del pin, licencia. Reproducible en file://.
Un cambio. La misma disciplina de depuración, ahora sobre el conjunto.
Maqueta. El interruptor GPIO 18. Se compara con estado, no lo sustituye.
Criterio 3.1. Programa con sintaxis, depuración y una salida que se puede seguir. El juego era la lección 30; esto es el problema.
«Una app de la Semana de la Ciencia con mapa, música y foro». No cabe y no se puede probar el viernes. Se vuelve al enunciado de la media y el pin.
Solo se ejecuta el ejemplo y se da por válido. Falta el caso 700 y el 500. Se añaden al cuaderno y se ejecutan cambiando el vector.
escribe "HIGH" después de la media, sin si. El caso 700 seguiría diciendo HIGH. El si tiene que ser quien asigne estado.
Cada caso es una entrega del avisador del patio del IES Duero (Aranda de Duero). Lee la situación antes de la decisión.
Situación. El grupo diseña el círculo y aún no hay umbral.
No conviene. Porque la demo se ve.
Decisión. Cerrar los cuatro casos en el cuaderno y solo después preocuparse de cómo se ve el HIGH.
Por qué: Diseñar el círculo antes de tener umbral deja una salida visual sin casos, que es la lección del objeto vacía. El proyecto exige la regla: los cuatro casos en el cuaderno, con el empate. La demo que se ve no sustituye a la predicción escrita.
Situación. Hay para, mientras, tres si y dos funciones que no se llaman.
No conviene. Para que parezca completo.
Decisión. Dejar el vector, la media y un si. Borrar lo que no se llama.
Por qué: Ocho estructuras, con funciones que no se llaman, no completan el programa: el código muerto se pudre. En la próxima lectura alguien cree que ese mientras es la regla y depura el sitio equivocado. Se dejan el vector, la media y el si que el enunciado pide.
Situación. Sin UNO en el aula, el grupo pide aplazar el proyecto.
No conviene. Porque si no hay LED real no hay programa.
Decisión. Entregar la traza y la maqueta de GPIO 18, y describir D13 como paralelo.
Por qué: Sin UNO en el aula no se aplaza el proyecto. El algoritmo no espera al pedido de material, y la simulación declarada es evaluable. Se entrega la traza y la maqueta del GPIO 18, y se describe el D13 como paralelo, no como placa ausente.
Situación. El editor dice 500 y el cuaderno 400.
No conviene. Porque el 400 «salía mejor» en un ensayo.
Decisión. Un solo umbral, el mismo en el enunciado, en el editor y en los casos.
Por qué: Si el editor dice 500 y el cuaderno 400, hay dos umbrales y por tanto dos proyectos. Quien corrige no puede adivinar cuál es el oficial, aunque el 400 «saliera mejor» en un ensayo. El número es uno, el mismo en los dos sitios.
El problema no cambia: si la luz del patio del IES Duero baja de 500, hay que avisar. Cambia quién ejecuta. El pseudocódigo lo ejecuta el laboratorio de esta página. El sketch lo compilaría el IDE de Arduino hacia la UNO. El fragmento de Python lo ejecutaría una Raspberry Pi con gpiozero, si hubiera placa. Aquí no hay placa.
La media se prueba sola. El si no sabe cuántas casillas había, solo el número que recibió. Eso es encapsular bien.
let m = media(lecturas)
si m < umbral
let estado = "HIGH"
si no
let estado = "LOW"
fin
Estos comentarios son el plan. Si el código contradice un caso, manda el caso acordado y se corrige el código, no al revés.
// caso A: media 100 -> HIGH
// caso B: media 480 -> HIGH
// caso C: media 700 -> LOW
// caso D: media 500 -> LOW
Misma regla. La página no graba ni abre el pin. Quien tenga la placa en otra hora parte de esta traza, no de una captura.
int m = media(lecturas, 4);
digitalWrite(13, m < 500 ? HIGH : LOW);
# Pi: led.on() si m < 500, GPIO 18
| Caso | Vector | Media | Estado |
|---|---|---|---|
| A | [100, 100, 100, 100] | 100 | HIGH |
| B | [420, 510, 390, 600] | 480 | HIGH |
| C | [700, 700, 700, 700] | 700 | LOW |
| D | [500, 500, 500, 500] | 500 | LOW |
| E | [500] | 500 | LOW |
D y E distinguen < de <=. Si tu programa enciende en D, no has implementado el enunciado de esta página: has implementado otro, y tienes que decirlo.
| Hora | Una lectura | ¿Es la media? | Aviso |
|---|---|---|---|
| 17:30 | 420 | — | no uses una sola hora como media |
| 17:32 | 510 | — | no uses una sola hora como media |
| 17:35 | 390 | — | no uses una sola hora como media |
| 17:41 | 600 | — | no uses una sola hora como media |
| 17:48 | 500 | — | no uses una sola hora como media |
| 18:02 | 250 | — | no uses una sola hora como media |
| 18:15 | 880 | — | no uses una sola hora como media |
| 18:27 | 499 | — | no uses una sola hora como media |
Una lectura suelta no es el proyecto. La media mezcla horas. Por eso el caso B no coincide con «encender a las 17:30»: a las 17:30 hay 420, pero la decisión mira las cuatro.
Pide a otra persona que cambie una casilla y te diga el estado que espera. Si no sabe de dónde salir, tu enunciado no está en la entrega: está solo en tu cabeza. Escríbelo encima del editor, en el cuaderno.
Incluye el caso de vector de un solo elemento, [500]. La media es 500 y el estado es LOW. Sirve para comprobar que la función no da por hecho que hay cuatro casillas. Si el para está bien, funciona igual.
Firma con la cabecera de licencia. Aunque no vayas a publicar nada, el proyecto ya es un programa con autor. Si todo el texto es del grupo, MIT o una frase «código de aula, se puede copiar citando al grupo» es una decisión consciente, no un vacío.
| Criterio | Aún no | En proceso | Conseguido | Notable |
|---|---|---|---|---|
| Enunciado | No hay frase | Habla del LED | Dato, regla y efecto | Dice qué queda fuera |
| Programa | Fragmentos sueltos | Media o si, no ambos | Vector, función y si | Sin código muerto |
| Pruebas | Solo la demo | Dos casos | Los cuatro, con el empate | Predicción antes de ejecutar |
| Reproducible | Depende de una web | Solo en tu sesión mental | Se ejecuta en esta página | Otra persona del grupo lo abre en file:// |
| Pin | Se afirma la placa | No se nombra | GPIO 18 y D13 como paralelo | estado y el interruptor no se confunden |
El proyecto es un enunciado, un programa corto y cuatro casos. HIGH y LOW salen del si. El pin de la página es la maqueta, no la prueba.
Abre cada pregunta, responde en el cuaderno y después mira la solución. El párrafo «Por qué» es la parte que se estudia.
Respuesta. Porque es el borde de la condición. Sin él no se sabe si el programa usa < o <=.
Por qué: Los casos cómodos, muy por debajo y muy por encima, pasan con las dos condiciones. El empate es el único que las distingue. Un proyecto que no lo prueba no tiene la regla cerrada, aunque la demo de 480 quede encendida.
Respuesta. El mapa y el audio, salvo que la regla los use, y no los usa.
Por qué: Arrastran trabajo del bloque A al lugar donde hay que ver el si. Hacen la entrega más frágil (rutas, archivos) y no añaden un caso de prueba. Se pueden citar como contexto en una frase, no enlazarlos para que el programa «parezca grande».
Respuesta. En el si y en el umbral, no en la función media.
Por qué: 480 ya confirma el recorrido del vector. El fallo está en la decisión: umbral distinto, comparación invertida o un escribe que pisa el estado. Volver a abrir la función es buscar en el sitio que ya ha dado la señal correcta.
En la vida real
Escribes y dibujas aquí mismo: no hay salto a otro módulo. La misma herramienta, a pantalla completa, está en l31-proyecto-programacion.html y en el marco (útil si el navegador permite file:// en iframes).
Entrega el programa del editor con media y estado, y en el cuaderno los cuatro casos (100, 480, 700 y 500) con la salida esperada y la obtenida. Una de las obtenidas tiene que salir de una predicción hecha antes de ejecutar. Indica que GPIO 18 y D13 son el paralelo simulado. Una buena entrega la puede ejecutar otra persona sin preguntarte el umbral.
reto_id: bach1-tic-L31