Soy nuevo en arduino y de programación sé muy poco. Por eso, después de buscar por todas partes información sobre mi problema, he decidido postearlo para ver si alguien tiene alguna idea sobre como solucionarlo.
Estoy haciendo una compuerta que se abre verticalmente. He puesto un botón para subir y otro para bajar y dos finales de carrera, uno arriba y otro abajo, para indicar al motor cuando tiene que parar.
Quiero que mientras sube la compuerta esté parpadeando un led, y que deje de parpadear cuando llegue al final de carrera. El problema es que si programo el parpadeo dentro de un ciclo while usando un delay, el motor no para cuando llega al final de carrera, sinó cuando llega al final de carrera pero pasado el delay. Por eso he intentado hacer el parpadeo sin delay, con millis. Pero la verdad es que no consigo que me funcione.
Quiero que mientras sube la compuerta esté parpadeando un led, y que deje de parpadear cuando llegue al final de carrera. El problema es que si programo el parpadeo dentro de un ciclo while usando un delay, el motor no para cuando llega al final de carrera, sinó cuando llega al final de carrera pero pasado el delay.
Tal vez esto te sirva. Cambia los delay por este delay "tuneado":
bool wait(unsigned long ms) {
//espera ms msec y si pasa algo, sale con true
unsigned long end = millis() + ms;
do {
if(Aqui colocar la condición de fin de carrera 1) return true;
if(Aqui colocar la condición de fin de carrera 2) return true;
//o más condiciones si se usa para apagar o encender el led
} while (millis() < end);
return false;
}
y
en el do lo llamas así, sustituyendo los delays: (ejemplo para sustituir un delay(50)
do {
....
//delay(50);
if (wait(50)) return;
....
}while();
Tal vez no es lo más elegante en programación pero creo que puede servir.