Seleccionar página

7 Razones Para No Usar La Función Delay En Arduino

por | Dic 2, 2014 | Opiniones, trucos y consejos

Delay Arduino
Si tú también eres de los que utiliza la función delay cada vez que quieres dejar un LED, motor, etc. encendido durante un tiempo determinado, este post es para ti. En esta ocasión te voy a hablar de las consecuencias de utilizar esta función en tus proyectos, de lo que pierdes cada vez que usas la función delay en Arduino y cómo minimizar su efecto.

Qué Ocurre Cuando Usas La Función Delay En Tu Arduino

Quiero dejarte claro antes que nada que la función delay es un recurso importantísimo que en muchas ocasiones es imprescindible utilizar. Sin embargo, se trata de una herramienta que genera problemas de rendimiento en tus proyectos. Por eso, ¿utilizar la función delay en Arduino? ¡Sí, cuando sea necesario!

Cada vez que se ejecuta esta función en tu proyecto el microcontrolador de tu Arduino se para, espera a que transcurra el tiempo que hayas establecido y ejecuta la siguiente instrucción. Esto provoca varios problemas.

1. Tu Arduino No Puede Detectar Eventos

Mientras tu placa Arduino está ejecutando un delay no puedes, por ejemplo, leer sensores. Esto no supone un gran problema siempre que no necesites una lectura muy frecuente de los mismos (por ejemplo cuando estás trabajando con temperaturas) pero en los proyectos que se “mueven” como puedan ser un coche RC o un cuadricóptero, donde necesitas una respuesta rápida de tus dispositivos, el uso adecuado de delays es un factor clave.

2. El Consumo De Tu Proyecto Aumenta

A ver, esto es una mentira a medias. Usar la función delay en Arduino no aumenta el consumo de tu proyecto pero si (a causa de los delays) tardas tres veces más en realizar la misma tarea, es lógico pensar que, en términos generales, el consumo de tu proyecto se habrá multiplicado por tres.

Además, utilizar un delay no significa dejar tu microcontrolador en standby, es decir, no reduces la carga de trabajo de tu placa. Mantienes el chip a máximo rendimiento pero simplemente diciéndole que no haga nada (mas que esperar). Por lo que, en caso de que tu proyecto requiera el uso de pausas, podrías pensar en sustituir los delays por funciones que pongan tu placa en standby (haré un post de esto brevemente).

3. Los Delays Dentro Del Loop Son Acumulativos

Como todas las instrucciones dentro del loop (que no es más que un bucle while(1)) se están ejecutando una y otra vez, todos los problemas que te genera el uso de la función delay en Arduino se van arrastrando (y por tanto multiplicando) con el transcurso del tiempo.
Tiempo de Delay en Arduino
Una forma reducir este problema consiste en utilizar esta función dentro de tus if() y switch(), evitar ponerla dentro de bucles for() o while() y, siempre que puedas, intentar poner tus delays en módulos y llamar a esos módulos desde el loop cuando sea necesario.

4. Cuanto Más Duren Tus Delays, Peor

Utilizar delays con una duración excesiva es incluso peor que usar muchos (al menos entre delay y delay tu proyecto tiene algo más de flexibilidad).

No estoy tratando de decirte con esto que si ibas a poner un delay(200) pongas dos delay(100), eso es absurdo. Lo que ocurre es que muchas veces utilizamos esta función para esperar a que se cargue algún dato en memoria EEPROM, se oriente correctamente un servomotor o simplemente se active un relé, sin tener en cuenta el tiempo real que esto conlleva, es decir, si el servomotor tarda en orientarse 20ms, ¿Por qué poner un delay de 30ms?

