Problemas con leds [SOLUCIONADO]

Buenos días, primeramente disculpad si esto ya se ha tratado, pero he estado buscando información y no he conseguido aclararme con temas similares…

Es la primera vez que programo cosas con arduino, y la verdad, son cosas muy sencillas las que quiero hacer (o al menos eso creo…), pero en mi vida he programado en este lenguaje y voy bastante perdido… Todo esto es para hacer maquetas de vehículos de emergencias (para controlar las luces). El vehículo que estoy haciendo ahora cuenta con dos rotativos (las luces típicas que giran) que en este caso lo que hacen es encenderse y apagarse progresivamente a destiempo uno del otro y 6 luces led que parpadean (que van en dos grupos de 3: el primer grupo parpadea 4 veces mientras el otro está encendido a muy baja potencia, y luego el segundo parpadea 4 veces mientras el primero está encendido a muy baja potencia).

Hasta ahora, buscando por el foro y muchas otros sitios he conseguido lo siguiente:

Para los rotativos he conseguido este código:

int led = 9;
int i;
 int led2 = 10;
void setup() {                
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}
 
void loop() {

  for(i=0; i<256; i++){ 
    analogWrite(led,i);
    analogWrite(led2,-i);
    delay(1);
  }

  for(i=255; i>-1; i--){
    analogWrite(led,i);
    analogWrite(led2,-i);
    delay(1);
  
  }
}

Lo he modificado un poco para que el delay sea como me conviene y que vayan a la inversa uno del otro.

Por otro lado, para los grupos de led, he escrito lo siguiente:

void setup() {       
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}
 
void loop() {


 digitalWrite(5, HIGH);
 delay(50);
 digitalWrite(5, LOW);
 delay(50);
 digitalWrite(5, HIGH);
 delay(50);
 digitalWrite(5, LOW);
 delay(50);
 digitalWrite(5, HIGH);
 delay(50);
 digitalWrite(5, LOW);
 delay(50);
 digitalWrite(5, HIGH);
 delay(50);
 digitalWrite(5, LOW);
 delay(50);
 digitalWrite(6, HIGH);
 delay(50);
 digitalWrite(6, LOW);
 delay(50);
 digitalWrite(6, HIGH);
 delay(50);
 digitalWrite(6, LOW);
 delay(50);
 digitalWrite(6, HIGH);
 delay(50);
 digitalWrite(6, LOW);
 delay(50);
 digitalWrite(6, HIGH);
 delay(50);
 digitalWrite(6, LOW);
 delay(50);
  
 }

Hasta aquí todo bien, pero ahora me surgen los siguiente problemas:

-No se cómo hacer que los leds que voy a conectar a los pines 5 y 6 se mantengan siempre encendidos a muy baja potencia (que hagan muy poca luz), salvo cuando han de parpadear
-Cuando programo los leds junto a los rotativos, los rotativos hacen una secuencia, se apagan, empieza la secuencia de los leds, se apagan, y vuelven los rotativos, y así infinitamente… cuando lo que quiero es que los rotativos se enciendan y apaguen independientemente del parpadeo de los leds

En general, el problema que tengo es que no se bien como hacer que cada led haga distintas secuencias, ni como hacer que las distintas secuencias coexistan unas independientemente de las otras.

Espero haberme explicado, si no es así, decidmelo e intentare explicarme mejor.

Muchas gracias por vuestra ayuda de antemano.

Bueno te daré un consejo mas que UTIL ya que recién comienzas… vas a olvidar el uso de delay ya mismo y para reemplazarlo vas a aprender el uso de millis()

Ve a Documentación => Indice de temas tutoriales => millis() y también lee máquina de estados.

Estos dos elementos millis() y la máquina de estados te van a ayudar.

Te recomiendo que leas el tutorial y luego solo para que avances te diré como hacer el primer caso aunque el ejemplo del IDE , BlinkWithoutDelay.ino te pone en camino para hacer que los leds parpadeen y puedas resolver multimples secuencias. Esto no se limita a LEDs como imaginaras, sino que todo lo que quieras hacer con un criterio de semi multitarea se hace con máquina de estados.

