Wie kann die LED's gleichzeitig steuern ?

Guten Abend.

Ich bin noch Anfänger was Arduino angeht jedoch lerne ich schnell...Ich will eine Ampelkreuzung machen mit jeweils 2 Fußgängerampeln mit einer Roten Gelben und Grünen LED, sowie einer KFZ-Ampel. Eine einfache Ampel zu steuern klappt, jedoch bin ich bei dem Versuch alle Ampeln zu schalten gescheitert da ich alle digitalWrite's aufgezählt und festgestellt habe dass alles nach der Reihenfolge abläuft. Jetzt ist meine Frage, wie schaffe ich es alle LED's gleichzeitig zu steuern. Ich benutze einen Arduino Mega 2560 Controller. Dankeschön für eure Hilfe

Mit freundlichen Grüßen,

cr4zym4rc0

Bei guter Programmierung ist das Nacheinander für Dich optisch wie gleichzeitig.
Zeige uns doch mal Deinen Sketch, dann können wir sehen, wo es klemmt.

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).

Gruß Tommy

cr4zym4rc0: Jetzt ist meine Frage, wie schaffe ich es alle LED's gleichzeitig zu steuern.

Das kannst Du zum Beispiel erreichen, indem Du die betreffenden Ports „direkt“ schaltest.

Sehr viel einfacher ist aber, wenn Du einfach alle Schaltvorgänge nacheinander programmierst - natürlich ohne Pause(n) [delay()s] dazwischen. Dann geht das dermaßen schnell, dass niemand sagen kann, es sei nicht wirklich gleichzeitig.

In diesem Thread geht es u. A. um „direkte“ Schaltereien.

Gruß

Gregor

Bitte lies doch die Antworten richtig durch.
Du wurdest darum gebeten den Sketch in Code-Tags zu setzen.
Warum machst du das nicht ?

Wenn dann alles in Codetags ist, dann überlege mal, warum das alles langsam nacheinander abläuft. Weil Du laufend den Prozessor für mehrere Sekunden mit delay(zahl) zum Nichtstun verurteilst. Schau Dir mal BlinkWithoutDelay und die Nachtwächtererklärung (kein Witz) an.

Gruß Tommy

cr4zym4rc0: Guten Abend.

Ich bin noch Anfänger was Arduino angeht jedoch lerne ich schnell...Ich will eine Ampelkreuzung machen mit jeweils 2 Fußgängerampeln mit einer Roten Gelben und Grünen LED, sowie einer KFZ-Ampel. Eine einfache Ampel zu steuern klappt, jedoch bin ich bei dem Versuch alle Ampeln zu schalten gescheitert da ich alle digitalWrite's aufgezählt und festgestellt habe dass alles nach der Reihenfolge abläuft. Jetzt ist meine Frage, wie schaffe ich es alle LED's gleichzeitig zu steuern.

In Deutschland gibt es keine Fußgängerampeln mit Gelbphase (meines Wissens nach), Fußgängerampfeln zeigen nur rot oder grün oder sind aus.

Was verstehst Du unter "gleichzeitig"? Gleichzeitig im Rahmen der menschlichen Wahrnehmungsfähigkeit? Ein einzelnes digitalWrite auf dem MEGA2560 dauert ca 5 Mikrosekunden (Millionstel Sekunden), also könntest Du in einer einzelnen Millisekunde (1000 Mikrosekunden) ungefähr an zweihundert Pins Schaltvorgänge durchführen. Ist das ausreichend gleichzeitig?

Ansonsten sage ich mal "Finite State Machine".

An Ampeltypen gibt es doch im wesentlichen nur zwei verschiedene Ausführungen: Dreigarben-Ampeln mit Rot-Gelb-Grün und Zweifarben-Ampeln (Rot-Grün-Aus" oder Rot-Gelb-Aus").

Die Dreifarbenampeln stehen in Deutschland meist als Fahrbahnampeln an Kreuzungen, und Zweifarben-Ampeln gibt es entweder für Fußgänger oder auf der Fahrbahn an sogenannten "Bedarfsampeln".

Vielleicht beschreibst Du mal genauer, was Du hast: Dreifarben-Ampeln Rot-Gelb-Grün Oder Zweifarben-Ampeln Rot-Grün-Aus oder Rot-Gelb-aus Und wie viele. Und wie die Phasenzeiten sind. Und überhaupt. Und dann könnte man einen Zustandsautomaten (Finite State Machine, FSM) dafür programmieren. Insbesondere, wenn man dann noch wüßte, welcher Pin für welche LED-Farbe an welcher Ampel zuständig sein soll.

