Meine Versuche dies über eine Statemachine machen, verschlankt den Code nicht wirklich. Das müsste sich wer anderer ansehen.
Hab aber jetzt einen ganz anderen Ansatz dafür:
Man definiert einfach die Abfolge als Bytemuster und lässt es laufen.
Wenn man sich die ganzen unnützen Kommentare wegdenkt, dann ist das wirklich sehr einfacher Code, nicht wirklich länger als der Ausgangssketch, aber super einfach zum erweitern.
// http://forum.arduino.cc/index.php?topic=518131.0
// Variante 3: Definition eines Musters das abgearbeitet wird:
#define DEBUG_UART 1 // Debugausgaben auf Serieller Schnittstelle falls man keine 10 LEDs hat: 0 nein / 1 ja
// a987654321 // das Muster, einfach als Bitfolge dann kann man es einfach in der IDE "hinmalen"
const uint16_t pattern[]={0b0000000000000001, // ex hinundher() Durchgang 1
0b0000000000000010,
0b0000000000000100,
0b0000000000001000,
0b0000000000010000,
0b0000000000100000,
0b0000000001000000,
0b0000000010000000,
0b0000000100000000,
0b0000001000000000,
0b0000000100000000,
0b0000000010000000,
0b0000000001000000,
0b0000000000100000,
0b0000000000010000,
0b0000000000001000,
0b0000000000000100,
0b0000000000000010,
0b0000000000000001, // 19 pattern haben wir jetzt
0b0000000000000001, // ex hinundher() Durchgang 2
0b0000000000000010,
0b0000000000000100,
0b0000000000001000,
0b0000000000010000,
0b0000000000100000,
0b0000000001000000,
0b0000000010000000,
0b0000000100000000,
0b0000001000000000,
0b0000000100000000,
0b0000000010000000,
0b0000000001000000,
0b0000000000100000,
0b0000000000010000,
0b0000000000001000,
0b0000000000000100,
0b0000000000000010,
0b0000000000000001, // 38 pattern haben wir jetzt
0b0000000000110000, // ex ausbreiten()
0b0000000001001000,
0b0000000010000100,
0b0000000100000010,
0b0000001000000001,
0b0000000100000010,
0b0000000010000100,
0b0000000001001000,
0b0000000000110000,
0b0000000000110000, // ex ausbreiten() - 2
0b0000000001001000,
0b0000000010000100,
0b0000000100000010,
0b0000001000000001,
0b0000000100000010,
0b0000000010000100,
0b0000000001001000,
0b0000000000110000};
uint16_t totalNoPattern = 0; // soviele Pattern gehen zwar nie auf einen UNO, aber mehr als uint8_t könnten es schon werden. man könnte ein paar Byte sparen wenn man ein fixes precompiler #define oder ein const macht.
uint8_t actualPattern = 0; // welches Muster soll aktuell ausgegeben werden
uint32_t lastMillis = 0; // wann wurde das letzte mal ein Update der LEDs gemacht
const uint8_t myIntervall = 200; // Achtung falls mehr als 255ms gewünscht umstellen auf ein uint16_t
void setup() {
#if DEBUG_UART
Serial.begin(115200);
#endif
for (uint8_t i = 1; i<11; i++) {
pinMode(i, OUTPUT);
}
totalNoPattern = sizeof(pattern) / sizeof(pattern[0]); // Ermittlung wie viele Pattern definiert wurden, ich mach das zur Laufzeit, weil ich mir das abzählen sparen wollte.
}
void loop() {
if (millis()-lastMillis>=myIntervall)
{
actualPattern++;
if (actualPattern>=totalNoPattern) actualPattern=0;
for (uint8_t i = 0; i<10; i++) // von der Vorgabe her reichen die 10 - werden alle 16 Leds benötigt müsste man auch im setup() mehr initialisieren
{
if (pattern[actualPattern] & (1<<i)) {
#if DEBUG_UART
Serial.print(F("X"));
#endif
digitalWrite(i+1, HIGH); }
else {
#if DEBUG_UART
Serial.print(F(" "));
#endif
digitalWrite(i+1, LOW);}
}
#if DEBUG_UART
Serial.print(F(" - "));
Serial.println(actualPattern);
#endif
lastMillis=millis();
}
// do what ever you want unblocked here
}
Geht halt zu Lasten vom RAM:
Der Sketch verwendet 1100 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 128 Bytes (6%) des dynamischen Speichers, 1920 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wer keine 10 LEDs hat (oder wie ich, keine Lust hat das zusammenzustecken) kann die Test Ausgabe auf Serial aktivieren (der Konflikt von PIN1/2 und SERIAL ist natürlich nicht schön, aber es soll ja nur ein Test sein).
Fachlich gibt es einen Unterschied zum Ursprungspost: ich habe keine Unterscheidung ob 200 oder 250ms. Ansonsten sollte der Sketch genau das gleiche machen - aber frei von Delay.