Supongo que a estas alturas estarás pensando: Vale, ¿y cómo sé yo cuánto dura eso? Lo cierto es que muchas veces resulta imposible predecir cuánto va a tardar en ejecutarse alguna acción, por lo que deberás recurrir al ancestral método del ensayo y error, incrementando la duración del delay poco a poco hasta dar con el tiempo exacto. Sé por propia experiencia que no hay cosa más aburrida que cargar un sketch una y otra vez pero si quieres un resultado profesional, no te queda otra.

5. La Función Delay Es Incompatible Con Las Interrupciones

Hace poco escribí un post sobre el uso de las interrupciones en Arduino que te recomiendo encarecidamente (puedes verlo aquí). Como ya entré en profundidad en ese tema, no me voy a extender mucho en este punto. Simplemente te diré que pueden surgirte fallos al utilizar ambas funcionalidades de tu placa Arduino y que una forma fácil de evitarlos es utilizando la función delayMicroseconds(), lo que nos lleva al siguiente punto wink

6. El 83% De Las Veces Tu Sketch Mejora Simplemente Cambiando Delay Por DelayMicroseconds

Vale, sí. Al igual que Barney Stinson, me he inventado el porcentaje. Pero ahora en serio. ¿Cuánto crees que tarda un Arduino funcionando a 16MHz en ejecutar una instrucción? Estoy seguro de que en muchos de tus proyectos tu Arduino pierde más tiempo esperando entre delay y delay que en ejecutar el resto del código.

Haz la prueba, cambia delay por delayMicroseconds en alguno de tus proyectos y luego, si quieres, discutimos el porcentaje smile

Barney Stinson

7. Siempre Que Puedas Elige La Función Millis()

La función millis no es la panacea que curará todos los males de tu proyecto, de hecho, si te has decidido a leer el post que te recomendé antes (sobre las interrupciones en Arduino), habrás podido comprobar que la función millis también puede provocarte problemas. Aun así, es lo más cerca que estarás de trabajar de forma paralela con Arduino, es decir, lo más cerca que estarás de hacer dos cosas a la vez.

Gracias a la función millis, en vez de esperar un tiempo sin hacer nada (sin modificar ningún parámetro), puedes contar el tiempo que está transcurriendo y ejecutar instrucciones en función de eso. La ventaja de este método es que mientras tu Arduino está contando internamente el tiempo que pasa, puede seguir ejecutando instrucciones.

Te dejo un código para que veas cómo funciona este método.

/*EducaChip – Uso de la función millis para sustituir delay*/
/* www.educachip.com */

//Se declara una variable que almacenará el tiempo actual (real) transcurrido
//desde que se enciende la placa.
unsigned long tiempo = 0;

//Se declara una variable que almacenará el último valor de tiempo en el que se
//ejecutó la instrucción (delay).
unsigned long t_actualizado = 0;

//Se declara una variable que almacenará el tiempo que se desea que dure el delay.
unsigned long t_delay = 20;

void setup(){

/*
Se configura el setup
*/
}

void loop() {

//Se almacena el tiempo que ha transcurrido desde que se encendió el Arduino.
tiempo = millis();

//Si ese tiempo es mayor que el intervalo de deseado (equivalente al tiempo
//de delay) se actualiza el intervalo y se ejecutan las instruciones relacionadas.
//La idea detrás de este algoritmo consiste en pensar que si han transcurrido
//20ms y se desea un delay de 30ms cada vez, cuando se superen esos 30ms la
//variable con la que se compara pasa a ser 60ms. Una vez se alcanzan los 60ms
//pasa a ser 90ms y así sucesivamente.
if( tiempo > t_actualizado + t_delay) {

//Se actualiza el tiempo que ha de transcurrir para el próximo delay.
t_actualizado = tiempo;

/*
Se define el conjunto de instruciones que se desea que se realicen cada vez
que transcurra el tiempo establecido anteriormente (mover un motor, cambiar
de estado un LED, enviar datos…).
*/
}

/*
Se ejecutan el resto de instrucciones del programa.
*/

}

