Función de retardo de Arduino, y por qué no debería usarla
Cuando 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 creación de prototipos de electrónica de código abierto basada en hardware y software flexibles y fáciles de usar. Está dirigido a artistas, diseñadores, aficionados y cualquier persona interesada en crear objetos o entornos interactivos. Leer más para el Arduino ¿Qué es Arduino y qué puedes hacer con él? ¿Qué es Arduino y qué puedes hacer con él? El Arduino es un pequeño dispositivo electrónico notable, pero si nunca ha usado uno antes, ¿qué son exactamente y qué puede hacer con uno? Lea más, probablemente haya creado un producto que funciona un poco como este:
Conectado a su Arduino sería una sola luz LED. Esto se apagaría y apagaría cada segundo aproximadamente, y continuará hasta que se apague el Arduino. Este es el “Hola Mundo” programa de Arduino, e ilustra perfectamente cómo unas pocas líneas de código pueden crear algo tangible.
También estoy dispuesto a apostar que usaste el retrasar() Función para definir los intervalos entre el encendido y apagado de la luz. Pero aquí está la cosa: si bien el retraso es útil para demostraciones básicas de cómo funciona Arduino, realmente no debería estar usándolo en el mundo real. He aquí por qué y qué deberías usar en su lugar..
Cómo funciona el retraso ()
La forma en que el retrasar() La función funciona es bastante simple. Acepta un solo número. Principios básicos de la programación de computadoras 101 - Variables y tipos de datos Fundamentos de la programación de computadoras 101 - Variables y tipos de datos Habiendo introducido y hablado un poco sobre la programación orientada a objetos antes y de dónde viene su nombre, pensé que es hora de pasar Los fundamentos absolutos de la programación de una manera no específica del lenguaje. Este ... 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, el retrasar() La función no es una buena manera de hacer que su programa espere, porque es lo que se conoce como “bloqueando” función.
La diferencia entre las funciones de bloqueo y no bloqueo
Para ilustrar por qué las funciones de bloqueo son malas, quiero que imagine a dos chefs diferentes en una cocina: Henry Bloqueo, y Eduardo no bloqueando. 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 pings, y el pan se sale dorado, Henry lo pone en un plato y corta dos huevos en una sartén. Una vez más, él se queda parado mientras el aceite salta, y los blancos comienzan a endurecerse. Cuando terminan, los prepara 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..
Eduardo trabaja de una manera ligeramente diferente. Mientras su pan está tostado, él ya comenzó a freír sus huevos y tocino. En lugar de esperar a que un elemento termine de cocinar antes de pasar al siguiente, está cocinando varios elementos concurrentemente. El resultado final es que Eduardo toma menos tiempo para preparar el desayuno que Henry, y cuando Henry Blocking terminó, las tostadas y los huevos se enfriaron..
Es una analogía tonta, pero ilustra el punto.
Bloqueo Las funciones impiden que un programa haga cualquier otra cosa hasta que esa tarea en particular se haya completado. Si quieres multiples comportamiento para que ocurra al mismo tiempo, simplemente no puedes usar retrasar().
En particular, si su aplicación requiere que adquiera constantemente datos de sensores conectados, debe tener cuidado de evitar el uso de retrasar() función, ya que se detiene absolutamente todo.
por suerte, retrasar() no es la única forma de hacer que su programa espere cuando se codifica para Arduino.
Conoce a Millis ()
los milis La función realiza una sola tarea. Cuando se llama, devuelve (como un largo tipo de datos) el número de milisegundos que han transcurrido desde que se lanzó por primera vez el programa. Entonces, ¿por qué es tan útil??
Porque usando un poco de matemáticas simples, puedes fácilmente “hora” 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 crucialmente, lo hace de una manera que no es bloqueante..
Ahora veamos cómo funciona con Arduino..
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ó el tiempo) es mayor que el intervalo (en este caso, 1000 milisegundos), el programa actualiza el vez anterior variable a la hora actual, y enciende o apaga el LED.
Y debido a que es un no bloqueo, cualquier código que se encuentre fuera de ese primero si declaración debería funcionar normalmente.
Simple, ¿no es así? Nótese cómo creamos la variable. tiempo actual como un no firmado largo. Un no firmado el valor 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 una “poco” La 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 acerca de una forma de enfocar el tiempo en nuestro programa Arduino que es mejor que retrasar(). Pero hay otra, mucho mejor manera, pero más compleja: interrumpe. Estos tienen la ventaja de que le permiten cronometrar su programa Arduino con precisión, y responder rápidamente a una entrada externa, pero en una asincrónico manera.
Eso significa que se ejecuta junto 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 dispara una interrupción, detiene el programa o llama a una función, comúnmente conocida como Manejador de interrupciones o un Rutina de servicio de interrupción. Una vez que esto ha concluido, el programa vuelve a lo que estaba pasando..
El chip AVR que alimenta el Arduino solo admite interrupciones de hardware. Esto ocurre cuando un pin de entrada va de alto a bajo, o cuando es activado por los temporizadores incorporados del Arduino.
Suena críptico. Confuso, incluso. Pero no lo es. Para ver cómo funcionan y ver algunos ejemplos de cómo se utilizan en el mundo real, visite la documentación de Arduino.
No te bloquees
Utilizando milis Es cierto que requiere un poco de trabajo extra en comparación con el uso retrasar(). Pero confía en mí, tus programas te lo agradecerán y no podrás realizar tareas múltiples en Arduino sin él..
Si quieres ver un ejemplo de milis utilizado en un proyecto Arduino del mundo real, echa un vistazo a Arduino Night Light y Sunrise Alarm de James Bruce. Arduino Night Light and Sunrise Alarm Project Arduino Night Light and Sunrise Alarm Project Hoy, haremos un reloj de alarma de amanecer, que lo despertará suave y lentamente sin recurrir a una máquina ofensiva para hacer ruido. Lee mas
¿Has encontrado alguna otra función de bloqueo de la que deberíamos desconfiar? Déjame saber en los comentarios a continuación, y charlaremos..
Créditos de las fotos: Arduino (Daniel Spiess), Chef (Ollie Svenson)
Explorar más sobre: Arduino, Programación.