novato duda multitarea

Buenas gurus del arduino, me surge una duda de novato que no me deja avanzar con mi proyecto, y os pido que me echeis una mano.

Estoy trasteando con un menu, libreria menu backend, unos pulsadores y una funcion de encendido y apagado de leds con temporizador (delay) .
El problema es que cuando a traves del menu activo el led temporizado en 30 segundos, delay(30000), no puedo realizar otra accion con el arduino hasta que el tiempo termine.

Me podeis dar una solucion para la "multitarea"? :slight_smile:

Un saludo a todos.

La solución la tienes en el ejemplo del IDE "BlinkWithoutDelay".

http://arduino.cc/es/Tutorial/BlinkWithoutDelay

aguirrech:
Buenas gurus del arduino, me surge una duda de novato que no me deja avanzar con mi proyecto, y os pido que me echeis una mano.

Estoy trasteando con un menu, libreria menu backend, unos pulsadores y una funcion de encendido y apagado de leds con temporizador (delay) .
El problema es que cuando a traves del menu activo el led temporizado en 30 segundos, delay(30000), no puedo realizar otra accion con el arduino hasta que el tiempo termine.

Me podeis dar una solucion para la "multitarea"? :slight_smile:

Un saludo a todos.

De todas formas es un error de concepto de programacion.

Si tienes un tiempo tan largo (30 segundos) deja que el arduino haga otras cosas, no emplees delay, simplemente comprueba cada x tiempo que tu reloj no haya llegado a los 30 segundos.

Tienes unas librerias llamadas time y otra que no recuerdo ahora mismo para trabajo con tiempos sin necesidad de un RTC pero si te digo la verdad, yo, en tu caso, emplearia un RTC que cuesta dos duros y te da mucho margen de juego.

Pero insisto, es un concepto de programacion, no una multitarea lo que necesitas.

Planteate como te digo, en vez de esperar, cambiar tu programa a que vaya "testeando" el tiempo para ver si ha llegado o superado los 30 segundos y si es asi ejecutas lo que sea y si no... continuas con la faena que le tengas encomendada.

Un saludo.

Gracias por el planteamiento, tengo un RTC por aquí así que me meto en faena con ello y a ver que saco de bueno con ello.

Un saludo :slight_smile:

Intentando ir un poco mas alla y gracias a vuestros consejos, la funcion millis() es perfecta para mantener un led fijo durante un tiempo. Pero lo que intento es conseguir un incremento de la luminosidad tipo 'fade', como podria plantear esto usando millis()? haga lo que haga, bien el led queda fijo o bien realiza el fading pero el arduino se queda realizando solo ese proceso. :cold_sweat:

Saludos

Prueba, pero sobre todo intenta entender este código:

long time_actual, time_anterior;
byte brillo;
void setup() {
    time_anterior=millis();
}

void loop() {
    time_actual=millis(); //TOMAMOS LA LECTURA DE MILLIS ACTUAL PARA CALCULAR TIEMPO TRANSCURRIDO
    brillo=((time_actual-time_anterior)/100)%256; //CALCULAMOS, A PARTIR DEL TIEMPO TRANSCURRIDO EL PWM QUE DESEAMOS OBTENER. ESTO ES SÓLO UN EJEMPLO
    analogWrite(PIN,brillo); 
    /*
    AQUÍ REALIZAMOS OTRAS ACCIONES REQUERIDAS EN EL LOOP. CUANDO VOLVAMOS AL PRINCIPIO VEREMOS CUÁNTO TIEMPO HA TRANSCURRIDO
    */  
}

Gracias Noter, voy a trabajar con esto. :slight_smile: