Temporizador con millis()

Tengo una idea pero no se como hacer el programa, quiero que se encienda un led al presionar 2 pulsadores, algo asi como una compuerta AND, pero que el led solo encienda si los pulsadores son presionados en en un intervalo de 250ms, es decir que en el momento que se presione el primer pulsador se active un "temporizador" y cuando este supere los 250ms el segundo pulsador ya no encienda el led, en pocas palabras los pulsadores deben ser presionados casi a la misma vez para que encienda el led.

Ojala alguien me pueda ayudar salu2.

El único problema es que no desarrollamos códigos por ti, te ayudamos con los errores que pudieras tener.

En la sección Documentación tienes muy buenos tutoriales sobre millis() y sobre lectura de pulsadores.

Saludos

Eh echo este código, pero aun no lo consigo hacer funcionar, el problema que tiene es que al presionar el botón se actualiza la variable "tiempoa" durante todo el tiempo que este pulsado, y esto me genera que siempre detecte que el segundo botón fue presionado en menos de 250ms, no se como hacer para que al presionar el botón guarde un solo valor hasta que el botón vuelva a ser presionado.

Alguna idea?

const int LED=2;
const int boton=3;
const int boton2=4;
int estadob = 0;
int estadob2 =0;
unsigned long tiempoa = 0;
unsigned long tiempob = 0;



void setup() {
  
  pinMode(LED, OUTPUT);
  pinMode(boton, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);

}

void loop() {
  estadob = digitalRead(boton);
  estadob2 = digitalRead(boton2);

  if(estadob == LOW){
    tiempoa = millis(); 
  }
  
  tiempob = millis()-tiempoa;
  if(estadob == LOW && estadob2 == LOW && tiempob <= 250){
    digitalWrite(LED, HIGH);
    tiempoa = millis();
  }
  
  
 }

A ver si esto trabaja como quieres?

const int LED     = 2;
const int boton1   = 3;
const int boton2  = 4;
int estado1, estado1Ant = 0;
int estado2, estado2Ant = 0;
unsigned long tiempoa;
unsigned long tiempob;
unsigned long tiempoled;
bool flag = false;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);

}

void loop() {
  estado1 = digitalRead(boton1);
  estado2 = digitalRead(boton2);

  if (!estado1 & estado1Ant){
      tiempoa = millis(); 
  }
  estado1Ant = estado1;
  
  if (!estado2 & estado2Ant){
      tiempob = millis(); 
  }
  estado2Ant = estado2;

  if (tiempoa - tiempob <= 250UL){
      flag = true;
      tiempoled = millis();
  }

  if (flag) 
      digitalWrite(LED, HIGH);

  if (millis()-tiempoled > 1000UL) {
      digitalWrite(LED, LOW);
      flag = false;
  }
 }

Lo he resuelto, tu programa me ha servido de mucha ayuda para resolver el error que tenia. Muchas gracias

Saludos.

const int LED=2;
const int boton=3;
const int boton2=4;
int estadob = 0;
int estadob2 =0;
unsigned long tiempoa = 0;
unsigned long tiempob = 0;
byte aux = 0;



void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(boton, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);

}

void loop() {
  estadob = digitalRead(boton);
  estadob2 = digitalRead(boton2);

  if(estadob == LOW && aux == 0){
    aux = 1;
    tiempoa = millis(); 
  }
  
  tiempob = millis()-tiempoa;
  if(estadob == LOW && estadob2 == LOW && tiempob <= 1000){
    digitalWrite(LED, HIGH);
    tiempoa = millis();

  }else{
    digitalWrite(LED, LOW);
  }



if(estadob2 == LOW && aux == 0){
    aux = 1;
    tiempoa = millis(); 
  }
  
  tiempob = millis()-tiempoa;
  if(estadob == LOW && estadob2 == LOW && tiempob <= 1000){
    digitalWrite(LED, HIGH);
    tiempoa = millis();

  }else{
    digitalWrite(LED, LOW);
  }


if(estadob == HIGH && aux == 1 && estadob2 == HIGH){
  aux = 0;
}


  
  
 }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.