Ampelsteuerung

Hallo

ich bin gerade dabei, meine Ampelkreuzung mit dem Arduino zu realisieren ....
Allerdings, hänge ich bei dem Problem, dass wenn ich dort 4 Ampeln habe + 4 Fußgänger Ampeln, dass das für mich mit den LED und der anzahl der Pins auf dem arduino nicht funktionieren kann.

Anbei habe ich nochmal meinen Quellcode, erstmal für eine Ampel.
Habt ihr Ideen, wie ich anfangen kann, was ich anders machen kann?

Danke :slight_smile:

int _ABVAR_1_zeit = 0 ;void setup()
{
	pinMode( 2 , INPUT);
	pinMode( 5 , OUTPUT); //Gruen
	pinMode( 6 , OUTPUT); //F_Rot
	pinMode( 4 , OUTPUT); //Gelb
	pinMode( 3 , OUTPUT); //Rot
	pinMode( 7 , OUTPUT); //F_Gruen
	_ABVAR_1_zeit = 3000 ;}	//3ms

void loop()
{
	digitalWrite( 5 , HIGH );	//A_Gruen
	digitalWrite( 6 , HIGH );	//F_rot
	if (digitalRead(2))
	{
		digitalWrite( 5 , HIGH );	//A_Gruen
		digitalWrite( 4 , LOW );	//A_Gelb
		delay( _ABVAR_1_zeit );		//Wartezeit
		//
		digitalWrite( 5 , LOW );	//A_Gruen
		digitalWrite( 4 , HIGH );	//A_Gelb
		delay( _ABVAR_1_zeit );		//Wartezeit
		digitalWrite( 4 , LOW );	//A-Gelb
		digitalWrite( 3 , HIGH );	//A_Rot
		delay( _ABVAR_1_zeit );		//
		digitalWrite( 6 , LOW );	//F_Rot
		digitalWrite( 7 , HIGH );	//F_Gruen
		delay( 4000 );
		digitalWrite( 7 , LOW );	//F_Gruen
		digitalWrite( 6 , HIGH );	//F_Rot
		delay( 4000 );
		digitalWrite( 4 , HIGH );	//A_Gelb
		delay( _ABVAR_1_zeit );
		digitalWrite( 3 , LOW );	//A_Rot
		digitalWrite( 4 , LOW );	//A_Gelb
	}
}

zwei Tipps:

a) verzichte auf delay(). Schau Dir das Beispiel "Blinky Without Delay" an und versuche es zu verstehen ... sonst bekommst Du Schwierigkeiten, wenn Du später die Fußgänger-Ampel per Knopfdruck anfordern möchtest

b) Schau Dir das Thema Schieberegister an. Die lassen sich einfach ansteuern und stellen genügend Pins bereit. Beispiel: 74HCT595. Dafür gibt es auch schon fertige Module mit 32 Ausgängen für 6,95 Euro, falls Du keine Lust auf Löten hast :wink: Zudem solltest Du über Treiber-Bausteine wie den ULN2803 nachdenken, da das sonst strommäßig etwas knapp werden könnte, wenn Du die LED's direkt aus dem Arduino treibst

Ich betreibe mit einem 74HC595 (8 Bit Schieberegister) 8 LEDs und nutze dafür am Arduino nur 3 Ausgänge.
Davon könnte man auch noch ein paar hintereinander schalten.

Die Programmierung wird dann natürlich um einiges komplexer weil man dann mit mehrdimensionalen Arrays arbeiten müsste.
Denke mal nix unlösbares, aber es gibt sicher auch noch ein bessere Lösung.

In deinem Fall wäre sowas ähnliches wahrscheinlich auch angebracht.

Aber da musst du dich entweder selber weiter informieren oder vielleicht schreibt ja noch jemand anderes was dazu der
mehr Ahnung hat als ich :sweat_smile: .

Gruß

schUk0

@schUk0: das geht auch mit einem eindimensionalen Array oder sogar ganz ohne wenn man will (auch wenn das dann nicht gerade ellegant ist). Theoretisch wäre das aber ein Parade-Beispiel für objektorientierte Programmierung.

Ja, z.B. wäre eine Alternative mit I2C und Port-Expander das aufbauen.
Da braucht es nur 2 Adern für die Ansteuerung.
Die Treiber ULN2803 werden für die Leds aber auch gebraucht.

HotSystems:
… mit I2C und Port-Expander …

MCP23017 und Adafruit-MCP23017 als Bibliothek. Siehe Anleitung: Endlicher Automat mit millis()

An sich wäre

mgcss:
@schUk0: das geht auch mit einem eindimensionalen Array

So habe ich es bei mir auch, aber ich will auch nur 8 LEDs hintereinander zum Leuchten bringen.
Und gerade bei mehreren Ampeln würde ich ein mehrdimensionales übersichtlicher finden.
Denke ich zumindest :smiley: .

Aber ich bin da auch selber noch am Lernen.

Irgendeine Form von Port-Expansion oder Bus Kommunikation in Verbindung mit Treibern wird aber, denke ich mal, eh notwendig, da die Ampeln ja sicherlich örtlich getrennt sein sollen.
Denn der Spannungsfall über eine gewisse Leitungslänge sollte nicht unterschätzt werden.
Besonders bei solch eh schon geringen Spannungen.

Gruß

schUk0

Pins einsparen, ohne Hardwareeinsatz: Charlieplexing

Oder das Problem vereinfachen, alle Ampeln sind doppelt vorhanden.

Man kommt also mit 10 Pins aus, wenn man jeweils zwei LEDs aus einem Pin versorgt,
wenn das zu dunkel ist, immer zwei LEDs über einen kleinen Transistor schalten.