Arduino Delay Function, y por qué no deberías usarlo

Mientras delay () es útil para demostraciones básicas de cómo funciona Arduino, realmente no debería usarlo en el mundo real. Aquí está el porqué y lo que deberías usar en su lugar.

Mientras delay () es útil para demostraciones básicas de cómo funciona Arduino, realmente no debería usarlo en el mundo real.  Aquí está el porqué y lo que deberías usar en su lugar.
Anuncio

La primera vez que comenzó a aprender cómo desarrollar Comenzar con Arduino: una guía para principiantes Comenzar con Arduino: una guía para principiantes Arduino es una plataforma de prototipos de electrónica de código abierto basada en hardware y software flexible y fácil de usar. Está dirigido a artistas, diseñadores, aficionados y cualquier persona interesada en crear objetos o entornos interactivos. Lea más sobre Arduino ¿Qué es Arduino y qué puede hacer con él? ¿Qué es Arduino y qué puedes hacer con eso? El Arduino es un pequeño dispositivo electrónico notable, pero si nunca has usado uno, ¿qué son exactamente y qué puedes hacer con uno? Lea más, probablemente haya desarrollado un producto que funciona de la siguiente manera:

Conectado a su Arduino sería una sola luz LED. Esto se apagaría y apagaría cada segundo más o menos, y continuará hasta que el Arduino se apague. Este es el programa "Hello World" de Arduino, e ilustra perfectamente cómo unas pocas líneas de código pueden crear algo tangible.

arduino-led

También estoy dispuesto a apostar que utilizó la función de demora () para definir los intervalos entre el encendido y apagado de la luz. Pero esta es la cuestión: aunque la demora es útil para demostraciones básicas de cómo funciona Arduino, realmente no debería usarla en el mundo real. Aquí está el porqué, y lo que deberías usar en su lugar.

Cómo funciona Delay ()

La forma en que funciona la función de retraso () es bastante simple. Acepta un entero único Conceptos básicos de programación de computadoras 101 - Variables y tipos de datos Conceptos básicos de programación de computadoras 101 - Variables y tipos de datos Después de haber introducido y hablado un poco acerca de la Programación orientada a objetos y de dónde proviene su homónimo, pensé que era hora de revisar los fundamentos absolutos de la programación de una manera no específica del idioma. Esto ... Leer más (o número) argumento. Este número representa el tiempo (medido en milisegundos) que el programa debe esperar hasta pasar a la siguiente línea de código.

Pero el problema es que la función de retraso () no es una buena manera de hacer que su programa espere, porque es lo que se conoce como una función de "bloqueo".

La diferencia entre las funciones de bloqueo y no bloqueo

Para ilustrar por qué las funciones de bloqueo son malas, quiero que imaginen dos chefs diferentes en una cocina: Henry Blocking y Eduardo NonBlocking . Ambos hacen el mismo trabajo, pero de maneras muy diferentes.

Cuando Henry prepara el desayuno, comienza poniendo dos rondas de pan en la tostadora. Cuando finalmente suena, y el pan se pone dorado, Henry lo pone en un plato y rompe dos huevos en una sartén. Una vez más, se queda quieto mientras el aceite sale y los blancos comienzan a endurecerse. Cuando terminan, los cocina y comienza a freír dos lonchas de tocino. Una vez que estén lo suficientemente crujientes, los saca de la sartén, los pone en el plato y comienza a comer.

arduino-chef

Eduardo trabaja de una manera ligeramente diferente. Mientras su pan está tostando, ya ha comenzado a freír sus huevos y tocino. En lugar de esperar a que un artículo termine de cocinarse antes de pasar al próximo, está cocinando varios artículos al mismo tiempo . El resultado final es que Eduardo toma menos tiempo para hacer el desayuno que Henry, y para cuando Henry Blocking ha terminado, la tostada y los huevos se han enfriado.

Es una analogía tonta, pero ilustra el punto.

Las funciones de bloqueo impiden que un programa haga otra cosa hasta que esa tarea en particular se haya completado. Si quiere que ocurran varias acciones al mismo tiempo, simplemente no puede usar delay () .

