Tiempo de un boton

Hola a todos los que leean esto (jaja) quiero hacer que dependiendo el tiempo que este pulsado un boton o pulsador por ejemplo 3 segundos ponga en alto una salida y conectarle un relay, pero desconozco como se hace. Desde ya gracias

Mira el ejemplo BlinkWithoutDelay.ino que te enseñara como usar millis().
millis() es un cronómetro en milisegundos que siempre esta contando.
debes tomar un valor parcial cuando presiones el pulsador, y otro cuando lo sueltes… si ese valor o diferencia millis() menos valor tomado de millis() al presionar es igual o mayor a 3000 mseg o sea 3 seg tendras tu situación y pones una salida en ALTO sino la pones en bajo.

Haber explico bien lo que quiero hacer para saber si lo puedo o no hacer. En un garaje muy largo voy a tener dos pulsos uno en la entrada y el otro en la salida y un semaforo fuera del porton. Entonces quiero que cuando entro y me toma el primer pulsador por mas de 3 segundos ininterrumpidos (un infrarojo) se ponga todo en pausa por 5 segundos para evitar que me tome el otro pulsador, pero cuando salgo (osea que el pulsador permanece mas de 3 segundos en alto) active un relay que va a prender una luz en la entrada del garaje(semaforo rojo) y que al pasar por la entrada y detectar que el pulsador estubo en alto por mas de 3 segundos espere 5 segundos mas y corte el relay de salida. Se entiende, por eso quiero saber como poder hacer para interpretar que el pulsador esta en alto por mas de 3 segundo lo interprete como un auto y si pasa un perro corriendo no lo tome (amenos que se quede 3 segundos interumpiendo el infrarojo)

Hola a todos los que leean esto (jaja) quiero hacer que dependiendo el tiempo que este pulsado un boton o pulsador por ejemplo 3 segundos ponga en alto una salida y conectarle un relay, pero desconozco como se hace.

En el post inicial no hablabas de todo esto! Y se debe a que no has leído las normas debidamente para comentar completa toda la idea como bien has hecho en el post #2 que debería haber sido tu comentario inicial. Ahora ya lo sabes y la próxima recuerda contar toda la idea.

Igualmente comienza con lo que te he sugerido porque no te voy a hacer el trabajo.

El código debes hacerlo tu, te guío por donde puedes comenzar a trabajar reconociendo el puslo y el tiempo de 3 seg. De ahi iremos avanzando.

ok perdon :sob:
Bueno entonces para reconocer el tiempo en el que esta accionado un boton debo usar BlinkWithoutDelay??
No es de bajo sinceramente en mi ciudad no hay cursos de arduino y no se me da mucho la programación me han regalado 2 mega y 2 nano y con eso estoy intentando aprender de youtube y el foro

entonces para reconocer el tiempo en el que esta accionado un boton debo usar BlinkWithoutDelay??

No. BlinkWithoutDelay te ensañará a usar millis() y aprender a usar millis() resolverá a la larga lo que tu quieres hacer. Te he dado como ya dije la guía para que tu hagas tu aprendizaje y vuelvas con dudas/consultas.

Te voy a poner un ejemplo que acabo de hacer en un minutito que tenía libre. Funciona perfectamente.
Pero no te va a servir para hacer copy and paste.

Si estas empezando con Arduino y no sabes las bases del lenguaje C o de cualquier otro ve empezando a ello.

Soy nuevo en este foro pero llevo años en otros tantos de programación. Es importante usar el foro para dudas específicas y el resto debe salir de ti, el copy and paste jamás ha llevado a nadie a desarrollar proyectos ni concluirlos. Te animo a ir leyendo porque tu proyecto va a necesitar más que este ejemplo.

Esto no mueve ni motores ni nada. En este código uso un timer y comparo el estado con una variable para saber si se estuvo presionado por 3 segundos o más o si ha pasado 3 segundos desde que se soltó y muestro el valor por pantalla.

Evidente para tu proyecto vas a necesitar muuuuucho más y no voy a desarrollarlo todo por amor al arte :art: :grin:

