Código de búsqueda

Lección 14/31-2: Ejemplo 2 de codificación de Arduino con millis() y evento

Lección 14/31-2: Ejemplo 2 de codificación de Arduino con millis() y evento

En este tutorial, aprenderás a usar la función millis() de Arduino para activar una acción solo después de que haya transcurrido un período de tiempo específico, todo sin bloquear el resto de tu programa. Esta es una técnica fundamental para crear proyectos de Arduino receptivos donde múltiples tareas necesitan ejecutarse simultáneamente, como parpadear LEDs mientras se leen sensores o se monitorean pulsaciones de botones. Este ejemplo específico se centra en activar un evento después de cinco segundos, pero la lógica se puede aplicar a innumerables escenarios del mundo real.

Coche Sunfounder ensamblado

Aquí hay algunos ejemplos prácticos de cómo podrías usar este patrón en tus propios proyectos:

  • Activación retardada: Encender un ventilador o una bomba solo después de que un sistema haya estado funcionando durante un tiempo determinado.
  • Bloqueos de seguridad: Requerir que un botón se presione y se mantenga presionado durante un tiempo antes de realizar una acción peligrosa, como arrancar un motor.
  • Alertas basadas en tiempo: Activar una alarma o notificación si una lectura de sensor no ha cambiado dentro de un cierto intervalo.
  • Temporizadores no bloqueantes: Crear un temporizador "perro guardián" que reinicie un dispositivo si se vuelve no receptivo.

El problema central que esto resuelve es la limitación de la función delay(). Cuando usas delay(5000), el Arduino deja de ejecutar cualquier otro código durante esos cinco segundos. Esto está bien para bocetos simples, pero se convierte en un problema importante en proyectos más complejos donde necesitas leer sensores, actualizar pantallas o escuchar pulsaciones de botones mientras esperas. La función millis(), que cuenta los milisegundos desde que la placa se encendió, te permite verificar el tiempo sin pausar el programa.

Hardware Requerido

  • Placa Arduino (Uno, Nano, Mega, etc.)
  • Un botón pulsador
  • Cables de conexión

Guía de Conexión

La conexión para este ejemplo es muy simple. Usa una resistencia pull-up interna, por lo que no se necesita una resistencia externa para el botón.

  • Conecta una pata del botón pulsador al pin GND del Arduino.
  • Conecta la otra pata del botón pulsador al pin digital 2 del Arduino.

Debido a que usamos INPUT_PULLUP en el código, el pin leerá HIGH cuando el botón no esté presionado y LOW cuando esté presionado, conectando el pin a tierra. (en el video en 08:29)

Entendiendo el Código

Este código demuestra un temporizador simple basado en eventos. El programa imprime continuamente el valor actual de millis() en el Monitor Serie. Cuando el botón pulsador se presiona y se mantiene, y el Arduino ha estado funcionando durante al menos 5 segundos, imprimirá "Take action" en el Monitor Serie. La clave es que la verificación de millis() no detiene la impresión continua del tiempo.

Desglosemos las partes configurables por el usuario del código:

unsigned long event = 5000;// 5 segundos

Esta es la variable más importante de configurar. Define la duración de tu "evento" en milisegundos. En este ejemplo, está configurada en 5000, que equivale a 5 segundos. Para cambiar el retraso, simplemente modifica este número. Por ejemplo, configurarlo en 10000 haría que la acción se active después de 10 segundos. Es crucial usar el tipo de datos unsigned long, ya que el valor de millis() puede crecer mucho y eventualmente excederá el valor máximo de una variable int estándar, causando errores en la comparación. (en el video en 05:46)

pinMode(2,INPUT_PULLUP);

Esta línea configura el pin digital 2 como entrada y activa su resistencia pull-up interna. Este es un paso de configuración clave que te permite conectar un botón sin una resistencia externa. El pin leerá HIGH por defecto y pasará a LOW cuando el botón se presione, conectándolo a tierra. Si deseas usar un pin diferente, cambia el número 2 aquí y en la línea digitalRead(2) dentro del bucle. (en el video en 08:46)

La lógica dentro del loop() es sencilla. Lee el estado del botón. Si el botón está presionado (pb == LOW), entonces verifica si el tiempo actual (millis()) es mayor o igual a tu tiempo event definido. Si ambas condiciones son verdaderas, imprime el mensaje de acción. El resto del bucle, que imprime el tiempo, continúa ejecutándose sin interrupciones, demostrando el poder de millis() sobre delay().

Este ejemplo verifica el tiempo desde el momento en que el Arduino se inicia. El tercer ejemplo en la serie de videos se basa en esto registrando el tiempo de la primera pulsación del botón y activando una acción solo si ocurre una segunda pulsación al menos 5 segundos después. Esa lógica se cubre en Lección 14/31-3: Ejemplo 3 de codificación Arduino millis() con botón pulsador.

Demostración del Proyecto en Vivo

Una vez que subas el código y abras el Monitor Serie (a 9600 baudios), verás un flujo continuo de números, que representan los milisegundos desde que la placa se encendió. Si presionas y mantienes el botón pulsador antes de que hayan pasado 5 segundos, no pasará nada. Sin embargo, si presionas y mantienes el botón después de la marca de 5 segundos, verás el mensaje "Take action" impreso en el Monitor Serie. La acción continuará imprimiéndose mientras el botón esté presionado. Esto demuestra un temporizador no bloqueante que permite que otro código (la impresión) se ejecute sin problemas. (en el video en 10:52)

Proyectos relacionados de este video

Este video es parte de una serie de múltiples partes sobre funciones de temporización y mapeo en Arduino. Explora los otros tutoriales creados a partir de este mismo material fuente:

Capítulos

  • [00:00] Introducción a millis() y el kit SunFounder
  • [01:19] ¿Qué es millis() y por qué usarlo en lugar de delay()?
  • [03:06] Demostración práctica: imprimir el valor de millis()
  • [05:46] Creando un evento con millis() y unsigned long
  • [08:29] Cableado y codificación de un botón pulsador con INPUT_PULLUP
  • [10:52] Ejecutando el ejemplo de evento con un botón pulsador
  • [12:14] Vista previa del ejemplo 3: detectar una segunda pulsación del botón
  • [17:20] Introducción a la función map()
  • [19:47] Codificación y demostración de la función map() con un LED

Imágenes

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Idioma: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


unsigned long event = 5000;// 5 seconds
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

Recursos y referencias

Archivos📁

Manual del Usuario