arduino UNO LEDs de derecha a izquierda y luego invertidos

3

Tengo 8 LEDs alineados en una placa de pruebas, y estoy tratando de hacer que funcionen de un extremo a otro y de vuelta, como las luces de KITT (del piloto nocturno, espero que eso se aclare). Los LEDs están todos configurados y correctos y funcionan.

He configurado mi código como tal:

int ledPins[]={2,3,4,5,6,7,8,9};

void setup()
{
  for (int i =0; i <8; i++)
  {
    pinMode(ledPins[i],OUTPUT);
  }
}

void loop()
{
  for(int i =0; i<8; i++)
  {
    digitalWrite(ledPins[i],HIGH);
    delay(100);
    digitalWrite(ledPins[i],LOW);
  }

  for(int i =7; i<1; i--)
  {
    digitalWrite(ledPins[i],HIGH);
    delay(100);
    digitalWrite(ledPins[i],LOW);
  }
}

pero no enciende los LED de derecha a izquierda y luego regresa como lo esperaba.

EDITAR: Lo que hace es iluminar los LED de derecha a izquierda, pero no los enciende de manera opuesta (de izquierda a derecha). Simplemente sigue yendo de derecha a izquierda, de derecha a izquierda

Estoy usando un Arduino UNO y estoy basando mi circuito en el kit de experimentación para Arudino CIRC-02

EDIT # 2: Así que he cambiado los bucles for a los bucles while:

int ledPins[]={2,3,4,5,6,7,8,9};

void setup()
{
  for (int i =0; i <8; i++)
  {
    pinMode(ledPins[i],OUTPUT);
  }
}

void loop()
{
  int i = 0;
  while (i<7)
  {
    {
      digitalWrite(ledPins[i],HIGH);
      delay(100);
      digitalWrite(ledPins[i],LOW);
      i++;
    }
  }

  i = 7;
  while (i >0)
  {
    digitalWrite(ledPins[i],HIGH);
    delay(100);
    digitalWrite(ledPins[i],LOW);
    i--;
  }
}

y funciona según lo previsto! Sin embargo, todavía estoy interesado en saber dónde salió mal mi for-loop, si alguien tiene alguna idea

    
pregunta snowflakekiller

5 respuestas

3

En el segundo bucle 'for', i no es inmediatamente < 1, por lo que el bucle nunca se ejecuta.

for(int i =7; i<1; i--)

debería decir

for(int i =7; i>=0; i--)
    
respondido por el JRobert
2
int ledPins[]={2,3,4,5,6,7,8,9,10,11,12};

void setup()
{
  for (int i =0; i <11; i++)
  {
    pinMode(ledPins[i],OUTPUT);
  }
}

void loop()
{
  for(int i =0; i<11; i++)
  {
    digitalWrite(ledPins[i],HIGH);
    delay(30);
    digitalWrite(ledPins[i],LOW);
  }

  for(int i =10; i>1; i--)
  {
    digitalWrite(ledPins[i],HIGH);
    delay(80);
    digitalWrite(ledPins[i],LOW);
  }
}
    
respondido por el gaben896
1

(a) No estoy 100% familiarizado con lo que exige su idioma pero, ¿son sus pruebas "para" del formulario (inicio, tiempo, acción) o (inicio, hasta, acción)?

Si es lo último, tus pruebas "< 8" deberían ser "> 7"

Si las pruebas se inician / mientras, entonces OK como está.

(b) En el segundo bucle de iluminación de LED (el conteo descendente) LOW y HIGH deben intercambiarse; al retroceder no cambia la forma en que desea que se encienda el LED.

    
respondido por el Russell McMahon
1

Los bucles de cuenta regresiva se hacen más tradicionalmente con decremento previo:

for(i=8; i>0; --i)
{
  ...
}

Contaría de 7 a 0. El --i disminuye i en 1 como la primera cosa que se hace después de la comparación.

    
respondido por el Majenko
-1

Código de ejemplo comentado:

void setup() {
  // initialize digital pin 13 to 10 as an output.
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);

}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(13, LOW);   // turn the LED off by making the voltage LOW
  delay(50);             // wait for a second
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(12, LOW);   // turn the LED off by making the voltage LOW
  delay(50); 
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(11, LOW);   // turn the LED off by making the voltage LOW
  delay(50);             // wait for a second
  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(10, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);
  digitalWrite(10, HIGH);
  delay(50);
  digitalWrite(10, LOW);   // turn the LED off by making the voltage LOW
  delay(50);
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(11, LOW);   // turn the LED off by making the voltage LOW
  delay(50);
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(12, LOW);   // turn the LED off by making the voltage LOW
  delay(50); 
   digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(13, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);

}
    
respondido por el Jan

Lea otras preguntas en las etiquetas