Proyecto de estados con 3 LEDs, un botón y tiempo.

Hola a todos.

Estoy involucrado en un proyecto compuesto por un Arduino, tres LEDs y un botón.

El objetivo del sistema es que por cada vez que el botón se presiona, un LED debe encenderse y apagarse después de 4000 ms. Entonces al presionar una vez se enciende el primero, dos veces el segundo y finalmente al presionar tres veces el botón, el tercer led debe encenderse. Cada led debe apagarse después de 4000 ms desde que se encendió.

Cada vez que presiona el botón, tomo el tiempo transcurrido, lo almaceno en una variable y luego le digo a la tarjeta que después de 4000 ms, debe apagar el LED pero no me funciona. Tal vez no estoy comparando el tiempo adecuadamente, pero hasta ahora no me puedo imaginar otra forma de hacerlo.

Cualquier tipo de ayuda es bienvenida. Gracias de antemano!

Abajo está el esquema y el código. Además, pueden ver el proyecto en Autodesk Circuits.

int buttonPIN=2;
int L1=6;
int L2=5;
int L3=4;

int buttonPushCounter = 0;   
int buttonState = 0;         
int lastButtonState = 0;


unsigned long t1;
unsigned long t2;
unsigned long t3;


void setup()  
{
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(buttonPIN, INPUT);
  
  Serial.begin(9600);
}

void one()
{
  digitalWrite(L1,1);
}

void two()
{
  digitalWrite(L2,1);
}

void three()
{
  digitalWrite(L3,1);
}


void loop() 
{
  buttonState = digitalRead(buttonPIN);
  unsigned long runtime=millis();
  Serial.println(runtime);
  	  
  if (buttonState != lastButtonState) 
  {
    if (buttonState == HIGH) 
    {
      buttonPushCounter++;
      if(buttonPushCounter == 4)
      { 
        buttonPushCounter = 1;
      }
      
    } 
    else 
    {
      
    }
  }
  
  
  lastButtonState = buttonState;
  
   switch(buttonPushCounter)
  {
    case 1:
      one();
      t1=runtime;
       if (t1>=t1+4000)
     {
       digitalWrite(L1,0);
     }
      break;
    case 2:
      two();
      t2=runtime;
       if (t2>=t2+4000)
     {
       digitalWrite(L2,0);
     }
      break;
    case 3:
      three();
      t3=runtime;
       if (t3>=t3+4000)
     {
       digitalWrite(L3,0);
     }
      break;     
   }
}

no lo he comprobado pues ahora no tengo el proteus pero creo que esta correcto. problema de mi codigo, si pulsas 6 veces seguidas se va a encender mas de 4s.

pregunta:¿ por alguna razón usas la variable runtime?

int buttonPIN=2;

int L1=6;
int L2=5;
int L3=4;

int buttonPushCounter = 0;   
int buttonState = 0;         
int lastButtonState = 0;


unsigned long t1=0;
unsigned long t2=0;
unsigned long t3=0;
unsigned long TON = 4000;


void setup()  
{
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(buttonPIN, INPUT);

  Serial.begin(9600);
}



void loop() 
{
  buttonState = digitalRead(buttonPIN);
  unsigned long runtime=millis();
  Serial.println(runtime);

  if (buttonState == 1 && lastButtonState==0) 
  {
    buttonPushCounter++;
    switch(buttonPushCounter)
    {
    case 1:
      digitalWrite(L1,1);
      t1=runtime;
      break;

    case 2:
      digitalWrite(L2,1);
      t2=runtime;
      break;

    case 3:
      digitalWrite(L3,1);
      t3=runtime;
      buttonPushCounter=0;
      break;
    }
  }

  lastButtonState = buttonState;

  if (runtime-t1>=TON){          
    digitalWrite(L1,0);
  }
  if (runtime-t2>=TON){          
    digitalWrite(L2,0);
  }
  if (runtime-t3>=TON){          
    digitalWrite(L3,0);
  }
}

Hola. Tus correcciones han funcionado perfectamente. En cuanto a la variable runtime (en realidad quise decir uptime) creo que después de tu comentario es redundante, he podido usar millis() para comparar los tiempos.

Mil gracias por la ayuda. El código funciona y entendí las modificaciones.

Lo muevo a Software