Led apaga y enciende en 10 segundos sin usar delay

Hola soy un novato y me gustaría poder resolver esta situación sin tener que recurrir a los delay() (con delay() funciona perfecto, pero quisiera poder hacer esto con millis) , la cuestión es que el switch comienza en estado ON y el led en estado OFF y al cabo de 5 segundos el led pase a estado ON, y cuando el switch pase a estado OFF el led pase a estado OFF en 10 segundos. ( escribí esto simple después puedo darle las etiquetas y el formato adecuado para una buena practica)
Agradezco su ayuda y acepto todas las sugerencias, gracias.

int estado;
void setup() {
  pinMode(5, OUTPUT); 
}
void loop() {
  estado = digitalRead(7); // aqui va un switch simula el on/off
  if (estado == 1) {
    delay(2000); 
    digitalWrite(5, HIGH);
  } else {
    if (estado == 0) {
      delay(2000); 
      digitalWrite(5, LOW);
    }
  }
}
#define pinLed 5

void setup(){
  pinMode(pinLed, OUTPUT);
}

void loop(){
   static bool estado;
   static unsigned int intervalo = 2000;
   static unsigned long tiempo;
  
   if(millis() - tiempo >= intervalo ){
      estado = !estado;
      tiempo = millis();
   } 
   digitalWrite(pinLed, estado); 
}

Ah, disculpa, ya ví que quieres que el led esté iluminado 2 seg y se apague 10 seg . Ok.
Igual ambos ejemplos te pueden servir para entender millis(). Cualquier duda pregunta.

#define pinLed 5

void setup(){
  pinMode(pinLed, OUTPUT);
}

void loop(){
   static bool estado;
   static unsigned int intervalo = 2000;
   static unsigned long tiempo;
  
   if(millis() - tiempo >= intervalo || tiempo == 0 ){
      estado = !estado;
      intervalo = (intervalo == 2000 && tiempo != 0) ? 10000 : 2000;
      tiempo = millis();
   } 
   digitalWrite(pinLed, estado); 
}
1 Like

Ante todo gracias por las respuestas, pero mi pregunta es mas o menos como cuando abres una "puerta de casa" y te da por ejemplo 10 segundos para salir cierras la puerta y se enciende un led, y cuando quiera entrar abres la puerta se apaga el led y en 10 segundos el led se enciende definitivamente.
Agradezco toda la ayuda.

Puedes hacer algo así

const byte PIN_SW = 7;
const byte PIN_LED = 5;
byte estado;
byte anterior;
bool disparo = false;
unsigned long pausa;
unsigned long tiempo;

void setup() {
  pinMode(PIN_SW, INPUT);
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);
}
void loop() {
  estado = digitalRead(PIN_SW); // aqui va un switch simula el on/off
  if (estado != anterior) {
    tiempo = millis();
    disparo = true;
    anterior = estado;
    if (estado) {  // estado == 1 o HIGH
      pausa = 5000; // 5 seg
    } 
    else {  // estado == 0 o LOW
      pausa = 10000; // 10 seg
    }
  }
  if (disparo) {  // disparo == true
    if (millis() - tiempo >= pausa) {
      digitalWrite(PIN_LED, estado);
      disparo = false;
    }
  }
}

Saludos

Gracias compañeros es mas o menos lo que andaba buscando, modifique algunas cosas simples y quedo como quería, hasta pronto.

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