Tiempos en diferentes secuencias de leds

Hola

Estoy haciendo un trabajo de luces para decoración de las fiestas navideñas, es como las tiras de leds que se ponen en los árboles, pero quiero colocarlo en sitios concretos. Puede ser que sea muy sencillo, pero no logro sacarlo. He consultado documentación, ejemplos, etc.

De momento son tres secuencias diferentes, con una duración de 1 minuto cada una. Intento que cuando acabe la primera secuencia siga a la siguiente, y así hasta la última y comenzar de nuevo

El último sketch es el siguiente:

int led1=3;
int led2=4;
int led3=5;
int led4=6;
int led5=7;

unsigned long time=10000;

void setup() {
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT);  
}

void loop() {
  
  if(time<=millis) {
    digitalWrite(led1,HIGH);
    delay(1000);
    digitalWrite(led1,LOW);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led2,LOW);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led3,LOW);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led4,LOW);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led5,LOW);
    delay(1000);
  }
  
  if(time<=millis) {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,HIGH);
    digitalWrite(led3,HIGH);
    digitalWrite(led4,HIGH);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    digitalWrite(led5,LOW);
  }

  if(time<=millis) {
    digitalWrite(led1,HIGH);
    delay(1000);
    digitalWrite(led2,HIGH);
    delay(1000);
    digitalWrite(led1,LOW);
    digitalWrite(led3,HIGH);
    delay(1000);
    digitalWrite(led2,LOW);
    digitalWrite(led4,HIGH);
    delay(1000);
    digitalWrite(led3,LOW);
    digitalWrite(led5,HIGH);
    delay(1000);
    digitalWrite(led4,LOW);
    delay(1000);
    digitalWrite(led5,LOW);
    delay(1000);
  }

}

¿Donde esta el fallo?

Gracias

Hola Pemole,

Lo correcto sería utilizar una estructura switch en el loop en el que defines los 3 modos posibles. Creas un timer que cada minuto llame a una función que cambie al siguiente modo.

Si no sabes como programarlo dímelo y te paso el código.

Hola villab85

Gracias por la información

Intentaré sacarlo así voy aprendiendo

Si no lo consigo lo comentaré

Hi,
Para mi te sugiero que porque no quitas el if y pone un delay entre secuencia y secuencia y deja que todo tome su cursoo. Tambien puedes dejarlo sin el delay.

Hola

No consigo sacarlo, he probado varias opciones incluyendo librerías "Timer"

int led1=3;
int led2=4;
int led3=5;
int led4=6;
int led5=7;

unsigned long timer=1000;

void setup() {
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT);  
}

void loop() {
  
  switch (timer) {

    case 0:
      digitalWrite(led1,HIGH);
      delay(1000);
      digitalWrite(led1,LOW);
      digitalWrite(led2,HIGH);
      delay(1000);
      digitalWrite(led2,LOW);
      digitalWrite(led3,HIGH);
      delay(1000);
      digitalWrite(led3,LOW);
      digitalWrite(led4,HIGH);
      delay(1000);
      digitalWrite(led4,LOW);
      digitalWrite(led5,HIGH);
      delay(1000);
      digitalWrite(led5,LOW);
      delay(1000);
      break;

    case 1:
      digitalWrite(led1,HIGH);
      digitalWrite(led2,HIGH);
      digitalWrite(led3,HIGH);
      digitalWrite(led4,HIGH);
      digitalWrite(led5,HIGH);
      delay(1000);
      digitalWrite(led1,LOW);
      digitalWrite(led2,LOW);
      digitalWrite(led3,LOW);
      digitalWrite(led4,LOW);
      digitalWrite(led5,LOW);
      delay(1000);
      break;
    
    case 2:
      digitalWrite(led1,HIGH);
      delay(1000);
      digitalWrite(led2,HIGH);
      delay(1000);
      digitalWrite(led1,LOW);
      digitalWrite(led3,HIGH);
      delay(1000);
      digitalWrite(led2,LOW);
      digitalWrite(led4,HIGH);
      delay(1000);
      digitalWrite(led3,LOW);
      digitalWrite(led5,HIGH);
      delay(1000);
      digitalWrite(led4,LOW);
      delay(1000);
      digitalWrite(led5,LOW);
      delay(1000);
      break;

  }

}

Con el delay que propone tauro0221 no lo tengo claro de como hacerlo