En particular, si su aplicación requiere que adquiera datos constantemente de los sensores conectados, debe tener cuidado de evitar el uso de la función de demora (), ya que pausa absolutamente todo .

Afortunadamente, delay () no es la única forma de hacer que su programa espere al codificar Arduino.

Conoce a Millis ()

La función millis () realiza una única tarea. Cuando se llama, devuelve (como un tipo de datos largo ) la cantidad de milisegundos que han transcurrido desde que se lanzó por primera vez el programa. Entonces, ¿por qué es eso útil?

Porque al usar un poco de matemática simple, puede "cronometrar" fácilmente aspectos de su programa sin afectar su funcionamiento. La siguiente es una demostración básica de cómo funciona millis (). Como verá, el programa encenderá la luz LED durante 1000 milisegundos (un segundo) y luego la apagará. Pero, lo que es más importante, lo hace de una manera no bloqueante.

Ahora veamos cómo funciona con Arduino.

arduino-millis-example

Este programa, que se basa en gran medida en uno de la documentación oficial de Arduino, funciona restando la hora registrada anterior de la hora actual. Si el resto (es decir, el tiempo transcurrido desde la última vez que se registró la grabación) es mayor que el intervalo (en este caso, 1000 milisegundos), el programa actualiza la variable Time anterior a la hora actual y enciende o apaga el LED.

Y como no es un bloqueo, cualquier código que se encuentre fuera de esa primera declaración if debería funcionar normalmente.

Simple, ¿no es así? Tenga en cuenta cómo creamos la variable currentTime como unsigned long. Un valor sin signo simplemente significa que nunca puede ser negativo; hacemos esto para que el número máximo que podemos almacenar sea mayor. Por defecto, las variables numéricas están firmadas, lo que significa que un "bit" de memoria para esa variable se usa para almacenar si el valor es positivo o negativo. Al especificar que solo será positivo, tenemos un bit adicional para jugar.

Interrupciones

Hasta ahora, hemos aprendido sobre una forma de aproximar el tiempo en nuestro programa Arduino, que es mejor que delay () . Pero hay otra, mucho mejor, pero más compleja: interrupciones . Éstos tienen la ventaja de permitirle programar con precisión el tiempo de su programa Arduino y responder rápidamente a una entrada externa, pero de manera asíncrona .

Eso significa que se ejecuta en conjunto con el programa principal, esperando constantemente que ocurra un evento, sin interrumpir el flujo de su código. Esto le ayuda a responder de manera eficiente a los eventos, sin afectar el rendimiento del procesador Arduino.

Cuando se activa una interrupción, detiene el programa o llama a una función, comúnmente conocida como un Manejador de Interrupción o una Rutina de Servicio de Interrupción . Una vez que esto ha concluido, el programa vuelve a lo que estaba sucediendo.

El chip AVR que alimenta el Arduino solo admite interrupciones de hardware. Esto ocurre cuando un pin de entrada va de mayor a menor, o cuando se dispara por los temporizadores incorporados del Arduino.

Suena críptico. Confuso, incluso. Pero no lo es. Para ver cómo funcionan y ver ejemplos de su uso en el mundo real, acceda a la documentación de Arduino.

No te bloquees

Usar millis () admite un poco de trabajo extra en comparación con el uso de delay () . Pero confía en mí, tus programas te lo agradecerán, y no puedes hacer multitareas en el Arduino sin él.

Si desea ver un ejemplo de millis () utilizado en un proyecto Arduino del mundo real, eche un vistazo a Arduino Night Light y Sunrise Alarm de James Bruce. Proyecto de alarma de amanecer y luz nocturna Arduino Proyecto de alarma de amanecer y luz nocturna Arduino Hoy haremos un despertador de amanecer, que lo despertará suave y lentamente sin recurrir a una máquina ofensiva para hacer ruido. Lee mas

¿Encontraste alguna otra función de bloqueo de la que debamos tener cuidado? Déjame saber en los comentarios a continuación, y chatearemos.

Créditos de las fotos: Arduino (Daniel Spiess), Chef (Ollie Svenson)

In this article