LED's ansteuern mit Arduino?

...komplette Frage anzeigen - Arduino board MEGA 2560 - (Programm, programmieren, arduino)

3 Antworten

int zeit = 500;

void setup() {

pinMode(13, OUTPUT);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

}

void loop() {

digitalWrite(13, LOW);

digitalWrite(12, LOW);

digitalWrite(11, LOW);

delay(zeit);

digitalWrite(13, HIGH);

delay(zeit);

digitalWrite(12, HIGH);

delay(zeit)

digitalWrite(11, HIGH);

delay(zeit);

}

So wäre mein Lösungsansatz. Was habe ich verändert und warum?

Bisher gingen deine LEDs nur an und wieder aus und zwar alle gleichzeitig, richtig? Das Problem war dass du keine Wartezeit zwischen deinen If-Bedingungen hattest und die LEDs mit der Prozessorrechengeschwindigkeit eingeschalten wurden.

Ich habe "digital.read(i)" herausgenommen, da diese Funktion nichts bewirkt hat. Die Variable 'i' wurde bei jeder if-Bedingung gelesen.

Deine Idee eine Variable zu deklarieren (einzubinden), aufwärtszuzählen und mit If abzufragen ist, zum großteil, richtig. Allerdings benötigst du diese nicht, vieleicht wenn dein Programm komplexer wird, aber hierfür noch nicht.

Ich habe noch dazu eine Variable 'zeit' eingelesen um die Zeit zwischen dem schalten in "delay()" einzusetzen.

Frage wenn du Fragen hast und wenn deine If-Methode doch wichtig war kann ich dir da auch nochmal helfen.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von DProgrammingR
08.02.2016, 11:03

Danke vielmals für die Antwort. Da ich das Programm am liebsten noch ein bisschen erweitern würde, mit 3 Weiteren LED's in einer eigenen Reihe.  * * * (die ersten 3 LED's)  * * *(mit ein bisschen Abstand von den anderen LED's  die nächsten 3). Die ersten 3 LED's laufen nach ihrem Programm. Wenn dann das dritte LED in der erstem Reihe aufleuchtet, soll das erste LED in der zweiten Reihe zu leuchten beginnen. Man könnte also sagen die erste Reihe läuft dreimal so schnell wie die zweite Reihe. Da ich nicht einfach alles nacheinander mit delay auflisten wollte, dachte ich mir ich könnte das Programm "vereinfachen" mit if/switch Anweisungen. z.B : Wenn das dritte LED(erste Reihe) Leuchtet, soll ein weiteres LED(zweite Reihe) leuchten. Dieses Programm ist für mich nur zur Übung, da ich mich gerne verbessern möchte. :)

0
Kommentar von ralphdieter
08.02.2016, 11:41

Dein Ansatz ist anders strukturiert: loop() erledigt bei Dir einen kompletten Zyklus und dauert 2 Sekunden (statt 0.5s). Für wenige Zyklen ist das sicher lesbarer.

Trotzdem würde ich in beiden Fällen die Taktschleife von den Aktionen scharf trennen. Bei Dir wäre das:

int const zeit = 500; // delay [ms]

void loop_forever(){
for (;;){
action(0);
delay(zeit);
action(1);
delay(zeit);
action(2);
delay(zeit);
action(3);
delay(zeit);
}
}

Bei DProgrammingR sähe das etwas kompakter  aus:

void loop_forever(){
for (int state=0; ;state=(state+1)%4){
action(state);
delay(500);
}
}

Für die Aktion selbst verwendet man am besten ein switch-Statement:

void action (int state){
switch(state){
case 0: digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
break;
case 1: digitalWrite(13, HIGH);
break;
case 2: digitalWrite(12, HIGH);
break;
case 3: digitalWrite(11, HIGH);
break;
}
}

Diese Funktion verlässt sich allerdings auf die richtige Reihenfolge der states. Um die Schleife rückwärts auszuführen, müsste man sie neu programmieren. Besser wird's wohl sein, bei jedem state alle drei LEDs an-/auszuschalten.

Erfahrungsgemäß lohnt sich das Einsparen von Zeilen fast nie: Meist muss man sie später doch einfügen — und dabei oft noch eine halbe Stunde debuggen, bis man die richtige Stelle gefunden hat.

1

Der Klassiker -- willkommen im  Club :-)

    if(i = 0){

Eigentlich sollte hier jeder Compiler seit 1989 eine Warnung ausgeben.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von JuicyLuisian
08.02.2016, 09:58

Warum sollte das nicht gehen?

1

ich würde es anders machen:

digitalWrite (13, HIGH)

delay 1000

digitalWrite(12, HIGH)

delay 1000

DigitalWrite(11, HIGH)

delay 500

digitalWrite(13, LOW)

digitalWrite(12, LOW)

digitalWrite(11, LOW)

delay 2000

ich weiß dass die semikoli fehlen. das ganze halt in die loop. außerdem stimmt glaub ich die zeile "if(i<0) nicht, weil das nicht geht ?! teste es einfach mal aus

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?