… Y hasta aquí el post de hoy. Si tienes alguna duda con el código, hay algo que no te cuadre, etc. deja tu comentario. Si te ha gustado el post, compártelo en tus redes sociales favoritas y, si no quieres perderte ningún artículo, recuerda suscribirte al blog.

Un saludo y te leo en los comentarios smile

Actualmente me dedico, entre otras cosas, a crear contenidos sobre Arduino y otros dispositivos eléctricos. Me encanta todo lo relacionado con el “Universo Maker”.

Siempre estoy activo en los comentarios. Si tienes cualquier pregunta, no dudes en dejármela en los comentarios. Intentaré responderte lo antes posible… Un abrazo smile

Enrique Romero,

Autor del post.

¿No quieres perderte nada? ¡Suscríbete!

69 Comentarios

  1. Felicidades por tu aporte.
    Necesito cambiar el estado de un pin de salida en función del tiempo, y no se como hacerlo sin usar delay. Con la función mili tampoco soy capaz de sacarlo…
    Ejemplo:

    Void loop(){
    if( entrada==HIGH){
    lcd.print(“”);

    ?????//aquí necesito retardar el cambio de estado

    digitalWrite(salida, HIGH);

    ????//cuando pase otro tiempo

    digitalWrite(salida, LOW);

    Espero haberme explicado.
    Gracias

    Responder
    • Buenas Roberto,

      Puedes hacerlo con un if(), comprobando si el tiempo transcurrido es mayor que el de una variable que tú especifiques.

      Un saludo, Enrique.

      Responder
  2. Estoy tratando de encender y apagar un led mediante un LDR, después de 2h tratando de cambiar todas las conexiones, el led se queda encendido “ignorando el LDR” aquí dejo el programa a ver si encuentras el fallo..
    int pinLdr=0;
    int nivelLuz;
    int pinLed=3;

    void setup()
    {
    pinMode(pinLed,OUTPUT);
    pinMode(pinLdr,INPUT);
    }

    void loop ()
    {
    nivelLuz=analogRead(pinLdr);
    nivelLuz= constrain(nivelLuz,0,255);
    analogWrite(pinLed, nivelLuz);
    }

    Responder
  3. Buenas, espero puedas ayudarme, ante todo gracias por el post ya que efectivamente he estado teniendo problemas con el delay ya que se retrasa o adelanta 2seg a mas y la verdad es que recién estoy aprendiendo estoy tratando de ejecutar esto

    do{
    /*MOSTRANDO EN PANTALLA T.S T.C Y BAJADAS*/
    lcd.clear();
    lcd.setCursor(0,0);
    String Mostrar1 = “T.S = “+String(hit1)+” “+”T.C = “+String(hit2);
    lcd.print(Mostrar1);
    lcd.setCursor(0,1);
    String Mostrar2 = “BAJADAS = “+String(hit3);
    lcd.print(Mostrar2);
    int temC=hit2*1000; <——AQUI LO MULTIPLICO PARA LLEGAR AL TIEMPO QUE QUIERO QUE ES UN VALOR ALMACENADO EN hit2

    /*—————————————*/

    /*ACA TIENE QUE ESPERAR HASTA QUE EL BOTON DE INICIO SE PRESIONE */
    iniciar:
    if(digitalRead(inicio)==HIGH){
    digitalWrite(led,HIGH);

    delay(temC); <– Y AQUI USO EL DELAY PARA QUE DESPUES DE PRENDERSE EL LED SE APAGUE CON EL TIEMPO QUE QUIERO Y SE APAGUE EL LED QUE PRENDIO AL INICIO

    digitalWrite(led,LOW);
    digitalWrite(motor,HIGH);
    delay(2000);

    }
    else {goto iniciar;}

    ESPERO HABERME HECHO ENTENDER Y ME PUEDAS AYUDAR Y SABER SI LA FUNCION MILLIS PUEDE AYUDARME ACA

    Responder
    • Buenas Carlos,

      Es difícil analizar el código sin haberlo hecho. Me cuesta un poco entender qué es lo que significan las variables, qué es lo que quieres hacer y demás.

      Para probar si el problema está en los delay(), yo probaría poniéndolos con valores fijos (con un número y no una variable). Así te aseguras de que el problema está en los delays y no en el valor que se calcula para establecerlos.

      Por lo que estás haciendo, tampoco deberías tener problemas aun que no trabajes con millis. Seguramente el fallo esté en otro sitio.

      Si ves que incluso poniendo los delays con valores fijos no se corresponde con el tiempo que debería, puede ser cosa del oscilador que utiliza tu placa para generar las referencias de tiempo. Lo puedes comprobar ejecutando programas sencillos con delays.

      Un saludo, Enrique.

      Responder
  4. que tal enrique muy buen post, veras soy nuevo en esto de la programacion y me dejaron un proyecto, en el tengo que hacer un programa en arduino y manejarlo desde c++ osea le doy los cin en c++ y me tiene que correr el arduino de acuerdo a la opcion ingresada mi pregunta es el como puedo hacer esa comunicacion y mandarle a arduino el trabajo a seguir?
    gracias!

    Responder
    • Buenas Cristóbal,

      Para eso habría que tocar el compilador. La verdad es que no lo he hecho nunca. Yo probaría por intentar programarlo desde Eclipse.

      Un saludo, Enrique.

      Responder
    • Saludos, si tienes razón he desarrollado algunos ejemplos básicos como es multiplexar buses, y me di cuenta lo que tu expones.
      es destructivo utilizar delay().
      a lo mejor también millis().

      gracias por el post

      Responder
      • Exacto Santiago. smile

        Lo que mejor me suele funcionar es utilizar directamente los registros del timer.

        Un saludo, Enrique.

  5. Buenas, estoy creando una casa domótica, y tengo una pregunta
    He hecho una alarma de incendios con el LM35, un LED y un piezo. En el programa le indico que si la temperatura sobrepasa 30 grados por ejemplo, se active el piezo y el LED, y que si es menor, no se active. El problema es que obviamente cuando caliento el LM35 y se activa el piezo y el LED, tarda mucho en disminuir la temperatura del sensor y por lo tanto está demasiado rato encendido el piezo. Me podrias ayudar? Cómo le digo al programa que al detectar 30 grados pite 5 segundos y ya esta, es decir que no espere a que se enfríe el sensor?

    Responder
    • Buenas Víctor,

      Puedes utilizar una variable adicional que se active cuando sube la temperatura y no se desactive hasta que pase el tiempo que necesites. Luego en el loop compruebas si la variable sigue activa o no y, si no lo está, decides con un if() que no se reproduzca el sonido.

      Un saludo, Enrique.

      Responder
  6. muy buenas noches Enrique me asesores con este inconveniente, necesito controlar mi delay digitando por medio del puerto serial el tiempo deseado

    Responder
    • Buenas Ferney,

      Puedes poner el valor en una variable a través del puerto serie y después utilizar la variable dentro de un delay().

      Un saludo, Enrique.

      Responder
  7. Hola, gracias por aportar tus conocimientos.

    Te quería hacer una consulta. Estoy fijando el parámetro Kp en un PID y quiero que en arduino me pida que le vaya dando valores para calcular la desviación típica (variación de datos de un sensor Hall). Lo único que me falta es meter esta función en el loop para que tome 2000 microsegundos y me de el resultado, y me pida otro valor Kp. ¿podrías darme algún consejo?

    Gracias de nuevo por todo

    Responder
    • Buenas,

      Una forma sencilla de gestionar el envío de información de Arduino es con la función while(Serial.available()==0){}. Con eso podrás hacer que Arduino solo envíe datos cuando le pases un carácter por el puerto serie.

      Es lo más fácil que se me ocurre. smile

      Un saludo, Enrique.

      Responder
  8. Hola enrique, tu trabajo es increible, ya puse tu pagina en favoritos!
    Tengo una duda, si necesito tomar el valor de una variable para el retraso. Puedo hacer delayMicroseconds(VARIABLE)? sospecho que solamente se puede poner numero y no variables, hay alguna forma de hacer el retraso con una variable que se le da valor durante el programa?
    Muchas gracias!

    Responder
    • Buenas Sebastian,

      En principio no deberías tener problemas a la hora de utilizar variables. Puedes buscar las especificaciones de la función si necesitas más detalles. smile

      Responder
  9. Muy buenas, no tendra por casualidad usted un tutorial que explique más detalladamente cómo implementar la función millis para poderlo utilizar en cualquier proyecto , ya que hay personas como yo que no contamos con su experiencia y conocimientos en el manejo de esta función mil gracias por tratar de ayudarnos espero con ansias de su respuesta

    Responder
    • Buenas Douglas,

      Lamento decirte que no. En cualquier caso, puedes ver el funcionamiento de la variable buscándo en la web.

      Un saludo, Enrique.

      Responder
  10. Hola, para los delays te funcionaria mejor agregar la biblioteca de AVR y mandar a llamar a la funcion _delay_ms(500); esa la use en interrupciones y me funciono. (prefiero programar AVR en Atmel Studio)

    Responder
    • Buenas Diego,

      Está claro que cuanto más a bajo te vayas en cuanto a lenguajes de programación, más posibilidades tienes. smile

      No explico mucha cosa de AVR porque me da bastante pereza y a la mayoría de la gente no le interesa demasiado (pero es una buena opción).

      Muchas gracias por tu comentario. Un saludo, Enrique.

      Responder
  11. Hola. Disculpa yo tengo una rutina implementada. Es parecida a la de fritzing pero en el void loop pregunto por una condicion. Un boton. Toggle Si se cumple entra pero llamo a ti.mer millis ahi si hace el print. De segundos ca da segundo. Pero si regresando pongo el print de segs pone repetidamente el val de los segundos 2222222…333333…44444….cuando aun no cambia de valor. Por que. Podrias explicarlo mas detalladamente incluso uba prueba de escritorio Entonces debo poner rutina de despliegue timer en ese punto de la su rutina y no en el void. Gracias

    Responder
    • Buenas Gris,

      No me ha quedado claro cuál es el problema que tienes. ¿Podrías especificarlo un poco más? uneasy

      Un saludo, Enrique.

      Responder
  12. Si quiero hacer un reloj con arduino, que codigo utilizaria, por que e estado utilizando el delay y en un cierto tiempo se atrasa uno o dos segundos.

    Responder
    • Buenas Lori,

      Hay módulos de reloj para Arduino que se encargan de todo ese trabajo (vienen además con una pila para que la hora se mantenga aunque apagues tu placa).

      Un saludo, Enrique.

      Responder
  13. Hola Enrique, muy buen post.

    Mi pregunta es si tienes algún post o tutorial donde expliques como hacer diferentes SKETCHES en un solo programa de Arduino?

    Me parecen muy interesantes tus aporte!

    Responder
    • Buenas Alan,

      Solo puedes cargar un sketch en Arduino. Sin embargo, puedes establecer sentencias if() para conseguir que se ejecute un código u otro en función de algún parámetro.

      Un saludo, Enrique.

      Responder
  14. Muy interesante tu articulo… me gustaria hacerte una consulta… tengo un arduino UNO , y tengo un modulo sensor PIR de los genericos para arduino… consegui el sketch de la pagina de arduino, y me funciona el modulo PIR… cada que detecta un movimiento la luz enciende (queda encendida unos 5 segundos aprox) y luego el pir queda como suspendido sin trabajar unos 7 segundos y nuevamente vuelve a trabajar siempre y cuando detecte movimiento… Mi idea era que si estoy moviendome frente al PIR este no apague la luz hasta que yo no me saliera de la zona de deteccion o sea que la luz no se apague hasta q yo no me aparte del lugar sin importar el tiempo que permanezca alli… y no que sea un tiempo fijo…

    Responder
    • Buenas Federrgb,

      Puedes asociarlo a una interrupción que cambie el estado de una variable booleana y luego ir leyendo el valor de esta variable.

      Un saludo, Enrique.

      Responder
  15. Hola Enrique, en primera instancia te felicito por tu gran aporte en este tema de las interrupciones, me has ayudado bastante.
    Pero una gran pregunta y espero puedas ayudarme. Resulta que estoy tratando de controlar dos led mediante un botón, cuando no está presionado el botón parpadea un led y el otro este apagado, pero cuando presione el botón lo que necesito es que enciendan los dos led durante 10 segundos y después se apaguen a pesar de que lo mantenga presionado, pero en el momento que suelte el botón quiero que vuelva al parpadeo inicial, el tiempo que lo mantenga presionado no debe importar, puede ser ya sea por un tiempo corto de 500 milisegundos o hasta un tiempo de 2 días, el consumo no me es importante, lo que necesito es que se cumpla todo eso :(.
    Ya estuve verificando con distintas funciones como delayMicroseconds, delay, y no mas no puedo hacer que funcione como se debe, estoy seguro que se realiza con una interrupción, tal vez sea sencilla la solución, pero no logro hacerlo, soy nuevo en el mundo de Arduino. y te agradecería mucho tu apoyo y si se puede guiarme para poder lograr este proyecto en el que estoy trabajando.

    Responder
    • Buenas Eduardo,

      Podrías enfocarlo como dos interrupciones, una que se active cuando se pulsa el botón y otra que se active cuando se suelta. A lo mejor así te resulta más sencillo implementarlo.

      Un saludo, Enrique.

      Responder
  16. Hola Enrique, buen post, llegue aqui buscando informacion, resulta que estoy haciendo una incubadora controlada con un arduino uno, necesito mover la bandeja 1 minuto cada 4 horas, como puedo hacerle para que cada 4 horas se active un reley ?

    Responder
    • Buenas Máximo,

      Con la función millis() puedes controlar el tiempo que está transcurriendo y activar el pin de control del relé cuando haya pasado el tiempo que quieras. En cualquier caso, te recomendaría que te hicieses con un módulo de reloj para tener un poco más de fiabilidad con el tema de la hora.

      Un saludo, Enrique.

      Responder
  17. Excelente Post y excelente página, te felicito Enrique, se nota tú dedicación y amor por lo que haces, que contestes la mayoria (si es que no son todas ya) de los comentarios demuestra que ciertamente te gusta compartir lo que sabes

    Responder
    • Gracias a ti por tu comentario, Joseph. Me alegro de que te guste la página. smile

      Un saludo, Enrique.

      Responder
  18. hola andres, quiero pasar de un arduino uno a un mega, recomendarías uno chino??

    Responder
  19. que tal Enrique, gracias por compartir esa funcion millis(); me acaba de salvar la vida, solo como observacion si sigues el algoritmo de tu sketch te daras cuenta que los eventos dentro del if se repetiran cada 21ms, t_delay deberia valer 19 o bien cambia la condicion a >=, para lograr que suceda cada 20ms, y nuevamente excelente post!!! smile

    Responder
    • Puede ser, Sergio. A todos se nos escapan fallos. :S

      Un saludo, Enrique.

      Responder
  20. Muy buena tu página, la he descubierto hoy y la estoy devorando, me encanta lo que compartes. Queria preguntarte por el post de las funciones que dejan el arduino en stand by, le tienes hecho ya? un saludo

    Responder
    • Gracias Víctor, me alegro de que te esté gustando. La verdad es que ese todavía está en la lista de pendientes uneasy a ver si me pongo las pilas y lo saco pronto.

      Un saludo.

      Responder
  21. Hola como todos te felicito por el post ; quisiera hacerte una consulta y nose si me podrias ayudar , como prodria ser para controlar la velicidad de motores ac, mas que todo detectar el cruce por cero con arduino , gracias

    Responder
    • Buenas Edwin,

      Disculpa mi tardanza en contestar, he estado un poco liado tongue

      Puedes hacerte a la idea de la velocidad controlando la corriente que circula por tus motores.

      Un saludo, Enrique.

      Responder
  22. Un excelente post. Claro y útil.. Felicidades.

    Responder
    • Me alegro de que te sea de utilidad, Pablo. smile

      Responder
  23. Hola, excelente el post , según tu experiencia , que me recomiendas para evitar el uso de delay, necesito hacer uans mediciones cada 10 min , y quiero dejar el arduino en espera y optimizar el consumo de corriente, que puedo usar para no tener que dejar el arduino en delay.?

    saludos

    Responder
    • Buenas Luis,

      Busca por Internet, porque hay una librería para poner el Arduino en stand by que te puede ir muy bien.

      Un saludo, Enrique.

      Responder
  24. Hola, veo que sabes bastante de arduino, veras quisiera saber si me puedes ayudar , tengo un proyecto el cual consiste en recibir señales de un control remoto y manejar un rgb , pero no consigo que este haga diferentes programas para cada boton: es decir si oprimo el boton 1 el rgb deberia hacer un juego de luces si oprimo el boton 2 los rgb se iluminarían al son de la música ambiente(obvio se que aca debo agregarle un microfono al circuito y un codigo al sketch) si oprimo el boton 3 este juegue con los colores azul-rojo-verde-amarillo etc… si me pudieras ayudar estaria infinitamente agradecido

    Responder
    • Buenas Andrés,

      Ante todo disculpa la tardanza en contestar. Puedes utilizar las interrupciones para conseguir ese resultado. Mira, te dejo un post al respecto.

      Un saludo, Enrique.

      Responder
  25. Hola, felicidades por tu post, la verdad te quedan muy bien y se aprende fácil… Sólo tengo una duda y es que una vez que millis llegue a su límite (Imaginemos que hemos logrado mantener el arduino por tanto tiempo sin interrumpirse) se volverá 0 y entonces la condición no se volverá a cumplir. Si esto es cierto la única manera de solucionar ese problema seria que si millis es igual a 0 lo hagan también todas las variables asociadas al conteo. Esto es correcto ¿No?

    Responder
    • Cierto José Rafael, “reseteando” las variables solucionas el problema. smile

      Un saludo, Enrique.

      Responder
  26. Hola de nuevo Enrique, otra duda. ¿La comunicación I2C con otro dispositivo, genera una interrupción? Si por ejemplo se ponen dos Arduino comunicados por I2C, alternando las funciones de maestro y esclavo según los acontecimientos, cuando el que hace de esclavo recibe una petición del maestro, se produce también una interrupción, ¿no?, ¿o es necesario que el esclavo se encuentre con la linea correspondiente del programa para atender la petición del maestro?
    Es un tema muy interesante, y estoy haciendo una aplicación en la que tendré que resolver un problema como el propuesto.
    Gracias anticipadas.

    Responder
    • Buenas Ekaitz,

      La designación del maestro y el esclavo se realiza en el setup, por lo que no se alternan las funciones. En cuanto a lo de las interrupciones, estás en lo cierto, no se necesita que coincidan las líneas de código.

      Un saludo, Enrique.

      Responder
  27. Hola Enrrique muy bueno el post. mi pregunta es, se puede encender un led por un segundo y simultaneamente hacer otra cosa. Porque si enciendo un led con un delay de un segundo el programa se congela ese segundo. Tu dices que ponga ese delay en un if para que no corte el loop. Es asi?
    Desde ya muchas gracias.

    Responder
    • Buenas Rodolfo,

      Lo que puedes hacer es utilizar la función millis() y en lugar de “esperar” un segundo, “cuentas” un segundo.

      Un saludo, Enrique.

      Responder
  28. Que interesante! Me ha gustado mucho el post, gracias por la información!

    Responder
    • Me alegro de que te haya gustado Julia smile

      Responder
  29. Hola Enrique. Gracias por compartir tu código.
    Lo he probado en un sketch en el que estoy trabajando, y en el que pretendia sustituir varios delays de 3 segundos, por retardos realizados con el código que has compartido. Pero he tenido un problema. Solo me funciona sustituyendo el primer delay. Es decir, tengo un sketch que incluye cuatro delays y pretendo sustituirlos por cuatro retardos realizados con tu código, pero solo me funciona uno de los cuatro.

    Los delays son para que se muestren durante tres segundos, las distintas pantallas de un glcd.

    He probado a nombrar las variables de modos diferentes para cada retardo pero no he tenido éxito.

    Gracias.

    Responder
    • Buenas Rafael,

      Ten en cuenta que si has dejado instrucciones delay() dentro del código es posible que se produzcan errores. Aun así, si una te funciona y las demás no, puede ser que tengas algún pequeño error en las condiciones de los bucles o actualizando las variables.

      Un saludo, Enrique.

      Responder
  30. Simplemente excelente!
    Te felicito.

    Responder
    • Me alegro de que te haya gustado Juan Carlos. smile

      Un saludo, Enrique.

      Responder
  31. hola enrique una pregunta quisiera saber como hacer para crear? una pagina web en arduino … eh intentando darles mas de 8 funciones y no me carga en el arduino habra alguna manera de ? poder solucionar eso? que puedo hacer si quiero ponerle imagen a la web y demas es imposible con el arduino ethernet?

    Responder
  32. Buenos Días Enrique.
    Gracias por compartir tus conocimientos. hace días me venia rondando el tema de los “delay” pues había leído algo de todas estas razones que tu comentas para evitar usarlo. quería saber si te puedo enviar un código que vengo trabajando hace mucho tiempo y en el cual uso muchos “delay” para que me orientes en como los puedo reducir y / o implementar la funcion “millis” o “microdelay”.

    Responder
    • Buenas Andrés,

      Sin problema, si me envías el código le echaré un vistazo. Eso sí, no prometo nada. Cada uno tenemos una forma de implementar el código y comprender lo que otro ha desarrollado no siempre es fácil.

      Un saludo, Enrique.

      Responder
      • Buenos Días Enrique.

        Estoy comentando mejor el código para que lo puedas entender. Por que me dio te lo puedo enviar cuando lo tenga listo.?

      • Buenas de nuevo Andrés,

        Puedes enviarlo por el medio que prefieras. Tienes disponible (por ejemplo) una sección de contacto desde la que puedes enviarme el código.

        Un saludo, Enrique.

      • Buenas tardes y antes que nada agradecerte por tus aportes, son de muchísima ayuda y con respecto a esta programación, quiero hacer parpadear una chicharra, que este un cierto tiempo prendido y un cierto tiempo apagado como si fuera una alarma, para eso como quedaría el programa después del ciclo, porque para poder realizar ese sonido le tuve que poner un delay en el tiempo de apagado, me gustaría que me ayudaras.

      • Buenas Néstor,

        Puedes utilizar la función millis() para contar el tiempo que está pasando en tu programa y con ello ir actualizando variables para activar o desactivar tu dispositivo de sonido.

        Un saludo, Enrique.

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

7 Razones Para No Usar La Función Delay En Arduino was last modified: Diciembre 14th, 2016 by Enrique

¿Me ayudas?

Hey! Espero que te esté gustando el artículo. ¿Me ayudarías compartiéndolo con tus amigos? Un pequeño paso para ti, un gran paso para EducaChip. :) ¡Gracias!