Función de retardo de Arduino y por qué no debería usarla

Función de retardo de Arduino y por qué no debería usarla

Cuando empezaste aprendiendo a desarrollar por el arduino , probablemente construiste un producto que funciona un poco así:





Conectado a su Arduino habría una sola luz LED. Esto se apagará cada segundo más o menos, y continuará hasta que se apague el Arduino. Este es el programa 'Hola mundo' 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 demora() función para definir los intervalos entre el encendido y apagado de la luz. Pero aquí está la cuestión: si bien la demora es útil para demostraciones básicas de cómo funciona Arduino, realmente no debería usarlo en el mundo real. He aquí por qué y qué debería usar en su lugar.





Cómo funciona Delay ()

La forma en que demora() La función funciona es bastante simple. Acepta un único argumento de entero (o número). 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 demora() La función no es una buena forma de hacer que su programa espere, porque es lo que se conoce como función de 'bloqueo'.



¿Dónde puedo descargar música gratis?

La diferencia entre 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 Bloqueo , y Eduardo Sin Bloqueo . Ambos hacen el mismo trabajo, pero de formas tremendamente diferentes.

Cuando Henry prepara el desayuno, comienza poniendo dos rondas de pan en la tostadora. Cuando finalmente pings , y el pan sale dorado, Henry lo pone en un plato y rompe dos huevos en una sartén. Una vez más, se queda al margen mientras el aceite estalla y las claras comienzan a endurecerse. Cuando terminan, los coloca en un plato y comienza a freír dos lonjas 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 se tuesta el pan, ya ha comenzado a freír los huevos y el tocino. En lugar de esperar a que un elemento termine de cocinarse antes de pasar al siguiente, está cocinando varios elementos. al mismo tiempo . El resultado final es que Eduardo toma menos tiempo para preparar el desayuno que Henry, y cuando Henry Blocking termina, las tostadas y los huevos se han enfriado.

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





Bloqueo Las funciones evitan que un programa haga cualquier otra cosa hasta que esa tarea en particular se haya completado. Si quieres varios comportamiento que suceda al mismo tiempo, simplemente no puede usar demora() .

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

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

Conoce a Millis ()

los millis () La función realiza una sola tarea. Cuando se llama, regresa (como largo tipo de datos) el número de milisegundos que han transcurrido desde que se lanzó el programa por primera vez. Entonces, ¿por qué es útil?

Porque al usar un poco de matemática simple, puede 'cronometrar' fácilmente los 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 que no bloquea.

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 anteriormente 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 momento anterior variable a la hora actual, y enciende o apaga el LED.

insertar tabla de contenido google docs

Y debido a que es un código sin bloqueo, cualquier código que se encuentre fuera de ese primero si declaración debería funcionar normalmente.

Simple, ¿no es así? Note cómo creamos la variable tiempo actual como un no firmado largo. Un no firmado valor simplemente significa que nunca puede ser negativo; hacemos esto para que el número máximo que podamos 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 poco más para jugar.

Interrupciones

Hasta ahora, hemos aprendido una forma de abordar la sincronización en nuestro programa Arduino que es mejor que demora() . Pero hay otra forma mucho mejor, pero más compleja: interrumpe . Estos tienen la ventaja de permitirle sincronizar con precisión su programa Arduino y responder rápidamente a una entrada externa, pero en un asincrónico conducta.

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 activa una interrupción, detiene el programa o llama a una función, comúnmente conocida como Controlador de interrupciones o un Interrumpir la rutina del servicio . Una vez que esto se ha concluido, el programa vuelve a lo que estaba haciendo.

El chip AVR que alimenta el Arduino solo admite interrupciones de hardware. Estos ocurren cuando un pin de entrada pasa de alto a bajo, o cuando son activados por los temporizadores integrados de Arduino.

Suena críptico. Incluso confuso. Pero no lo es. Para ver cómo funcionan y ver algunos ejemplos de cómo se utilizan en el mundo real, golpear la documentación de Arduino .

No se bloquee

Utilizando millis () es cierto que requiere un poco de trabajo adicional en comparación con el uso demora() . Pero créame, sus programas se lo agradecerán y no puede realizar múltiples tareas en el Arduino sin él.

Si quieres ver un ejemplo de millis () utilizado en un proyecto Arduino del mundo real, echa un vistazo a Arduino Night Light y Sunrise Alarm de James Bruce.

¿Encontraste alguna otra función de bloqueo de la que debamos tener cuidado? Házmelo saber en los comentarios a continuación y charlaremos.

Créditos fotográficos: Arduino (Daniel Spiess) , Jefe (Ollie Svenson)

Cuota Cuota Pío Correo electrónico ¿Vale la pena actualizar a Windows 11?

Windows ha sido rediseñado. Pero, ¿es eso suficiente para convencerte de cambiar de Windows 10 a Windows 11?

Leer siguiente
Temas relacionados
  • Bricolaje
  • Programación
  • Arduino
Sobre el Autor Matthew Hughes(386 Artículos publicados)

Matthew Hughes es un desarrollador y escritor de software de Liverpool, Inglaterra. Rara vez se lo encuentra sin una taza de café negro fuerte en la mano y adora absolutamente su Macbook Pro y su cámara. Puede leer su blog en http://www.matthewhughes.co.uk y seguirlo en Twitter en @matthewhughes.

conectado a una red inalámbrica pero sin internet
Más de Matthew Hughes

Suscríbete a nuestro boletín

¡Únase a nuestro boletín de noticias para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!

Haga clic aquí para suscribirse