Les estoy haciendo a mis alumnos ejercicios para que las condiciones se les queden grabadas en el cerebro... y yo en mi infinita prepotencia hoy me he sacado de la manga un ejercicio en principio muy simple, a continuación el código:
Piensa que los while son como el loop, tienes que ponerles algo dentro para poder salir de ellos sino el programa se queda atrapado dentro de uno de ellos y por eso parece que no se ejecuta pero el programa se queda atrapado dentro de uno de los dos while ejecutándolo sin parar.
Por que no utilizas un if en vez de un while para comparar?
Lo de iniciar el puerto serie se me había pasado al hacer copy/paste pero lo había probado antes.
Gracias por lo de los break, no había pensado en ellos.
Como es para la actividad de robótica con los niños quería hacerlo con el while para que lo vieran y de paso machacar un poco más las condiciones, que las tienen un poco atragantadas.
si la condición es verdadera, en este caso si "lectura" es HIGH. Una vez atrapado dentro del bucle while, el flujo de programa solo puede escapar si "la condición" deja de ser verdadera. Esto implica que algo que se ejecute dentro del bucle while tiene que cambiar en algún momento la "verdad" de la condición o el flujo quedará atrapado para siempre en un "bucle eterno". En este caso, salvo que haya por ahí algún código invisible, como el servicio de una interrupción, el código dentro del bucle while no cambia ni el valor de "lectura", ni el valor de HIGH lo que condena al bucle a ser un bucle infinito.
El compilador debería dar un warning en este caso porque se puede determinar que este es un bucle infinito en "tiempo de compilación"
Offtopic: Las etiquetas empleadas en los #define deberían ser palabras largas e improbables, como Pin_entrada_driver_05, para evitar que puedan aparecer accidentalmente en el código. Por ejemplo: si escribimos
#define er 456
y luego en el código
Serial.print(vv);
el preprocesador del compilador nos cambiará esa linea por:
Mitxel:
[...]
Offtopic: Las etiquetas empleadas en los #define deberían ser palabras largas e improbables, como Pin_entrada_driver_05, para evitar que puedan aparecer accidentalmente en el código. Por ejemplo: si escribimos
#define er 456
y luego en el código
Serial.print(vv);
el preprocesador del compilador nos cambiará esa linea por:
S456ial.print(vv);
Eso no pasa, no es lo mismo er que Serial
Lo que si se puede hacer es definir Serial con otro nombre, por ejemplo:
Cambiamos los while's por if's y a funcionar, si a fin de cuentas lo que me interesaba es que los chavales practicaran las condiciones... luego les hice la puñeta cambiando las condiciones en las que los leds debían encenderse o apagarse.
Sobre los #define estoy de acuerdo con el oftopic de Mitxel, pero digamos que son los #defines's oficiales para trabajar con el Tinker Shield.