Bei "kreuzenden Verkehren", also beispielsweise "zwei kreuzenden Fahrbahnen" oder "Fußgängerverkehr kreuzt Fahrbahnverkehr" an einer Ampelkreuzung wären dabei auch "Räumphasen und "sich überschneidende" Ampfelphasen ggf. im Ablauf der Schaltungsfolge zu berücksichtigen.

Erstmal alles genau auf Deutsch beschreiben. Dann kann man es mindestens nach dem Prinzip einer Finite-State-Machine (Zustandsautomat) auch relativ einfach programmieren.

Und selbstverständlich: OHNE auch nur ein einziges delay() im gesamten Sketch!

Ich habe an einem Ampelpfosten jeweils drei LED's(Rot Gelb Grün) für eine Ampelspur, und dann 2 mal 3 LED's für die Fußgänger. Also insgesamt 36 LED's. Ich will dass die LED's wie bei einer Kreuzung aufleuchten.

Ich versteh nicht was sie mit den Code-Tags meinen, könnten sie das nochmal erklären.

Was genau ist eine Finite State Machine ?

Wenn Du uns ignorierst, werden wir Dich auch ignorieren.

Gruß Tommy

Das mit den Code-Tags hat doch Tommy genau geschrieben. Ansonsten "How to use this Forum" lesen.

Alles weitere steht auch bei Google.

Ich ignoriere dich nicht. Ich habe das mit dem Wachmann jetzt durchgelesen. Allerdings verstehe ich nicht was das if und die == bedeuten.

//Auto-Ampel
int autoeinsrot     =  53;
int autoeinsgelb    =  52;
int autoeinsgruen   =  51;

int autozweirot     =  44;
int autozweigelb    =  43;
int autozweigruen   =  42;

int autodreirot     =  35;
int autodreigelb    =  34;
int autodreigruen   =  33;

int autovierrot     =  26;
int autoviergelb    =  25;
int autoviergruen   =  24;

//Fussgaenger-Ampel
int fusseinsrota    =  50;
int fusseinsgelba   =  49;
int fusseinsgruena  =  48;

int fusseinsrotb    =  47;
int fusseinsgelbb   =  46;
int fusseinsgruenb  =  45;

int fusszweigelba   =  40;int fusszweirota    =  41;

int fusszweigruena  =  39;

int fusszweirotb    =  38;
int fusszweigelbb   =  37;
int fusszweigruenb  =  36;

int fussdreirota    =  32;
int fussdreigelba   =  31;
int fussdreigruena  =  30;

int fussdreirotb    =  29;
int fussdreigelbb   =  28;
int fussdreigruenb  =  27;

int fussvierrota    =  23;
int fussviergelba   =  22;
int fussviergruena  =  21;

int fussvierrotb    =  20;
int fussviergelbb   =  19;
int fussviergruenb  =  18;