Hi,
Yo creo wuer el problema es que estas usando el timer para seleccionar las secuencias y nunca vaz hacerlo porque switch esta buscando un numero de 0 a dos. Adjunto el programaficado para que tengas una idea como se hacce. Correlo para ver si te trabaja.Tambien cambie el delay por una funcion que usa el millis(). Para llamar la funcion solamente anadele el delay que quires cuando llamas la funcion.

[code]
int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
long time;
unsigned long timer = 1000;

void setup() {
  Serial.begin(115200);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}
//***********************************************
void loop() {

  for (byte cnt = 0 ; cnt <= 3; cnt++) {
    switch (cnt) {
      case 0:
        digitalWrite(led1, HIGH);
        delay(1000);
        digitalWrite(led1, LOW);
        digitalWrite(led2, HIGH);
        delay(1000);
        digitalWrite(led2, LOW);
        digitalWrite(led3, HIGH);
        delay(1000);
        digitalWrite(led3, LOW);
        digitalWrite(led4, HIGH);
        delay(1000);
        digitalWrite(led4, LOW);
        digitalWrite(led5, HIGH);
        delay(1000);
        digitalWrite(led5, LOW);
        delay(1000);
        Serial.println("secuencia 1");
        break;

      case 1:
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        digitalWrite(led5, HIGH);
        time_delay(1000);
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        digitalWrite(led5, LOW);
        time_delay(1000);
        Serial.println("secuencia 2");
        break;

      case 2:
        digitalWrite(led1, HIGH);
        time_delay(1000);
        digitalWrite(led2, HIGH);
        time_delay(1000);
        digitalWrite(led1, LOW);
        digitalWrite(led3, HIGH);
        time_delay(1000);
        digitalWrite(led2, LOW);
        digitalWrite(led4, HIGH);
        time_delay(1000);
        digitalWrite(led3, LOW);
        digitalWrite(led5, HIGH);
        time_delay(1000);
        digitalWrite(led4, LOW);
        time_delay(1000);
        digitalWrite(led5, LOW);
        time_delay(1000);
        Serial.println("secuencia 3");
        break;

    }
  }
}
//************************************************
void time_delay(long del_time){
  time =millis();
do{
//do nothing
  
}while(millis()<=time+del_time);

Serial.print("time delay = ");
Serial.println(millis()- time );

  
}
//*************************************************

[/code]

Gracias tauro0221
Es lo que buscaba, ahora voy a estudiarlo para comprenderlo, y modificar para que cada secuencia dure un minuto

Hi,
Otra cosa que puedes hacer es de hacer los LEDS en forma de funcion y lass llamas individuales desde el Loop.Otra sugerencia.

Adjunto de un ejemplo.

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
long time;
unsigned long timer = 1000;

void setup() {
  Serial.begin(115200);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}
//***********************************************
void loop() {
sec_0();
sec_1();
sec_2();
}
//************************************************
void time_delay(long del_time) {
  time = millis();
  do {
    //do nothing
  } while (millis() <= time + del_time);
  Serial.print("time delay = ");
  Serial.println(millis() - time );
}
//*************************************************
void sec_0() {
  digitalWrite(led1, HIGH);
  time_delay(1000);
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
 time_delay(1000);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  time_delay(1000);
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  time_delay(1000);
  digitalWrite(led4, LOW);
  digitalWrite(led5, HIGH);
time_delay(1000);
  digitalWrite(led5, LOW);
 time_delay(1000);
 Serial.println("secuencia 0");
}

//***************************************************
void sec_1(){
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
time_delay(1000);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
time_delay(1000);
Serial.println("secuencia 1");
}
//***************************************************
void sec_2() {

  digitalWrite(led1, HIGH);
  time_delay(1000);
  digitalWrite(led2, HIGH);
  time_delay(1000);
  digitalWrite(led1, LOW);
  digitalWrite(led3, HIGH);
  time_delay(1000);
  digitalWrite(led2, LOW);
  digitalWrite(led4, HIGH);
  time_delay(1000);
  digitalWrite(led3, LOW);
  digitalWrite(led5, HIGH);
  time_delay(1000);
  digitalWrite(led4, LOW);
  time_delay(1000);
  digitalWrite(led5, LOW);
  time_delay(1000);
  Serial.println("secuencia 2");
}
//****************************************************

Hola tauro0221

Los dos códigos funcionan para que se repita solo una vez cada secuencia

He añadido diversas formas para que la secuencias se repitan un minuto y pase a la siguiente

Pero sigue funcionando repitiendo solo una vez

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
long time;
unsigned long timer = 60000;

void setup() {
  Serial.begin(115200);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT); 
}

