Lección 14/31-3: Programación de Arduino ejemplo millis() 3 con botón pulsador
¿Alguna vez has necesitado que tu Arduino recuerde cuándo ocurrió algo—como la pulsación de un botón—y luego realice una acción una cantidad precisa de tiempo después, todo mientras mantienes el resto de tu programa funcionando sin problemas? Este es un desafío clásico en la programación de Arduino, y la solución es la función millis(). Este tutorial, parte del curso de Arduino de Robojax, demuestra un ejemplo práctico: detectar si un botón pulsador se presiona una segunda vez después de que haya transcurrido un retraso de 5 segundos desde la primera pulsación. Esta técnica es fundamental para crear proyectos receptivos y no bloqueantes donde el tiempo es crítico.
Este patrón de usar millis() para rastrear el tiempo sin detener el programa es esencial para una amplia gama de aplicaciones del mundo real. Aquí hay algunas ideas para inspirar tus propios proyectos:
- Interfaces de botones con antirrebote: Implementa un sistema donde un botón debe mantenerse presionado durante una duración específica (por ejemplo, 3 segundos) para encender un dispositivo, evitando pulsaciones accidentales.
- Acciones secuenciales: Crea un sistema donde un evento, como la activación de un sensor de movimiento, arme una acción secundaria que ocurra solo si otro evento sucede dentro de un cierto intervalo de tiempo.
- Temporizadores de interacción con el usuario: Construye un proyecto que requiera una entrada de "confirmación" (como una segunda pulsación de botón) dentro de un tiempo establecido para ejecutar una función crítica, como enviar un comando o iniciar un motor.
- Compuerta de sensores: Usa una primera señal de un sensor para iniciar una ventana de tiempo, durante la cual la lectura de un segundo sensor diferente se considera válida o se ignora.
Hardware Requerido
Este proyecto utiliza componentes del kit Arduino 3 en 1 de SunFounder, que es un gran recurso para aprender. Necesitarás:
- Placa Arduino (Uno, Nano, etc.)
- Un botón pulsador momentáneo
- Cables de puente
Guía de Conexiones
El cableado para este ejemplo es muy simple, gracias a las resistencias pull-up internas del Arduino, lo que elimina la necesidad de una resistencia externa. (En el video en 08:29)
- 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.
Al usar INPUT_PULLUP, el pin está internamente conectado a 5V, por lo que lee HIGH normalmente. Cuando se presiona el botón, conecta el pin a GND, haciendo que lea LOW. Esta es la lógica que usaremos en el código.
Explicación del Código
El núcleo de este proyecto es la lógica que rastrea la primera pulsación del botón y luego verifica una segunda pulsación después de un intervalo de tiempo específico. El código está diseñado para ser no bloqueante, lo que significa que no pausará la ejecución de otras tareas en tu loop().
En la parte superior del boceto, encontrarás las variables clave configurables por el usuario que controlan el comportamiento del tiempo:
unsigned long event = 5000;// 5 segundos
unsigned long buttonPushed =0;
event: Esta es la variable de tiempo crucial. Establece la duración del retraso en milisegundos. En este ejemplo, está configurada en5000, que equivale a 5 segundos. Puedes cambiar este valor a cualquier otra duración para adaptarlo a las necesidades de tu proyecto.buttonPushed: Esta variable se usa como una bandera y una marca de tiempo. Comienza en0y se actualiza al valor demillis()la primera vez que se presiona el botón. Este tiempo almacenado se usa luego para calcular la diferencia para la verificación de la segunda pulsación.
La lógica en la función loop() funciona en dos etapas. Primero, lee el estado del botón y, si se presiona por primera vez (pb == LOW && buttonPushed == 0), registra el tiempo actual mediante millis() en la variable buttonPushed. La segunda etapa verifica si el botón aún está presionado y si se ha registrado una primera pulsación. Si es así, calcula la diferencia de tiempo entre el tiempo actual y el tiempo de la primera pulsación. Si esta diferencia es mayor o igual a tu tiempo event, ejecuta la acción—en este caso, imprimir un mensaje en el Monitor Serie.
Demostración del Proyecto en Vivo
En el video, el código se sube al Arduino y se abre el Monitor Serie para observar el comportamiento. (En el video en 16:03) Verás el valor de millis() imprimiéndose continuamente, mostrando el tiempo desde que comenzó el programa. Cuando presionas el botón por primera vez, se imprime un mensaje como First push at:5019. Si presionas el botón nuevamente y lo mantienes presionado durante más de 5 segundos desde la primera pulsación, se imprime el mensaje Action after 5 seconds of first push. Esto demuestra que la acción solo se activa cuando la segunda pulsación ocurre después de que haya transcurrido el retraso especificado.
El poder de este enfoque es que la línea Serial.println(millis()) al inicio del bucle continúa ejecutándose sin interrupciones, demostrando que la lógica de tiempo no bloquea la ejecución de otro código. Esta es la ventaja fundamental de usar millis() en lugar de la función delay().
Proyectos relacionados de este video
- Lección 14/31-1: Arduino Millis (sin delay) y funciones map | SunFounder Robojax
- Lección 14/31-2: Ejemplo 2 de codificación Arduino millis() con evento
- Lección 14/31-4: Ejemplo 1 de codificación Arduino map()
- Lección 14/31-5: Ejemplo 2 de codificación Arduino map()
Capítulos
- [00:00] Introducción a millis() y al curso
- [01:19] ¿Qué es millis() y por qué usarlo?
- [03:06] Primer ejemplo práctico: imprimir millis()
- [05:46] Usar millis() para activar un evento después de 5 segundos
- [08:29] Ejemplo 2: Acción de botón pulsador con un retraso de 5 segundos
- [12:14] Ejemplo 3: Detectar una segunda pulsación de botón después de un retraso
- [17:20] Introducción a la función map()
- [19:47] Ejemplo práctico de mapeo de porcentajes de brillo de LED
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// ilmoFan.com example-2 millis()
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW && buttonPushed ==0)
{
buttonPushed =millis();
Serial.print("First push at:");
Serial.println(buttonPushed);
}
if( pb ==LOW && buttonPushed >0 )
{
unsigned long difference = millis()- buttonPushed;
if( difference >= event)
{
Serial.println("Action after 5 seconds of first push");
}
}
}
Cosas que podrías necesitar
-
AmazonasSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazonas
-
Amazonas
-
Amazonas
-
Amazonas
Recursos y referencias
-
Documentación
-
Externo
Archivos📁
Manual del Usuario
-
Manual de ensamblaje del coche inteligente Arduino 3 en 1 de SunFounderEste documento muestra el ensamblaje paso a paso del coche inteligente Arduino 3 en 1 de SunFounder
SunFounder_car_assembly_manual.pdf1.20 MB