Vamos ahora a poner las instrucciones al estilo millis() y máquinas de estados sólo para el funicular:
1 Si tenemos anotado que el funicular está ascendiendo
y detectamos que ha llegado arriba:
1.1 detenemos el funicular,
1.2 anotamos en qué instante estamos,
1.3 anotamos que el funicular está detenido en la parte superior.
2 Si tenemos anotado que el funicular está detenido en la parte superior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 20 segundos o más:
2.1 ponemos en marcha el funicular en sentido descendente,
2.2 anotamos que el funicular está descendiendo.
3 Si tenemos anotado que el funicular está descendiendo
y detectamos que ha llegado abajo:
3.1 detenemos el funicular,
3.2 anotamos en qué instante estamos,
3.3 anotamos que el funicular está detenido en la parte inferior.
4 Si tenemos anotado que el funicular está detenido en la parte inferior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 20 segundos o más:
4.1 ponemos en marcha el funicular en sentido ascendente,
4.2 anotamos que el funicular está ascendiendo.
Esta vez la lista es poco más larga, enrevesada y compleja. Pero nuestro humano hará instrucción por instrucción sin apenas detenerse y “perder tiempo” en cada una de ellas. Y rápidamente llegará a la última instrucción, para volver a empezar con la primera instrucción. Así, una tras otra, hasta el infinito y más allá.
Un par de pequeños detalles. Antes de empezar, le diremos a la persona que ha de tener donde anotar dos cosas: qué es lo que está haciendo el funicular y un instante. Que inicialmente anote que el funicular está detenido en la parte superior y que anote que el instante actual. No importa si el funicular está arriba, abajo o en medio. Pasado 20 segundos desde que empiece con las instrucciones, el humano pondrá a bajar el funicular hasta que detecte que está abajo. La “máquina de estados” es la anotación de qué está haciendo del estado del funicular.
Ahora, si añadimos el ascensor, al estilo millis() y máquinas de estados, las instrucciones serían:
1 Si tenemos anotado que el funicular está ascendiendo
y detectamos que ha llegado arriba:
1.1 detenemos el funicular,
1.2 anotamos en qué instante estamos,
1.3 anotamos que el funicular está detenido en la parte superior.
2 Si tenemos anotado que el funicular está detenido en la parte superior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 20 segundos o más:
2.1 ponemos en marcha el funicular en sentido descendente,
2.2 anotamos que el funicular está descendiendo.
3 Si tenemos anotado que el funicular está descendiendo
y detectamos que ha llegado abajo:
3.1 detenemos el funicular,
3.2 anotamos en qué instante estamos,
3.3 anotamos que el funicular está detenido en la parte inferior.
4 Si tenemos anotado que el funicular está detenido en la parte inferior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 20 segundos o más:
4.1 ponemos en marcha el funicular en sentido ascendente,
4.2 anotamos que el funicular está ascendiendo.
5 Si tenemos anotado que el ascensor está ascendiendo
y detectamos que ha llegado arriba:
5.1 detenemos el ascensor,
5.2 anotamos en qué instante estamos,
5.3 anotamos que el ascensor está detenido en la parte superior.
6 Si tenemos anotado que el ascensor está detenido en la parte superior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 15 segundos o más:
6.1 ponemos en marcha el ascensor en sentido descendente,
6.2 anotamos que el ascensor está descendiendo.
7 Si tenemos anotado que el ascensor está descendiendo
y detectamos que ha llegado abajo:
7.1 detenemos el ascensor,
7.2 anotamos en qué instante estamos,
7.3 anotamos que el ascensor está detenido en la parte inferior.
8 Si tenemos anotado que el ascensor está detenido en la parte inferior
y entre el instante que tenemos anotado y el instante en que estamos
ya han transcurrido 15 segundos o más:
8.1 ponemos en marcha el ascensor en sentido ascendente,
8.2 anotamos que el ascensor está ascendiendo.
Igual que antes, un par de pequeños detalles. Antes de empezar, le diremos a la persona que ha de tener donde anotar otras dos cosas: qué es lo que está haciendo el ascensor y un instante. Por no complicar las instrucciones, cuando decimos de anotar el estado y el instante, se ha anotar el estado del funicular en un lado y el del ascensor en otro, al igual que los instantes. Vamos, que necesitamos dos variables para el funicular y otras dos para el ascensor, y no mezclar unas con otras. Igualmente, inicialmente ha de anotar que el ascensor está detenido en la parte superior y que anote que el instante actual para el ascensor. No importa si el ascensor está arriba, abajo o en medio. Pasado 15 segundos desde que empiece con las instrucciones, el humano pondrá a bajar el ascensor hasta que detecte que está abajo. La “máquina de estados” es la anotación de qué está haciendo del estado del ascensor.
Ahora el humano no se detendrá con los brazos cruzados, ni se quedará “atascado” un rato atendiendo una misma instrucción. Porque todas las instrucciones se realizan rápidamente una detrás de otra una y otra vez.
Se trata de aplicar este concepto a la hora de programar el Arduino. Y si se implementa el control de los servos, luces, pitidos y demás; con esta misma filosofía; se podría controlar todo con un Arduino. Un poco más complicado que con delay(), sí, pero conseguimos hacer varias cosas a la vez.
No es fácil, lo sé, pero no es imposible.