Está comentado línea a línea, con los enlaces de la librería y su correspondiente documentación, así que espero te sirva. De paso te adjunto una conexión con la protoboard porque es muy muy muy simple.

Un saludo y suerte moviendo esa puerta, pero suponiendo dimensiones y peso ve buscando info sobre motores y cómo obtener datos de la posición con arduino… ¿Quizás con un encoder? Tu imaginación, necesidades y economía dirán.

/* By Arduinito.
 * Ejemplo para el foro de arduino en español:
 * Mostrar como encendido tras 3 segundos o más de presión sobre un pulsador
 * Se cambia el estado a apagado tras 3 segundos sin presión
 */

#include <RBD_Timer.h>      //https://github.com/alextaujenis/RBD_Timer
RBD::Timer timer;           //http://robotsbigdata.com/docs-arduino-timer.html

const int inputPin = 2;     // pin digital que usaremos
boolean mode = false;       // guarda el valor tras pasar el tiempo establecido
 
void setup() {
  Serial.begin(9600);       //entrada analógica al ordenador a 9600 bits/seg
  pinMode(inputPin, INPUT); //establecemos el pin de entrada
  timer.setTimeout(3000);   //cada 3 segundos comprobamos el estado del pulsador
  timer.stop();             //el timer está detenido al empezar
}
 
void loop(){
  if(digitalRead(inputPin) != mode ){ //Si el valor del pulsador es diferente al estado guardado
    if(timer.isStopped()){             
      timer.restart();                //Reiniciamos el contador si ya han pasado esos 3 segundos  
    }
    mode = !mode;                     //Haya pasado ese tiempo o no, como ha variado el pulsador invertimos el valor
  }

  if(timer.isExpired()) {             //Cuando pasan 3 segundos
    timer.stop();                     //Paramos el contador que sólo se volverá a iniciar tras pasar 3 seg y encenderse nuevamente
    Serial.
      println( (mode) ? 
      "Encendido" : "Apagado" );      //Mostramos tras 3 segundos si el estado tuvo un cambio.
  }
}

Bueno haber que les parece.
Sepan comprender que soy herrero no programador y llevo 22 horas sin dormir y tratando que ande,
en este momento esta funcionando pulsador uno prende luz1 si el pulso es de mas de tres segundo y el pulsador 2 hace lo mismo, ahora tengo unas dudas.

Por ejemplo

se puede hacer que si presiono el pulsador 2 (salida) prende led 2(esto ya lo hace) y lo apague el pulsador 1 3 segundos despues (esto no lo hace)?

cuando oprimo el pulsador 1 (entrada) como hago para pausar totalmente la programación por un cierto tiempo y que no tome el pulsador 2 hasta que pase ese tiempo y que vuelva a escuchar otraves las entradas osea una especie de goto inicio??

int led1=7;
int led2=8;
int Entrada=2;
int Salida=3;


//PULSACION
boolean pulso_entrada;
boolean pulso_salida;
boolean P1_larga;
boolean P2_larga;
  
//temporizacion para pulsadores
      
unsigned long T_inicio_pulsacion=0;
unsigned long T_pulsado=0;
unsigned long T2_inicio_pulsacion=0;
unsigned long T2_pulsado=0;

