¿Se explica "8 LED Fun" para Arduinos?

Soy relativamente nuevo en programación, Arduinos y foros en línea en general. Realmente agradecería una explicación de uno de los tutoriales básicos para Arduinos:

Conecté 8 LED a 8 pines (2 a 9) y programé un breve script para encender los LED sucesivamente, según un esquema (que se encuentra aquí): http://www.instructables.com/files/deriv/F45/G030 /FVT7A09T/F45G030FVT7A09T.GRANDE.jpg

Un código de muestra sugiere:

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(){
  oneAfterAnotherNoLoop();
}    
void oneAfterAnotherNoLoop(){
  digitalWrite(ledPins[0], HIGH);
  delay(10);
  digitalWrite(ledPins[0], LOW);
  delay(10);
  ...
}

Sin embargo, estoy confundido acerca de la función del método setup(). Me dijeron que el método setup() solo se ejecuta una vez, entonces, ¿no deberían las luces dejar de parpadear después de una iteración? ¿O es una forma de inicializar TODOS los 8 pines continuamente (y no sucesivamente)? Además, ¿por qué se necesitan los métodos setup() y oneAfterAnotherNoLoop()? Escribí todo en el método loop():

void loop(){
  for(int i = 0; i<10; i++){
    pinMode(ledPins[i], OUTPUT); 
    digitalWrite(ledPins[i], HIGH);
    delay(250);
    digitalWrite(ledPins[i], LOW);
    delay(250);
  }
}

Y esto funcionó bastante bien, excepto que después de quizás 20 iteraciones, se atascó en la primera luz LED :(

¡Cualquier comentario sería muy apreciado! ¡Gracias!

setup () está definiendo los pines como salidas secuencialmente, por lo que solo necesita ejecutarse una vez. Su bucle () está contando de 0 a 9 (<10) y luego terminará.
pinMode();inicializa el controlador de pines. Puede configurar un solo pin como INPUTO OUTPUTy eso generalmente solo debe hacerse una vez. Una vez configurado como salida, a digitalWrite();controlará el pin de salida LOWo HIGH.
publica todo tu programa

Respuestas (2)

El setup()método se ejecuta solo una vez porque se usa para establecer la dirección de los pines (Entrada o Salida).

El oneAfterAnotherNoLoop()método produce solo un parpadeo de los LED. Enciende los LED, espera un poco, apaga los LED y espera otro poco.

El loop()método es un bucle infinito que llama al oneAfterAnotherNoLoop()método para producir un ciclo infinito de parpadeo.

En su código, inicializa los pines cada vez y esto no es necesario. Prueba esto:

void loop() {
  for (int i = 0; i < 8; i++) {       // Initialize pins
    pinMode(ledPins[i], OUTPUT);      // Set pin i as an OUTPUT
  }
  while (1) {                         // Infinite loop
    for (int i = 0; i < 8; i++) {
      digitalWrite(ledPins[i], HIGH); // Drive LED i HIGH
      delay(250);                     // Wait
      digitalWrite(ledPins[i], LOW);  // Drive LED i LOW
      delay(250);                     // Wait
    }
  }
}

El entorno de tiempo de ejecución de Arduino ejecuta su setupmétodo una vez al inicio y luego ejecuta el loopmétodo una y otra vez.

Por lo tanto, el setupmétodo es el lugar apropiado para colocar su código de inicialización. Esto incluye cosas como configurar pines para que sean pines de salida en lugar de pines de entrada. Esto significa que no necesita su pinmodedeclaración en su loopmétodo. Esto ahorra tiempo de procesamiento innecesario.

La persona que escribió el programa ("boceto") en el que basó el suyo decidió crear métodos adicionales. Esta puede ser una buena manera de dividir programas complejos en partes más fáciles de entender. En este caso no fue particularmente útil.

No veo por qué tu boceto se detuvo después de algunas iteraciones. ¿Tocaste algo? ¿Funcionó bien de nuevo después de reiniciarlo?

"No veo por qué tu boceto se detuvo después de algunas iteraciones. ¿Tocaste algo? ¿Funcionó bien de nuevo después de reiniciarlo?" ¡No, no fue así! Aún más extraño fue: en la iteración 18 y 19, las luces se encendieron "hacia adelante y hacia atrás" entre el 2.º y el 3.er LED (y continuaron corriendo sucesivamente por el tramo del LED) antes de quedarse atascadas en la iteración 20. ¡Realmente confundido!
@batlike: intentaría agregar una nueva línea int i;despuésvoid loop() {