delay() solo sirve para el novato en los primeros capitulos y para casos donde no afecta la perfomance del resto del programa, de lo contrario EVITA DELAY siempre!!!

El primer ejemplo tiene dos leds donde progresivamente subes y bajas brillo digamos que ahi aplicar maquina de estados no brinda ninguna utilidad a menos que debas hacer algo mas, por ejemplo: que pasaría si tu quieres agregar un interruptor y detener la secuencia cuando presionas.
La respuesta es simple, tienes que esperar 256 mseg x 2 o desde el momento en que presionante hasta que termine el for en en el que le quitas brillo para que haga la acción.
En cambio si usas máquina de estados y millis() eso será inmediato.

El segundo caso de nuevo por si mismo tampoco tiene utilidad con la maquina de estados pero… justamente al plantear una mezcla de cosas te das cuenta que por esa via no va.
Entonces… un ejemplo con millis() resuelve ambas situaciones.

Veamos como sería

En el código donde usas analogWrite me encuentro con esto

analogWrite(led,i);
    analogWrite(led2,-i);

NOTA: los códigos van con etiquetas de código no con citas o quote. Lee bien las normas del foro porque lo has hecho mal. Debes seleccionar todo el código y usar esto </> no el icono de que se habla algo.

He hecho mi interpretación de ese -i que esta mal para mi gusto, debiera ser 255-i para que mientras uno crezca en brillo el otro hace lo opuesto. No se si esa es la idea

Este es el código con ambos. De nuevo, no se si al terminar la lsecuencia de 50 mseg vuelves a empezar o no… Si vuelves a empezar en lugar de ir al estado 2 ve al estado 0.

const byte led1 = 9;
const byte led2 = 10;
const byte led3 = 5;
const byte led4 = 6;
int i;
unsigned long start1, startBlink;
byte estadoPWM    = 0, 
     estadoBlink  = 0;

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

  switch(estadoPWM) {
     case 0: if (i++<256) {
                analogWrite(led1,i);
                analogWrite(led2,255-i);
              }
              else {
                 estadoPWM = 1;
                 i = 255;
              }
             break;
     case 1: if (i--> -1) {
                analogWrite(led1,i);
                analogWrite(led2,255-i);
              }
              else {
                 estadoPWM = 0;  // vuelvo a comenzar
                 i = 0;
              }
             break;
  }
  switch (estadoBlink) {
      case 0: digitalWrite(5, LOW);
              estadoBlink = 1;
              startBlink = millis();
              break;
      case 1: if (millis() - startBlink > 50UL) { // cada vez que supere 50 mseg
                  digitalWrite(5, HIGH);
                  if (cuento++< 7) {
                      cuento = 0;
                      estadoBlink = 2; // no hago mas esto?
                  }
                  startBlink = 0;
              }
              break;
      case 2: break;
  }
}

Gracias por responder, voy a repasar los tutoriales que me has dicho a ver si lo saco jeje

El código que me has pasado... no lo termino de entender, y no me funciona, así que voy a ver si con los tutoriales lo saco

Y que pasó con lo que te pedi de las normas? No editaste los códigos iniciales con los datos enviados x privado o no lo viste?

Te sugiero estos tutoriales… Yo empecé hace tres semanas y me gustan porque te obligan a escribir en vez de copiar y pegar…
aunque reconozco que muchas veces copio y pego, pero otras muchas escribo. Te acostumbras a la sintaxis.
Saludos.

Tutoriales de arduino desde cero

Ya esta solucionado, he estado unos días que casi no he podido conectarme, disculpa. Y respecto a los mensajes privados… No he visto ninguno…

Respecto a lo de los vídeos esos… les echare un ojo también, que tienen muy buena pinta jajaja

Voy a sesguir el consejo de Tutoriales que DOMPA indicó porque lucen muy bien y serán agregados en Documentación => Indice de temas tutoriales => Youtube