//-------------------------------------------------------------------------------------------------------------------------------

  
void setup(){
 pinMode(led1,OUTPUT);
 pinMode(led2,OUTPUT);
 pinMode(Entrada,INPUT);
 pinMode(Salida,INPUT);


  Serial.begin(9600);  
}

  void loop(){
//--------------------------leo el estado de las entradas------------------------------------------------------------------------------------
  pulso_entrada = digitalRead(Entrada) ;
  pulso_salida = digitalRead(Salida) ;

//-------------------------------Lee Pulsador 1-----------------------------------------------------------------------------------------------
 
 if (pulso_entrada==HIGH && T_inicio_pulsacion==0){
 T_inicio_pulsacion=millis();//inicializo el tiempo e impido que vuelva a funcionara hasta T_actual valga cero,
   }
   
 //calculo de la duraccion de la pulsación (T_pulsado)T_inicio_pulsacion
  
  if (T_inicio_pulsacion!=0){
  if (millis()-T_inicio_pulsacion>= 2000){
  P1_larga=1;}
 
  if (millis()-T_inicio_pulsacion>= 500 && pulso_entrada==LOW) T_inicio_pulsacion=0;
  if (pulso_entrada==LOW&& millis()-T_inicio_pulsacion< 20)T_inicio_pulsacion=0;
 }
//----------------------------Activa Entrada---------------------------------------------------------------------------------------------------
 if (P1_larga==1){
   digitalWrite(led1, HIGH);
  P1_larga=0;
 delay(5000);
 digitalWrite(led1, LOW);
 } 
//----------------------------Lee pulsador 2---------------------------------------------------------------------------------------------------

if (pulso_salida==HIGH && T2_inicio_pulsacion==0){
 T2_inicio_pulsacion=millis();//inicializo el tiempo e impido que vuelva a funcionara hasta T_actual valga cero,
   }
   
 //calculo de la duraccion de la pulsación (T_pulsado)T_inicio_pulsacion
  
  if (T2_inicio_pulsacion!=0){
  if (millis()-T2_inicio_pulsacion>= 2000){
  P2_larga=1;}
 
  if (millis()-T2_inicio_pulsacion>= 500 && pulso_salida==LOW) T2_inicio_pulsacion=0;
  if (pulso_salida==LOW&& millis()-T2_inicio_pulsacion< 20)T2_inicio_pulsacion=0;
 }

//---------------------------Activa Salida-----------------------------------------------------------------------------------------------

 if (P2_larga==1){
   digitalWrite(led2, HIGH);
  P2_larga=0;
 delay(5000);
 digitalWrite(led2, LOW);
 }
}//fin de programa

Gracias por ayudar no ayudándome, me enseñan a aprender :smiley:

gerysan: Bueno haber que les parece. Sepan comprender que soy herrero no programador y llevo 22 horas sin dormir y tratando que ande, en este momento esta funcionando pulsador uno prende luz1 si el pulso es de mas de tres segundo y el pulsador 2 hace lo mismo, ahora tengo unas dudas.

Bueno, yo de hardware ni idea, y en ello ando :) El aprender no ocupa lugar (¿Sonó muy a programador?). Cuando se quiere hacer algo y hay que aprender o se ponen ganas o si no se puede nada.

gerysan: se puede hacer que si presiono el pulsador 2 (salida) prende led 2(esto ya lo hace) y lo apague el pulsador 1 3 segundos despues (esto no lo hace)?

Sí. Te puse el ejemplo de eso mismo justo arriba con el código comentado...

No te ofendas con esto, pero si el problema es que no sabes las bases de programar y estás probando cosas en plan copy & paste vas a seguir con dudas y aquí no te harán funcionar la puerta del garaje. Al menos mira las bases de la programación.

gerysan: cuando oprimo el pulsador 1 (entrada) como hago para pausar totalmente la programación por un cierto tiempo y que no tome el pulsador 2 hasta que pase ese tiempo y que vuelva a escuchar otraves las entradas osea una especie de goto inicio??

para pausar totalmente TODO tienes que usar la función delay(). Si no es TODO, te repito, lo que te dijeron, millis(), o me repito de nuevo, libería de timings.

gerysan: Gracias por ayudar no ayudándome, me enseñan a aprender :D

:o Yo pienso que si te han ayudado y te hemos dejado hasta código, el problema es que partes de 0 en programación y no estás mirando como funciona. Con lo que te han pasado ya tendrías que tener todo eso hecho... Es como si yo pregunto como hacer conexiones con condensadores, voltímetros, piezos, resistencias en vez de coger un libro y/o san google e ir aprendiendo. Me podrán decir algo en concreto, pero la gente no está en mi mente y hay muuuchas formas de hacer las cosas.