Du beschreibst es wie eine Filmhandlung, nicht wie einen Flugsimulator. Da passt sequentiell schon ganz gut.
Du willst ja nicht interaktiv eingreifen und mit einer Fernseher-Fernbedienung (sorry: heutzutage ist Smartphone angesagter) Teile des Programms von Hand kontrollieren.
Und am Ende des Programms wartet Arduino ewig (auf einen Reset) oder hat einen Pin übrig mit dem er sich selbst abschaltet ?
Ob delay oder millis(): Stell dir eine Liste auf wann was passiert, bis sie etwa so genau ist wie dies:
Zeit (ms) Pin Wert Kommentar
---------------------------------------
1000, LED_A , 1 // 6 LED an
3000, 0 , 0 // nur warten ( 3 sek )
-2000, LED_B, 1 // zufällige Wartezeit ( 0 .. 2 sek ) , dann 8 LED an
500, M1 , 50 // Motor langsam hochfahren
800, M1 , 80 // in mehreren Stufen
800, M1 , 120
300, M1 , 160
200, M1, 120
500, M2 , 50
800, M2 , 80
800, M2 , 120
300, M2 , 160
100, M3, 50 // M3 startet
100, M2, 120 // M2 Startphase Ende
... ( alle Motoren starten )
5000, LED_X, 1 // Navigationslichter an
3000, M1, 255 // alle Motoren Vollgas
20, M4, 255 // fast gleichzeitig
0, M3, 255
10, M2, 255
... das weitere ist mir zu mühsam, aber dir macht es sicher Spass, Nasenbaer.
...
10000, LED_A , 0 // letzte 6 LED aus.
Jetzt fehlt nur noch , diese Tabelle in C-Syntax zu konvertieren, sie im Flash-Speicher abzulegen, und dann einen kleinen Interpreter su schreiben der sie Zeile für Zeile abarbeitet.
Alternativ schreibt man die Liste als Reihe von Funktionsaufrufen:
Step(1, 1000, LED_A , 1);
Step(2, 3000, 0 , 0); // nur warten ( 3 sek )
Step(3, -2000, LED_B, 1); // zufällige Wartezeit ( 0 .. 2 sek ) , dann 8 LED an
Step(4, 500, M1 , 50);
Step(5, 800, M1 , 80);
...
Ohne delay muss jeder Step-Aufruf wissen, wer er ist und die Steps koordinieren sich über eine globale Variable.
Mit delay bräuchte man tatsächlich den ersten Funktionsparameter ( 1, 2,3 ...) nicht und könnte leichter Schriite rausnehmen und einfügen...
Aber das geht schon viel zu sehr ins Detail, da will ich dem der's schlussendlich schreibt, nicht vorgreifen.