Hola, soy primerizo en esto y estoy tratando de hacer que si realizo una pulsación dentro de un rango de tiempo (por ejemplo entre 1 y 1.5 segundos) me encienda un led.
Ya estuve investigando e intentando pero no lo consigo, alguna recomendación o idea de cómo podría?
De antemano gracias.
Tienes que hacerlo con millis, tienes tutorial en la sección de documentación.
Es lo que estaba intentando y con interrupciones, a ver si me sale.
Gracias.
Pero tendría que hacer como 2 if dentro de otro no? para indicar que se cumplan esas condiciones.
Tendrás que leer el estado del botón, al pulsarlo si no lo estaba anteriormente guardar el millis actual y cambiar una variable para saber que ya se ha pulsado y no se ha soltado.
En el momento que leas que el botón vuelve a cambiar comparar los tiempos y si está dentro del rango encender el led.
Ok, muchas gracias! ![]()
No necesitas interrupciones para hacer esa tarea.
Hay como 5 tutoriales sobre millis()
Millis() :Explicacion
Millis() : Procesos en paralelo, multihilo, simultaneos y otras yerbas
millis() rollover, o reset millis()
Using millis() for timing. A beginners guide INGLES
(Procesos en paralelo, multihilo, simultaneos y otras yerbas - Documentación - Arduino Forum)
Entender millis y no morir en el intento
Maquina de Estados
Qué es y cómo funciona una máquina de estados
Gracias, sí me estoy guiando con esos tutoriales ![]()
Pero creo que lo tendré que hacer más preciso, voy a intentar que lea los tiempos entre cada pulsación con el botón y si está dentro de un rango que encienda
Y sí, en #1 dijiste que quieres hacer justamente eso.
Disculpa, es que pensé que se hacía diferente
Tienes que hacer tal y como te dijo @krnlpanic en #4. No hay otra forma mejor de hacerlo. ![]()
Muestranos tu código para que podamos ayudarte, mira las normas para ver como se hace.
Ok, es que no me había quedado muy claro cómo hacerlo.
ok, deja veo como mandarlo
Este es el último que he hecho, pero tampoco me sale ![]()
En lugar del led primero le puse texto .
int verde = 13;
const byte boton = 5;
byte estadoboton;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempo =0;
unsigned long tiempo3;
unsigned long tiempoTranscurrido = 0;
void setup()
{
pinMode(boton, INPUT);
Serial.begin(115200);
Serial.println ("Inicio");
}
void loop()
{
estadoboton = digitalRead(boton);
if(estadoboton == HIGH)
{
tiempo=millis();
while(estadoboton == HIGH)
{
tiempo2=millis();
estadoboton = digitalRead(boton);
}
tiempo3=tiempo2-tiempo;
Serial.println(tiempo3);
if((500 <= tiempo3) && (tiempo3 <= 600) )
{
Serial.println("Valido");
}
else{ Serial.println("no valido");
}
}
}
Te dejo unos comentarios sobre tu código para que entiendas lo que hace
if (estadoboton == HIGH) { //comprueba si el boton se pulsa sin tener en cuenta si ya estaba pulsado
tiempo = millis(); //mientras el botón está pulsado la variable tiempo está cambiando en cada ciclo del loop
while (estadoboton == HIGH) { //entras en un bucle hasta que sueltes el botón
tiempo2 = millis(); //tiempo2 varia en cada vuelta del bucle mientras tengas el botón pulsado
estadoboton = digitalRead(boton); // estadoboton siempre será HIGH porque así está condicionado este while
}
Pruebalo y trata de entenderlo
int verde = 13;
const byte boton = 5;
byte estadoboton = 0;
byte estadoAnterior = 0;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempo = 0;
unsigned long tiempo3;
unsigned long tiempoTranscurrido = 0;
void setup() {
pinMode(boton, INPUT);
Serial.begin(115200);
Serial.println ("Inicio");
}
void loop() {
estadoboton = digitalRead(boton);
if (estadoboton == HIGH && estadoAnterior == 0) {
tiempo = millis();
estadoAnterior = 1;
}
if (estadoboton == LOW && estadoAnterior == 1) {
if (millis() - tiempo > 1000 && millis() - tiempo < 1500) {
Serial.println("Valido");
}
else {
Serial.println("no valido");
}
estadoAnterior = 0;
}
}
Muchas gracias! ![]()
Pero ya lo probé y unicamente manda "no valido" creo que es porque en la especificación para que salga "valido" inicia en LOW, pero debería ser igual al if anterior no? porque es un pushbutton
O estoy equivocado? ![]()
No lo he probado, prueba con un tiempo mas "humano" en vez de 1500 pon 5000 que son 5 segundos y si pulsas mas de 1 s y menos de 5 debería darte valido.
Ah no, ya vi el problema, es que detecta el tiempo que queda pulsado el botón, lo que quiero hacer es que se pulse 1 vez y tome el tiempo, y al pulsarlo una segunda vez lo vuelva a hacer y que esa diferencia de tiempo sea lo que marque si es válido o no.
Prueba a modificarlo, ya tienes una base.
Yo comprobaría cuando se pulsa el botón si la variable tiempo está a 0, si lo está guardar millis, si no lo está comprobar el tiempo que ha pasado entre millis y tiempo, despues poner tiempo a 0 para el siguiente ciclo del botón.