encender 2 led con pulsadores independientes con la funcion millis

debo encender un led con un pulsador sin usar delay por que al mismo tiempo debo encender otro led con otro pulsador, luego estos se apaguen en diferente tiempo.

si uso delay no puedo encender los led al mismo tiempo, debo esperar que termine el delay para encender el otro led

int s1=4;
int led=13;
int s2=5;
int led2=8;


void setup() {
pinMode(s1, INPUT);
pinMode(led, OUTPUT);
pinMode(s2, INPUT);
pinMode(led2, OUTPUT);
digitalWrite(led,LOW);
digitalWrite(led2,LOW);
}
void one()
{
while(digitalRead(s1)==HIGH);
delay(1000);
digitalWrite(led,HIGH);
delay(4000);
digitalWrite(led,LOW);
while(digitalRead(s1)==LOW);  
}
void two()
{
while(digitalRead(s2)==HIGH);
delay(1000);
digitalWrite(led2,HIGH);
delay(2000);
digitalWrite(led2,LOW);
while(digitalRead(s2)==LOW);

}




void loop() {


one();


two();


}

Por favor lee las Normas del foro y edita tu post#1 usando etiquetas para código.

Ve a documentación => Indices de temas tutoriales y lee sobre millis(). Hay varios tutoriales al respecto
Esa es la solución a tu problema.

hola como estan aqui dejo el codigo que consegui

encontre este codigo pero solo me permite un time de 30segundos y yo necesito un minuto y medio por cada pulsador y led.

int ledPin[4]={
13,8};
int inSelector[4]= {
 4,5};

int timer1;
int timer2;
unsigned long tiempo;
unsigned long tiempos[4];
int espera[4]= {
40000,40000};
boolean ejecutando[4]= {
false,false};

void setup() {
for (int i = 0; i < 2; i++){
  pinMode(ledPin[i],OUTPUT);
  pinMode(inSelector[i],INPUT);
  digitalWrite(inSelector[i],LOW);
 
timer1=40000;
timer2=40000;

}
}
void loop() {
for (int i= 0; i < 2; i++){
  if(ejecutando[i]==false){    
    if (digitalRead(inSelector[i])==0){
      switch (digitalRead(inSelector[i])){
      case LOW:
        espera[i]=timer2;
        break;
      case HIGH:
        espera[i]=timer1;          
        break;
      }
     tiempos[i]=millis();
    }
    else if (digitalRead(inSelector[i])==1){
      espera[i]=0;
    }
  }

}

if ((millis()-tiempos[0]) < espera[0]){
  ejecutando[0]= true;
  digitalWrite(ledPin[0],HIGH);
}
else {
  ejecutando[0]=false;
  digitalWrite(ledPin[0],LOW);
}

if ((millis()-tiempos[1]) < espera[1]){
  ejecutando[1]= true;    
  digitalWrite(ledPin[1],HIGH);
}
else {  
  ejecutando[1]=false;
  digitalWrite(ledPin[1],LOW);
}


}
bool pul1=true;
int bot=5;
int rel=13;
unsigned long start1 =0;
int value1=0;
void setup(){
  pinMode(5, INPUT);
  pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
void loop(){
  if(value1==LOW){
    pul1=true;
    delay(50);
    digitalWrite(13,LOW);
    start1 = millis();
  }
  if (pul1 && (millis()-start1> 2000UL)) {//4 min
       
       digitalWrite(13, HIGH);
       pul1 = false;     
                             
  }
}

con este código solucione mi problema de ahy se puede asignar varias entradas y salidas según la necesidad, en mi caso he insertado 5 entradas y 5 salidas, espero este código le sirva a alguien

1 Like

Algunas correcciones para evitar overflow o fallos cuando arduino lleve mas de 32768 mseg porque has definido algunos intervalos como interos y eso implica que a los 32.768 segundos estarás en problemas.

Todo lo que use milllils() debe configurarse como unsigned long. Recuérdalo!!

int ledPin[4]     = {13, 8};
int inSelector[4] = { 4, 5};
unsigned long timer1;
unsigned long timer2;
unsigned long tiempos[4];
int espera[4]         = {40000,40000};
boolean ejecutando[4] = {false,false};

void setup() {
  for (int i = 0; i < 2; i++){
      pinMode(ledPin[i],OUTPUT);
      pinMode(inSelector[i],INPUT);
      digitalWrite(inSelector[i],LOW);
  }
  timer1 = 40000;
  timer2 = 40000;
}
void loop() {
  for (int i= 0; i < 2; i++){
      if (ejecutando[i]==false){   
          if (digitalRead(inSelector[i])==0){
              switch (digitalRead(inSelector[i])){
                case LOW:
                  espera[i] = timer2;
                  break;
                case HIGH:
                  espera[i] = timer1;         
                  break;
              }
              tiempos[i] = millis();
          }
          else if (digitalRead(inSelector[i])==1){
              espera[i] = 0;
          }
      }
  }

  if ((millis()-tiempos[0]) < espera[0]){
      ejecutando[0] = true;
      digitalWrite(ledPin[0],HIGH);
  }
  else {
      ejecutando[0] =false;
      digitalWrite(ledPin[0],LOW);
  }

  if ((millis()-tiempos[1]) < espera[1]){
      ejecutando[1] = true;   
      digitalWrite(ledPin[1],HIGH);
  }
  else { 
      ejecutando[1] =false;
      digitalWrite(ledPin[1],LOW);
  }
}

El resto del código puede mejorarse pero si te funciona, nada que decir entonces.