La primera vez que usó una placa Arduino, probablemente hizo algo como esto:
- Conectado un LED a su Arduino
- Cargado el boceto de parpadeo predeterminado que encendería y apagaría su LED cada segundo
Esto se llama el programa» Hola Mundo » de Arduino y muestra que con solo unas pocas líneas de código puede crear algo que tenga una aplicación del mundo real.
En el ejemplo anterior, se utiliza la función delay () para definir los intervalos entre el encendido y apagado del LED.
Este es el trato: aunque delay() es útil y funciona para ejemplos básicos, realmente no deberías usarlo en el mundo real Keep Sigue leyendo para saber por qué.
Cómo funciona la función delay ()
La forma en que funciona la función delay() de Arduino es bastante sencilla.
Acepta un único entero como argumento. Este número representa el tiempo en milisegundos que el programa tiene que esperar hasta pasar a la siguiente línea de código.
Cuando retrasa (1000), su Arduino se detiene en esa línea durante 1 segundo.
delay() es una función de bloqueo. Las funciones de bloqueo impiden que un programa haga cualquier otra cosa hasta que esa tarea en particular se haya completado. Si necesita que se realicen varias tareas al mismo tiempo, simplemente no puede usar delay().
Si su aplicación requiere que lea/guarde constantemente datos de las entradas, debe evitar usar la función delay (). Afortunadamente, hay una solución.
Función millis() al Rescate
La función millis () cuando se llama, devuelve el número de milisegundos que han pasado desde que se inició el programa por primera vez.
¿por Qué es útil?
Porque al usar algunas matemáticas, puede verificar fácilmente cuánto tiempo ha pasado sin bloquear su código.
El siguiente boceto muestra cómo puede usar la función millis () para crear un proyecto de parpadeo. Enciende la luz LED durante 1000 milisegundos y luego la apaga. Pero, lo hace de una manera que no bloquea.
Echemos un vistazo más de cerca a un boceto de parpadeo que funciona sin una función de retardo:
/* Blink without Delay, example here: arduino.cc/en/Tutorial/BlinkWithoutDelay*/// constants won't change. Used here to set a pin number :const int ledPin = 13; // the number of the LED pin// Variables will change :int ledState = LOW; // ledState used to set the LED// Generally, you should use "unsigned long" for variables that hold time// The value will quickly become too large for an int to storeunsigned long previousMillis = 0; // will store last time LED was updated// constants won't change :const long interval = 1000; // interval at which to blink (milliseconds)void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT);}void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the // difference between the current time and last time you blinked // the LED is bigger than the interval at which you want to // blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); }}
Ver código sin procesar
Este boceto de arriba se puede encontrar aquí y funciona restando el tiempo registrado anterior (previousMillis) del tiempo actual (currentMillis). Si el resto es mayor que el intervalo (en este caso, 1000 milisegundos), el programa actualiza la variable previousMillis a la hora actual y enciende o apaga el LED.
Y debido a que es un código sin bloqueo, cualquier código que se encuentre fuera de esa instrucción first if debería funcionar normalmente.
Ahora puede entender que podría agregar otras tareas a su función loop() y su código seguiría parpadeando el LED cada segundo.
¿Qué función debe usar?
Hemos aprendido dos formas diferentes de lidiar con el tiempo con Arduino. El uso de las funciones millis () requiere un poco de trabajo extra en comparación con el uso de delay (). Pero sus programas no pueden hacer multitarea en el Arduino sin ella.