Probleme beim Schalten von LEDs

Hallo,
ich programmiere momentan eine Ampel mit Fußgängerampel für die Modellbahn mit einem Arduino Nano, bei der die LEDs jeweils an einen eigenen digital Pin angeschlossen sind, die LEDs haben außerdem unterschiedliche Vorwiderstände. Die Programmierung der Ampel funktioniert mit folgendem Programm, wobei ich auf delays verzichtet habe, da es mit diesen nicht funktioniert hat:

Pin 2= rot
Pin 3= gelb
Pin 4=grün
Pin 5=rot für die Fußgängerampel
Pin 6=grün für die Fußgängerampel

int zeit = 0 ;
int phase = 0 ;
int interval1 = 0 ;
int interval2 = 0 ;
int interval3 = 0 ;
int interval4 = 0 ;
int vorherigeMillis = 0 ;

void AmpelEinbahnstrasse();

void setup()
{
 pinMode( 2 , OUTPUT);
 pinMode( 3 , OUTPUT);
 pinMode( 4 , OUTPUT);
 pinMode( 5 , OUTPUT);
 pinMode( 6 , OUTPUT);
 Serial.begin(9600);
 zeit = 0 ;

 phase = 1 ;

 interval1 = 150 ;

 interval2 = 600 ;

 interval3 = 100 ;

 interval4 = 800 ;

 vorherigeMillis = 0 ;

 digitalWrite( 2 , LOW );

 digitalWrite( 3 , LOW );

 digitalWrite( 4 , LOW );

 digitalWrite( 5 , LOW );

 digitalWrite( 6 , LOW );

}

void loop()
{
 long current=millis();
 while(current+1000>=millis())
 { 
   zeit = ( zeit + 1 ) ;
   Serial.print("zeit");
   Serial.print(zeit);
   Serial.println();
 }
 AmpelEinbahnstrasse();
}

void AmpelEinbahnstrasse()
{
 if (( ( ( phase ) == ( 1 ) ) && ( ( ( zeit - vorherigeMillis ) ) > ( interval1 ) ) ))
 {
   vorherigeMillis = zeit ;
   phase = 2 ;
 }
 if (( ( ( phase ) == ( 2 ) ) && ( ( ( zeit - vorherigeMillis ) ) > ( interval2 ) ) ))
 {
   vorherigeMillis = zeit ;
   phase = 3 ;
 }
 if (( ( ( phase ) == ( 3 ) ) && ( ( ( zeit - vorherigeMillis ) ) > ( interval3 ) ) ))
 {
   vorherigeMillis = zeit ;
   phase = 4 ;
 }
 if (( ( ( phase ) == ( 4 ) ) && ( ( ( zeit - vorherigeMillis ) ) > ( interval4 ) ) ))
 {
   vorherigeMillis = zeit ;
   phase = 1 ;
 }
 if (( ( phase ) == ( 1 ) ))
 {
   digitalWrite( 2 , HIGH );
   digitalWrite( 3 , LOW );
   digitalWrite( 4 , LOW );
   digitalWrite( 5 , LOW );
   digitalWrite( 6 , HIGH );
 }
 if (( ( phase ) == ( 2 ) ))
 {
   digitalWrite( 2 , LOW );
   digitalWrite( 3 , HIGH );
   digitalWrite( 4 , LOW );
   digitalWrite( 5 , HIGH );
   digitalWrite( 6 , LOW );
 }
 if (( ( phase ) == ( 3 ) ))
 {
   digitalWrite( 2 , LOW );
   digitalWrite( 3 , LOW );
   digitalWrite( 4 , HIGH );
   digitalWrite( 5 , HIGH );
   digitalWrite( 6 , LOW );
 }
 if (( ( phase ) == ( 4 ) ))
 {
   digitalWrite( 2 , HIGH );
   digitalWrite( 3 , HIGH );
   digitalWrite( 4 , LOW );
   digitalWrite( 5 , HIGH );
   digitalWrite( 6 , LOW );
 }
}

Das Problem besteht nun genau darin, dass es komischerweise nicht möglich ist das die rote LED der Ampel und die grüne LED der Fußgängerampel und die grüne LED der Ampel und die rote LED der Fußgängerampel gleichzeitig leuchten. Wenn entweder die eine oder die andere dieser beiden Kombinationen angeschaltet werden soll leuchtet nur die rote LED. Weiß vielleicht jemand wobei das Problem hier liegt?

Grüße Zemizz

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Gruß Tommy

Zemizz:
Weiß vielleicht jemand wobei das Problem hier liegt?

So ganz ohne Schaltbild und ohne Angaben darüber wieviele Milliampere mit welchem Vorwiderstand Du aus welchem Pin ziehen möchtest?

Frag mal in einem Forum für Hellseher nach!

Ansonsten kann ich nur dazu sagen: Wenn Du so viel Strom aus dem Controller rausziehst, dass die Spannung am Controller zusammenbricht, dann ist die rote LED immer diejenige, die noch als letztes leuchtet und Strom abbekommt. Das liegt daran, dass rote LEDs eine niedrigere Vorwärtsspannung als andere LED-Farben benötigen, damit Strom hindurchfließt.

Typische Vorwärtsspannungen für Lowpower-LEDs sind:

  • rot: ca 2.0 Volt
  • grün: ca. 2.5 Volt
  • weiß: ca. 3 Volt
    Nur Infrarot-LEDs brauchen noch weniger Vorwärtsspannung als rote LEDs.

Wenn bei zusammenbrechender Spannung die Vorwärtsspannung an der LED nicht mehr erreicht wird, fließt praktisch kein nennenswerter Strom mehr hindurch.