void loop() {
  for (byte cnt = 0 ; cnt <= 3; cnt++) {
    switch (cnt) {
      case 0: {
        if(time <= millis) {
          digitalWrite(led1,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led2,HIGH);
          delay(1000);
          digitalWrite(led2,LOW);
          digitalWrite(led3,HIGH);
          delay(1000);
          digitalWrite(led3,LOW);
          digitalWrite(led4,HIGH);
          delay(1000);
          digitalWrite(led4,LOW);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.println("secuencia 1");
          break;
        }
      }
      case 1: {
        if(time <= millis) {
          digitalWrite(led1,HIGH);
          digitalWrite(led2,HIGH);
          digitalWrite(led3,HIGH);
          digitalWrite(led4,HIGH);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led2,LOW);
          digitalWrite(led3,LOW);
          digitalWrite(led4,LOW);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.println("secuencia 2");
          break;
        }
      }
      case 2: {
        if(time <= millis) {
          digitalWrite(led1,HIGH);
          delay(1000);
          digitalWrite(led2,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led3,HIGH);
          delay(1000);
          digitalWrite(led2,LOW);
          digitalWrite(led4,HIGH);
          delay(1000);
          digitalWrite(led3,LOW);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led4,LOW);
          delay(1000);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.println("secuencia 3");
          break;
        }
      }
    }
  }
}

void time_delay(long del_time) {
  time = millis();
  do{ 
  }while(millis() <= time + del_time);
  Serial.print("time delay = ");
  Serial.println(millis() - time ); 
}

Hi,
Adjunto el sketch modificado para que corra el primer leds por un minuto. Tratalo para ver si es lo que tu quires hacer. Fijate como yo hice el primero y anadeselo a los demas leds para que vayas aprendiedo hacer loa do/whiles ya que estos se usan muchos.

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
unsigned long timer = 60000;
unsigned long time;
void setup() {
  Serial.begin(115200);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
}

void loop() {
  for (byte cnt = 0 ; cnt <= 3; cnt++) {
    switch (cnt) {
      case 0: {
          time = millis();
          do {
            digitalWrite(led1, HIGH);
            delay(1000);
            digitalWrite(led1, LOW);
            digitalWrite(led2, HIGH);
            delay(1000);
            digitalWrite(led2, LOW);
            digitalWrite(led3, HIGH);
            delay(1000);
            digitalWrite(led3, LOW);
            digitalWrite(led4, HIGH);
            delay(1000);
            digitalWrite(led4, LOW);
            digitalWrite(led5, HIGH);
            delay(1000);
            digitalWrite(led5, LOW);
            delay(1000);
            Serial.print("secuencia 1");
            Serial.println( (timer + time)-millis()); 
          } while (millis() < timer + time);
          break;
        }
    
  case 1: {
      if (time <= millis) {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        digitalWrite(led5, HIGH);
        delay(1000);
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        digitalWrite(led5, LOW);
        delay(1000);
        Serial.println("secuencia 2");
        break;
      }
    }
  case 2: {
      if (time <= millis) {
        digitalWrite(led1, HIGH);
        delay(1000);
        digitalWrite(led2, HIGH);
        delay(1000);
        digitalWrite(led1, LOW);
        digitalWrite(led3, HIGH);
        delay(1000);
        digitalWrite(led2, LOW);
        digitalWrite(led4, HIGH);
        delay(1000);
        digitalWrite(led3, LOW);
        digitalWrite(led5, HIGH);
        delay(1000);
        digitalWrite(led4, LOW);
        delay(1000);
        digitalWrite(led5, LOW);
        delay(1000);
        Serial.println("secuencia 3");
        break;
      }
    }
  }
}
}

void time_delay(long del_time) {
  time = millis();
  do {
  } while (millis() <= time + del_time);
  Serial.print("time delay = ");
  Serial.println(millis() - time );
}

Hola tauro0221

Es lo que buscaba, y los he agregado a las otras secuencias

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
unsigned long timer = 60000;
unsigned long time;

void setup() {
  Serial.begin(115200);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT); 
}