void setup() {
  // put your setup code here, to run once:

pinMode(autoeinsrot, OUTPUT);
pinMode(autoeinsgelb, OUTPUT);
pinMode(autoeinsgruen, OUTPUT);

pinMode(autozweirot, OUTPUT);
pinMode(autozweigelb, OUTPUT);
pinMode(autozweigruen, OUTPUT);

pinMode(autodreirot, OUTPUT);
pinMode(autodreigelb, OUTPUT);
pinMode(autodreigruen, OUTPUT);

pinMode(autovierrot, OUTPUT);
pinMode(autoviergelb, OUTPUT);
pinMode(autoviergruen, OUTPUT);

pinMode(fusseinsrota, OUTPUT);
pinMode(fusseinsgelba, OUTPUT);
pinMode(fusseinsgruena, OUTPUT);

pinMode(fusseinsrotb, OUTPUT);
pinMode(fusseinsgelbb, OUTPUT);
pinMode(fusseinsgruenb, OUTPUT);

pinMode(fusszweirota, OUTPUT);
pinMode(fusszweigelba, OUTPUT);
pinMode(fusszweigruena, OUTPUT);

pinMode(fusszweirotb, OUTPUT);
pinMode(fusszweigelbb, OUTPUT);
pinMode(fusszweigruenb, OUTPUT);

pinMode(fussdreirota, OUTPUT);
pinMode(fussdreigelba, OUTPUT);
pinMode(fussdreigruena, OUTPUT);

pinMode(fussdreirotb, OUTPUT);
pinMode(fussdreigelbb, OUTPUT);
pinMode(fussdreigruenb, OUTPUT);

pinMode(fussvierrota, OUTPUT);
pinMode(fussviergelba, OUTPUT);
pinMode(fussviergruena, OUTPUT);

pinMode(fussvierrotb, OUTPUT);
pinMode(fussviergelbb, OUTPUT);
pinMode(fussviergruenb, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(autoeinsrot, HIGH);
delay(7000);
digitalWrite(autoeinsgelb, LOW);
digitalWrite(autoeinsgruen, LOW);

digitalWrite(autozweirot, LOW);
digitalWrite(autozweigelb, LOW);
digitalWrite(autozweigruen, HIGH);
delay(7000);

digitalWrite(autodreirot, HIGH);
delay(7000);
digitalWrite(autodreigelb, LOW);
digitalWrite(autodreigruen, LOW);

digitalWrite(autovierrot, LOW);
digitalWrite(autoviergelb, LOW);
digitalWrite(autoviergruen, HIGH);
delay(7000);

digitalWrite(fusseinsrota, HIGH);
digitalWrite(fusseinsgelba, LOW);
digitalWrite(fusseinsgruena, LOW);

digitalWrite(fusseinsrotb, LOW);
digitalWrite(fusseinsgelbb, LOW);
digitalWrite(fusseinsgruenb, HIGH);
delay(5500);

digitalWrite(fusszweirota, LOW);
digitalWrite(fusszweigelba, LOW);
digitalWrite(fusszweigruena, HIGH);
delay(5500);

digitalWrite(fusszweirotb, HIGH);
digitalWrite(fusszweigelbb, LOW);
digitalWrite(fusszweigruenb, LOW);

digitalWrite(fussdreirota, HIGH);
digitalWrite(fussdreigelba, LOW);
digitalWrite(fussdreigruena, LOW);

digitalWrite(fussdreirotb, LOW);
digitalWrite(fussdreigelbb, LOW);
digitalWrite(fussdreigruenb, HIGH);
delay(5500);

digitalWrite(fussvierrota, LOW);
digitalWrite(fussviergelba, LOW);
digitalWrite(fussviergruena, HIGH);
delay(5500);

digitalWrite(fussvierrotb, HIGH);
digitalWrite(fussviergelbb, LOW);
digitalWrite(fussviergruenb, LOW);


digitalWrite(autoeinsrot, HIGH);
digitalWrite(autoeinsgelb, HIGH);
delay(1500);
digitalWrite(autoeinsgruen, HIGH);

digitalWrite(autozweirot, LOW);
digitalWrite(autozweigelb, LOW);
digitalWrite(autozweigruen, LOW);

digitalWrite(autodreirot, HIGH);
digitalWrite(autodreigelb, HIGH);
delay(1500);
digitalWrite(autodreigruen, HIGH);

digitalWrite(autovierrot, LOW);
digitalWrite(autoviergelb, LOW);
digitalWrite(autoviergruen, LOW);

digitalWrite(fusseinsrota, HIGH);
digitalWrite(fusseinsgelba, HIGH);
delay(1500);
digitalWrite(fusseinsgruena, HIGH);

digitalWrite(fusseinsrotb, LOW);
digitalWrite(fusseinsgelbb, LOW);
digitalWrite(fusseinsgruenb, LOW);

digitalWrite(fusszweirota, LOW);
digitalWrite(fusszweigelba, LOW);
digitalWrite(fusszweigruena, LOW);

digitalWrite(fusszweirotb, HIGH);
digitalWrite(fusszweigelbb, HIGH);
digitalWrite(fusszweigruenb, HIGH);

digitalWrite(fussdreirota, HIGH);
digitalWrite(fussdreigelba, HIGH);
digitalWrite(fussdreigruena, HIGH);

digitalWrite(fussdreirotb, LOW);
digitalWrite(fussdreigelbb, LOW);
digitalWrite(fussdreigruenb, LOW);

digitalWrite(fussvierrota, LOW);
digitalWrite(fussviergelba, LOW);
digitalWrite(fussviergruena, LOW);

digitalWrite(fussvierrotb, HIGH);
digitalWrite(fussviergelbb, HIGH);
digitalWrite(fussviergruenb, HIGH);


digitalWrite(autoeinsrot, LOW);
digitalWrite(autoeinsgelb, LOW);
digitalWrite(autoeinsgruen, HIGH);
delay(7000);

digitalWrite(autozweirot, LOW);
digitalWrite(autozweigelb, HIGH);
delay(2500);
digitalWrite(autozweigruen, LOW);

digitalWrite(autodreirot, LOW);
digitalWrite(autodreigelb, LOW);;
digitalWrite(autodreigruen, HIGH);
delay(7000);


digitalWrite(autovierrot, LOW);
digitalWrite(autoviergelb, HIGH);
delay(2500);
digitalWrite(autoviergruen, LOW);

digitalWrite(fusseinsrota, LOW);
digitalWrite(fusseinsgelba, LOW);
digitalWrite(fusseinsgruena, HIGH);
delay(5500);

digitalWrite(fusseinsrotb, LOW);
digitalWrite(fusseinsgelbb, HIGH);
delay(2500);
digitalWrite(fusseinsgruenb, LOW);

digitalWrite(fusszweirota, LOW);
digitalWrite(fusszweigelba, HIGH);
delay(2500);
digitalWrite(fusszweigruena, LOW);


  

}

Ist das jetzt so richtig ?

Ja, jetzt ist es richtig.

Da fehlen ja die elementarsten Grundkenntnisse.

Vorschlag: Lerne ein paar Grundlagen in C z.B. aus C von A bis Z. Sonst verstehst Du ja unsere Hinweise auch nicht.

If ist eine Bedingungsabfrage und == ist ein Vergleich, ob 2 Werte gleich sind - im Gegensatz dazu ist = eine Zuweisung.

Gruß Tommy

cr4zym4rc0: Ich ignoriere dich nicht. Ich habe das mit dem Wachmann jetzt durchgelesen. Allerdings verstehe ich nicht was das if und die == bedeuten.

Das steht doch alles in den Grundlagen, die solltest du schon lernen.

Ist das jetzt so richtig ?

Das mit den Code-Tags ist jetzt richtig.

cr4zym4rc0:
… Ist das jetzt so richtig ?

Ja :slight_smile:

Schön, dass Du den Code halbwegs strukturierst (ich meine die Leerzeilen).

Aber wie die Anderen sagen, Du solltest noch ein bisschen Zeit mit dem Lernen der Grundlagen verbringen. Der Code, den Du dann schreiben kannst, ist sehr viel kürzer und noch übersichtlicher. Gerade bei dem, was Du vorhast, kannst Du z. B. prima mit Klassen arbeiten – Du legst z. B. eine Ampel als Klasse an und musst dann nur noch sagen, dass Ampel x zur nächsten „Stufe“ vorrückt. Oder Du legst Dein Programm als „endlichen Automat“ an, der vollkommen ohne delay() auskommt – das ist vielleicht beim jetzigen Vorhaben nicht so wichtig, aber endliche Automaten lassen sich sehr viel besser erweitern oder sonstwie ändern. Finde ich zumindest.

Gruß

Gregor

PS: Ach ja, zum Thema Endlicher Automat habe ich vor einiger Zeit das hier ins Netz gekippt. Vielleicht hilft das.

Vielen Dank für eure Hilfe, gibt es noch andere Möglichkeiten das ganze zu lernen, solltte es am Mittwoch Abend haben...

Mittwoch, das kannst Du vergessen. Je nachdem, wie schnell Du lernst, ein paar Wochen.

Da gibt es einen alten Satz (ich weiß nicht mehr von wem): Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken.

Gruß Tommy

cr4zym4rc0: Ich versteh nicht was sie mit den Code-Tags meinen, könnten sie das nochmal erklären.

Was genau ist eine Finite State Machine ?

Also in diesem Forum ist das Duzen üblich, nicht das Siezen.

Und das mit den Code-Tags ist hier ausführlich beschrieben unter Punkt7:

Grundlagen zur FSM (Finite-State-Machine/Zustandsautomat) stehen übrigens sogar bei Wikipedia: https://de.wikipedia.org/wiki/Endlicher_Automat

Das "endlich" bem endlichenZustandsautomaten bezieht sich dabei darauf, dass es eine endliche (abzählbare) Anzahl an Einzelzuständen gibt, und keine unendliche Anzahl von Zuständen.

cr4zym4rc0:
solltte es am Mittwoch Abend haben…

Ich mache keine Hausaufgaben.

cr4zym4rc0: Ich bin noch Anfänger was Arduino angeht jedoch lerne ich schnell...

Hier steht es.... dann bin ich mal gespannt.

Ich brauche ja nicht alles wissen, brauche ja nur ein paar Commands. Besuche derzeit die 10. Klasse einer Realschule.

Von uns wird Dir keiner Deinen Sketch schreiben.

Wir werden Dir helfen, zu verstehen und Fehlermeldungen zu begreifen. Nicht mehr und nicht weniger.

Schreiben musst Du den Sketch selbst.

Gruß Tommy