
Programar un sistema de semáforos: mejorar el código

Actualiza para más contenido
¿Verdadero o falso? Cuando se inician los programas, el autobús tiene prioridad.
Los semáforos normales cambian del rojo al ámbar y al verde a intervalos regulares, tanto si viene un vehículo como si no. ¡Pero este es un semáforo inteligente! Es capaz de responder a la señal de un autobús que quiere luz verde. Pero hay que mejorar este semáforo. Se queda en rojo hasta que el autobús solicita el verde y nunca usa el ámbar. Vamos a mejorar eso.
Empecemos por el pseudocódigo que usamos en otro vídeo. Si se pulsa el botón A, el autobús manda una señal dentro del grupo de radio "uno". Este mensaje es "uno" y significa "quiero luz verde". Ahora el pseudocódigo del semáforo. En aquel programa también empezamos por cambiar el grupo de radio a "uno".
La variable "prio" controla si el autobús tiene prioridad o no. Para empezar, el autobús no la tiene, así que "prio" es "falso". Si se recibe el mensaje "uno", "prio" pasa a ser "verdadero" y el autobús recibe luz verde. Ahora echemos un vistazo al código que se encarga de cambiar los colores del semáforo. El bucle es válido todo el rato, mientras la condición sea verdadera.
Si "prio" es "falso", se enciende la luz roja. Si no, la luz roja se apaga y se enciende la verde. A los tres segundos se apaga el verde, "prio" pasa a ser "falso", volvemos al inicio del bucle y se pone en rojo. Lo que queremos ahora es decirle cuándo tiene que ponerse en ámbar. Queremos que entre el rojo y el verde se ponga ámbar.
Y lo mismo entre el verde y el rojo. Añadimos: Apagar rojo, encender ámbar y apagar verde, encender ámbar. Probemos el código. Uy, eso ha sido demasiado rápido. Tenemos que decirle cuánto tiempo tiene que estar en rojo antes de pasar a ámbar y cuánto estar en ámbar antes de ponerse en verde.
Así que añadimos: Detenerse durante tres segundos después de ponerse en rojo, aquí, y detenerse un segundo después de ponerse en ámbar, en estos dos lugares. Y aquí ponemos: Apagar ámbar, encender verde. Y también ponemos: Apagar ámbar antes de que "prio = falso" y ya hemos hecho una mejora: la luz ámbar se enciende cuando queremos que lo haga. Pero el semáforo sigue poniéndose solamente en verde cuando el conductor del autobús pulsa el botón. Eso es porque hemos escrito el código que controla la luz verde como una premisa "si no".
Lo que significa que solamente ocurre si algo no es verdadero. Es mejor decir de forma positiva que ocurra siempre. Así que quitamos la premisa "si no" y el ámbar y el verde se ponen cuando queramos: cada vez que esté funcionando el bucle. Pongamos a prueba nuestra segunda mejora. Aquí llega un autobús.
El conductor pulsa el botón. "prio" pasa a ser inmediatemente "verdadero". Pero no pasa nada. ¿Por qué no? ¡Se pone rojo y luego ámbar! ¿Qué ha pasado? Oh, estábamos aquí en el pseudocódigo cuando se pulsó el botón y no comprobó si "prio" era "verdadero" hasta que se reinició el bucle. De ahí que el autobús tuviese que esperar en el semáforo rojo. Las pausas en el código nos han causado un problema con el que no contábamos.
Hay que hacer que el código compruebe más a menudo si "prio" es "verdadero". Al programarlo para "detener", el código se para: no escucha. Solamente comprueba si "prio" es "verdadero" aquí: en la premisa "si". Para que el semáforo nos escuche más, necesitamos más premisas "si". Disminuyamos el retraso a un segundo partiendo las pausas así: Ahora el código puede saltar al verde desde distintos lugares.
Pero queremos asegurarnos de que solamente se encienda una luz a la vez. Si aquí "prio" es "verdadero" y nos saltamos esta fila, el color rojo no se apaga. Queremos que solo se encienda el verde para el autobús, así que hay que decirle al código que aquí tiene que apagar el rojo y el ámbar y ahora vamos a comprobarlo de nuevo. Llega un autobús que va con retraso. Se pulsa el botón A y el semáforo se pone rápidamente en verde. ¡Ya tenemos un semáforo más inteligente!
Puede que a ti se te ocurran todavía más mejoras...