void loop() {
  for (byte cnt = 0 ; cnt <= 3; cnt++) {
    switch (cnt) {
      case 0: {
        time = millis();
        do {
          digitalWrite(led1,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led2,HIGH);
          delay(1000);
          digitalWrite(led2,LOW);
          digitalWrite(led3,HIGH);
          delay(1000);
          digitalWrite(led3,LOW);
          digitalWrite(led4,HIGH);
          delay(1000);
          digitalWrite(led4,LOW);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.print("secuencia 1");
          Serial.println( (timer + time) - millis() );
        } while (millis() < timer + time);
        break;
      }
      case 1: {
        time = millis();
        do {
          digitalWrite(led1,HIGH);
          digitalWrite(led2,HIGH);
          digitalWrite(led3,HIGH);
          digitalWrite(led4,HIGH);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led2,LOW);
          digitalWrite(led3,LOW);
          digitalWrite(led4,LOW);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.print("secuencia 2");
          Serial.println( (timer + time) - millis() );
        } while (millis() < timer + time);
        break;
      }
      case 2: {
        time = millis();
        do {
          digitalWrite(led1,HIGH);
          delay(1000);
          digitalWrite(led2,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led3,HIGH);
          delay(1000);
          digitalWrite(led2,LOW);
          digitalWrite(led4,HIGH);
          delay(1000);
          digitalWrite(led3,LOW);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led4,LOW);
          delay(1000);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.print("secuencia 3");
          Serial.println( (timer + time) - millis() );
        } while (millis() < timer + time);
        break;
      }
    }
  }
}

void time_delay(long del_time) {
  time = millis();
  do{ 
  }while(millis() <= time + del_time);
  Serial.print("time delay = ");
  Serial.println(millis() - time ); 
}

Iré ampliando más secuencias para ir aprendiendo

Gracias

que sentido tiene una secuencia como esta?

do {
          digitalWrite(led1,HIGH);
          delay(1000);
          digitalWrite(led1,LOW);
          digitalWrite(led2,HIGH);
          delay(1000);
          digitalWrite(led2,LOW);
          digitalWrite(led3,HIGH);
          delay(1000);
          digitalWrite(led3,LOW);
          digitalWrite(led4,HIGH);
          delay(1000);
          digitalWrite(led4,LOW);
          digitalWrite(led5,HIGH);
          delay(1000);
          digitalWrite(led5,LOW);
          delay(1000);
          Serial.print("secuencia 1");
          Serial.println( (timer + time) - millis() );
        } while (millis() < timer + time);

Esta secuencia consume 6 segundos y en cada delay no hace nada, lo que mezclado con millis() no digo que no funcione pero no me resulta coherente.
Si estas comenzando a programar olvida el uso del delay y aprende a hacerlo con máquinas de estados. Es mas complicado al principio pero verás que tu código será veloz y podrías por ejemplo responder en forma instantánea a llamados por WIFI/RED, BT o Serial.
Esta es la modificación a la primer secuencia, las otras son similares.

int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int led5 = 7;
unsigned long timer = 60000;
unsigned long time;
byte estado = 0;

void setup() {
  Serial.begin(115200);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT);
}

void loop() {
  for (byte cnt = 0 ; cnt <= 3; cnt++) {
    switch (cnt) {
		case 0: time = millis();
				switch(estado) {
					case 0: digitalWrite(led1,HIGH);
							estado = 1;
							time1 = millis();
							break;
					case 1: if (millis - time1 > 1000UL ) {
						        digitalWrite(led1,LOW);
								digitalWrite(led2,HIGH);
								estado = 2;
								time1 = millis();
							}
							break;
					case 2: if (millis - time1 > 1000UL ) {
						        digitalWrite(led2,LOW);
								digitalWrite(led3,HIGH);
								estado = 3;
								time1 = millis();
							}
							break;
					case 3: if (millis - time1 > 1000UL ) {
						        digitalWrite(led3,LOW);
								digitalWrite(led4,HIGH);
								estado = 4;
								time1 = millis();
							}
							break;
					case 4: if (millis - time1 > 1000UL ) {
						        digitalWrite(led4,LOW);
								digitalWrite(led5,HIGH);
								estado = 5;
								time1 = millis();
							}
							break;
					case 5: if (millis - time1 > 1000UL ) {
								digitalWrite(led5,LOW);
								estado = 6;
								time1 = millis();
							}
							break;
					case 6: if (millis - time1 > 1000UL ) {
								Serial.print("secuencia 1");
								estado = 0;					// con lo que vuelve a comenzar.
							}
							break;
							          
				}
			Serial.println( (timer + time) - millis() );  // ten cuidado con esta linea porque ahora se mostrará muy seguido.
        } while (millis() < timer + time);
        break;
      }
      case 1: { // aca continúa lo que corresponde a la 2da secuencia

Hola surbyte

Gracias por la información, lo pondré en práctica para ir aprendiendo