Wenn Du ein Multimeter mit Volt-Messbereich hast, versuche mal an den HIGH geschalteten Pins die Spannung zu messen und vergleiche mal, ob die HIGH geschalteten Ausgänge vielleicht eine deutlich niedrigere Spannung aufweisen als die Versorgungsspannung des Boards!

Ein elektrisches Problem, wie jurs vermutet, würde ich mit einem einfacheren Sketch testen: also ausschliessen oder bestätigen.

Ein eventuelles logisches Problem im Sketch auch. Auf den ersten Blick ist in dem schwer lesbaren Sketch einiges überflüssige drin.

wobei ich auf delays verzichtet habe, da es mit diesen nicht funktioniert hat

  long current=millis();
  while(current+1000>=millis())
  {   
    zeit = ( zeit + 1 ) ;
    Serial.print("zeit");
    Serial.print(zeit);
    Serial.println();
  }

Das ist deutlich größerer Mist als ein simples delay(1000). Was willst du mit den vielen Ausgaben? Der Wert vonzeitnach Ablauf der Sekunde hängt mehr oder weniger indirekt an der eingestellten Baudrate. Ist das Absicht?

Die von michael_x angesprochene whileschleife erschließt sich mir auch nicht.
Du solltest deine Sketches vernünftig kommentieren. Dann weis man, was Du machen willst, und ob der Code dazu passt. So ist das Ganze kaum zu verstehen und man kann dir nur begrenzt helfen. Ausserdem helfen Kommentare auch dir selbst :wink: .

Die Reihenfolge der Ampelphasen ist zwar nicht ganz korrekt, aber dein angesprochenes Problem scheint nicht am Sketch zu liegen. Du solltest auch deine Schaltung mal posten.

Danke für die vielen Lösungsvorschläge, ich werde diese in den nächsten Tagen mal testen und sehen ob ich weiter komme.

Grüße Zemizz

So ganz ohne Schaltbild und ohne Angaben darüber wieviele Milliampere mit welchem Vorwiderstand Du aus welchem Pin ziehen möchtest?

Die LEDs brauchen alle nur so 20mah und einen Schaltplan habe ich angehängt.

Das Problem besteht nun genau darin, dass es komischerweise nicht möglich ist das die rote LED der Ampel und die grüne LED der Fußgängerampel und die grüne LED der Ampel und die rote LED der Fußgängerampel gleichzeitig leuchten.

Nur wenn alleinig die gelbe LED leuchtet, leuchtet auch schon korrekterweise die rote LED bei den Fußgängern. Zusätzlich kommt es auch noch vor, dass die grüne LED bei den Autos und die grüne LED der Fußgänger gleichzeitig leuchten, obwohl es nirgendswo eine Überbrückung gibt und dies imSketch auch nicht vorgesehen ist.

Wenn Du ein Multimeter mit Volt-Messbereich hast, versuche mal an den HIGH geschalteten Pins die Spannung zu messen und vergleiche mal, ob die HIGH geschalteten Ausgänge vielleicht eine deutlich niedrigere Spannung aufweisen als die Versorgungsspannung des Boards!

Wenn ich die LEDs nicht an das Board angeschlossen habe, messe ich an den HIGH geschalteten Ausgängen auch 5V vor den Widerständen.

 long current=millis();
  while(current+1000>=millis())
  {   
    zeit = ( zeit + 1 ) ;
    Serial.print("zeit");
    Serial.print(zeit);
    Serial.println();
  }

Die While Schleife erhöht einfach nur den Wert in Zeit nach Ablauf einer Sekunde um 1. Die Ausgaben können auch weggelassen werden und sind nicht von großer Bedeutung.

Der Wert von zeit nach Ablauf der Sekunde hängt mehr oder weniger indirekt an der eingestellten Baudrate. Ist das Absicht?

Das weiß ich leider nicht genau :o (Dieses ist mein erstes Arduino Projekt).

Grüße Zemizz

Gib jeder LED einen eigenen Vorwiderstand.

So wie die Schaltung aussieht sollte LOW die LED einschalten,
ich habe aber den Eindruck dein Sketch glaubt, dass die LEDs bei HIGH leuchten.

Danke für die schnelle Antwort.
Wenn ich nun nur die Fußgängerampel oder die große Ampel ansteuere funktionieren beide ohne Probleme, doch wenn ich versuche beide gleichzeitig anzusteuern gehen die grünen LEDs beider Ampeln nicht an.

Grüße Zemizz

Hallo,
an einer Ampel sind schon viele zu Grunde gegangen.

Zeichne Dir Deine Ampel mal in einem FlussDiagramm auf, dann siehst Du sofort wo es nicht läuft.
Dieses Diagramm überträgst Du dann ganz einfach in Deinen Sketch.
z.B.
Start der Ampel ist- alle Fahrstreifen blinken gelb- alle Übergänge sind auf rot.
ist dem so?
ja, was soll als nächstes passieren
nein, Fehler suchen
Fehler beseitigt
ja, was soll als nächstes passieren
Gruß und Spaß
Andreas

Mit nur einem Widerstand leuchtet D2 / D3 / D5 schlecht gleichzeitig.
gelb wird kaum leuchten wenn eine der roten LED an ist, und wenn eine der drei LED leuchtet, haben D4 und D6 überhaupt keine Chance.

Whandall:
Gib jeder LED einen eigenen Vorwiderstand.

Wieso überhaupt solch eine seltsame Schaltung ?

Die 2 "gesparten" Widerstände haben dich vermutlich bisher schon 1 Woche Mehrarbeit gekostet. Vom Stromverbrauch des Arduino-Servers für diesen Thread gar nicht zu reden.

Danke für die viele Hilfe.
Ich konnte das Problem jetzt lösen, indem ich für jede LED einen einzelnen Widerstand benutzt habe.

Grüße Zemizz