Arduino Programmierung LED

doom_2

User
Hallo zusammen,

ich weiß nicht ob das hier das richtige Forum ist aber ich versuche es mal. Ich möchte eine LED Beleuchtung machen bei der ich keinen linearen Ablauf der LEDs haben möchte. Vielleicht liegt der Fehler auch bei mir da ich in Sachen Arduino absoluter Anfänger bin. Bis dato habe ich die LEDs nur nacheinander ansteuern können, also z.B.
D9 Hi Lo dann D5 Hi Lo, usw. Leider hatte ich bis jetzt immer das Problem das z.B. D5 solange wartet bis D9 fertig ist und erst dann aktiviert wird.
Wie aber mache ich es das z.B. D9 seine Prozedur abläuft und D5 komplett autark von D9 agiert?

Hier wäre mal eine Beispiel Programmierung. Wird wohl für die Profis unter euch ein Lacher sein :-)

void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(300);
digitalWrite(13, LOW);
delay(50);
digitalWrite(13, HIGH);
delay(300);
digitalWrite(13, LOW);
delay(50);
digitalWrite(12, HIGH);
delay(100);
digitalWrite(12, LOW);
delay(10);
digitalWrite(9, HIGH);
delay(100);
digitalWrite(9, LOW);
delay(10);
digitalWrite(9, HIGH);
delay(200);
digitalWrite(9, LOW);
delay(20);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(10, LOW);
delay(10);
digitalWrite(10, HIGH);
delay(100);
digitalWrite(10, LOW);
delay(10);
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
delay(10);
}


Wie müsste ich den Code umschreiben um z.B. alle LEDs separat zu steuern und diese nicht auf die anderen warten. Vielleicht komme ich so besser in die ganze Arduino Programmierung rein als mit den im Netz verfügbaren Standard Prorammierungen.

Gruß

Kai
 
Hallo,

du musst den Befehl "delay" für immer vergessen.
Schau dir mal das Beispiel "blink without delay" an.

Gruß
Matze
 

bendh

User
Hallo Kai,

bei delay bleibt der Ablauf deines Programmes jedes mal stehen und das Programm macht erst nach Ablauf der Millisekunden ( Zahl in Klammer ) einen Schritt weiter.
 

rkopka

User
Wie müsste ich den Code umschreiben um z.B. alle LEDs separat zu steuern und diese nicht auf die anderen warten. Vielleicht komme ich so besser in die ganze Arduino Programmierung rein als mit den im Netz verfügbaren Standard Prorammierungen.
Eigentlich ist Arduino ja nur die HW Plattform. Die Sprache ist (weitgehend) "C". D.h. da findest du genug Beispiele.

Für sowas kann man z.B. Threads nehmen, mit denen man unabhängig schalten und warten kann. Das Lauflicht von Conrad (C-Control) verwendet so einen Ansatz.

Allgemeiner verwendbar ist ein Ansatz über eine Schleife und Abfrage der aktuellen Zeit. Das ginge auch mit delay für die kleinste Zeiteinheit nach jedem Schritt. In einer Tabelle legt man dann ab, was wann für wie lang passiert. Nach jedem Zeitschritt fragt man dann z.B. die Tabelle(n) ab und reagiert entsprechend. Hier ist eine Vielzahl von Variationen möglich von einfach und weniger komplex bis zu sehr flexibel und aufwendiger.
Man kann für jeden Schritt nur sagen Ein oder Aus. Oder z.B. auch Blinken, Blitzen... Oder man legt für jeden Schritt auch noch die Länge fest. Man kann Gruppen von LEDs zusammenfassen. Man könnte auch auf externe Signale (Fahrwerk, Servosignal...) reagieren und dann ein Licht einschalten.

RK
 

hiwi

User
Hallo,
Threads sind eher eine Technologie aus der Javawelt.
Hier beim Arduino verwendest Du Interrupts.
Der Timer Interrupt würde passen, vorher definiert man wie lange eine LED an ist und fragt dann die Zeit und den Status ab.
Also z.B. jede Millisekunde einen Interupt auslösen und die Intervallvorgabe für jede LED überprüfen.
Vielleicht musst Du auch erstmal lange darüber nachdenken ob es eine bestimmtes Muster gibt.
Dann ist die implementierung einfacher.



In einer Scheife würde das natürlich auch gehen.
Bevor man die in die Scheife geht eine Variable für jede LED z.B. mit der Funktion Millis() initialisieren und innerhalb der Schleife ständig abfragen und mit den aktuellen millis() Wert vergleichen und was machen z.B. if greater or equal then this else that
Mit Deinem vorgegebenen Muster (Intervall) vergleichen und die LEDs entsprechend schalten.
Variablen dann wieder zurücksetzten und von vorne.
Könnte zwar hier mal zu Überlagerungen kommen,aber bei LEDs und im millisekundenbereich sicher kein Problem.

Wenn man sich das anschaut, musst du immer alle 10 ms was machen:
So in etwa kanns ausssehen nicht sehr elegant aber man erkennt in etwa den Workflow:

Beispiel mit 2 LEDS.

LED13 leuchtet 300ms, macht dann 50ms Pause und geht wieder an usw.
LED10 leuchtet 100ms und macht eine 10ms Pause usw.


long time10, time100, time300, time50 = millis();

digitalWrite(13, HIGH);
digitalWrite(10, HIGH);

void loop() {

if (millis() >= time10 + 10){
digitalWrite(10, HIGH); // hier könnte man noch abfragen ob schon HIGH dann nichts machen.
time10 = millis();
}

if (millis() >= time50 + 50){
digitalWrite(13, HIGH); // hier könnte man noch abfragen ob schon HIGH dann nichts machen.
time50 = millis();
}

if (millis() >= time100 + 100){
digitalWrite(10, LOW);
time100 = millis();
}
if (millis() >= time300 + 300){
digitalWrite(13, LOW);
time300 = millis();
}


}

Gruss Ralf
 
Ansicht hell / dunkel umschalten
Oben Unten