INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ampelkreuzung mit Anforderung für Fussgänger
10.06.2013, 12:26
Beitrag #1
Ampelkreuzung mit Anforderung für Fussgänger
Hallo alle zusammen,

beschäftige mich schon seit längerem damit eine Ampelkreuzung mit Anforderung für Fussgänger zu programieren und komme nicht weiter. Wer hat eine Idee oder Anregung für mich?
Folgendes Problem: Ampelphasen laufen, wenn der Anforderungsschalter für die Fussgänger gedrückt wird - passiert nichts. Wenn er aber über einen Zeitraum von ca. 10 Sekunden gedrückt oder ständig angetippt wird, bekommen die Fussgänger wie gewollt grün und nach der festgelegten Zeit wieder rot und die Ampelkreuzung läuft für die Auto wie gewollt weiter.
Bin über jede Hilfe/Anregung dankbar.
L.G. frank
Hier der Sketch:
#define DELAY1 2000 //Pause 1 ist 2 sek als Konstante definiert
#define DELAY5 5000 //Pause 5 ist 5 sek als Konstante definiert
#define DELAY10 10000 //Pause 10 ist 10 sek als Konstante definiert

int ledpinRot1 = 3; // rote led Auto 1
int ledpinGelb1 = 4; // gelbe led Auto 1
int ledpinGruen1 = 5; // gruene led Auto 1
int ledpinRot2 = 6; // rote led Auto 2
int ledpinGelb2 = 7; // gelbe led Auto 2
int ledpinGruen2 = 8; // gruene led Auto 2
int ledpinRot3 = 9; // rote led Fuss 3
int ledpinGruen3 = 10; // gruene led Fuss 3
int taster = 2; // Fussampeltaster an Pin 2
int crossTime = 5000; // erlaubte Zeit zum Ueberqueren
unsigned long changeTime; // Zeit seit Taster gedrueckt

void setup() {
pinMode(ledpinRot1, OUTPUT); // Pin3 als Ausgang
pinMode(ledpinGelb1, OUTPUT); // Pin4 als Ausgang
pinMode(ledpinGruen1, OUTPUT); // Pin5 als Ausgang
pinMode(ledpinRot2, OUTPUT); // Pin6 als Ausgang
pinMode(ledpinGelb2, OUTPUT); // Pin7 als Ausgang
pinMode(ledpinGruen2, OUTPUT); // Pin8 als Ausgang
pinMode(ledpinRot3, OUTPUT); // Pin9 als Ausgang
pinMode(ledpinGruen3, OUTPUT); // Pin10 als Ausgang
pinMode(taster, INPUT); // Pin2 als Eingang
digitalWrite(ledpinRot1, HIGH); // Anfangswert Auto Rot1
digitalWrite(ledpinGruen2, HIGH); // Anfangswert Auto Rot2
digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3
}
void loop() {
int state = digitalRead(taster);
/* ueberpruefe taster ob gedrueckt und 5 sec zeitversatz */
if (state == HIGH && (millis() - changeTime) > 5000) {
// gehe zur funktion fussampel
fussampel();
}

digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3
digitalWrite(ledpinGruen3, LOW); // Anfangswert Fuss Gruen3
digitalWrite(ledpinRot1, HIGH); // rote led1 einschalten
digitalWrite(ledpinGruen2, HIGH); // gruene led2 einschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinGruen2, LOW); // gruene led2 ausschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe led2 einschalten
digitalWrite(ledpinGelb1, HIGH); // gelbe led1 einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot1, LOW); // rote led1 ausschalten
digitalWrite(ledpinGelb1, LOW); // gelbe led1 ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe led2 ausschalten
digitalWrite(ledpinGruen1, HIGH); // gruene led1 einschalten
digitalWrite(ledpinRot2, HIGH); // rote led2 einschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinGruen1, LOW); // gruene led1 ausschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe led2 einschalten
digitalWrite(ledpinGelb1, HIGH); // gelbe led1 einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot2, LOW); // rote led2 ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe led2 ausschalten
digitalWrite(ledpinGelb1, LOW); // gelbe led1 ausschalten


}
void fussampel() {

digitalWrite(ledpinRot2, HIGH); // rote2 led einschalten
digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3
digitalWrite(ledpinGelb1, HIGH); // gelbe1 led einschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe2 led einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot1, HIGH); // rote1 led einschalten
digitalWrite(ledpinRot2, HIGH); // rote2 led einschalten
digitalWrite(ledpinGelb1, LOW); // gelbe1 led ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe2 led ausschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinRot3, LOW); // Anfangswert Fuss Gruen3
digitalWrite(ledpinGruen3, HIGH); // Anfangswert Fuss Gruen3
delay(crossTime); // Fussgaenger koennen gehen
for (int x=0; x<10; x++) // Fussgaengergruen blinkt 9mal
{
digitalWrite(ledpinGruen3, HIGH); // Fussgaenger gruen und blinken
delay(250);
digitalWrite(ledpinGruen3, LOW);
delay(250);
}
// Fussgaenger Rot geben
digitalWrite(ledpinRot3, HIGH); // Fuss Rot3
delay(5000);
digitalWrite(ledpinRot2, LOW); // rote2 led ausschalten

// Zeit aufnehmen seit letzten Wechsel
changeTime = millis(); // zum Progammanfang
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.06.2013, 22:46
Beitrag #2
RE: Ampelkreuzung mit Anforderung für Fussgänger
(10.06.2013 12:26)frank schrieb:  ......
void loop() {
int state = digitalRead(taster);
/* ueberpruefe taster ob gedrueckt und 5 sec zeitversatz */
if (state == HIGH && (millis() - changeTime) > 5000) {
// gehe zur funktion fussampel
fussampel();
}
...
delay(DELAY5); // Pause 5
...
delay(DELAY1); // Pause 1
...
delay(DELAY5); // Pause 5
...
delay(DELAY1); // Pause 1
...

}
void fussampel() {
...
}

Nun das Problem ist klar, wenn du das von mir eingekürzte Programm mal anschaust dann kommst wohl von alleine drauf warum dein Taster nur so träge reagiert.... richtig....du frägst ihn nur alle 12 Sekunden ab....Cool

Idea Also hier hilft dir nur eine Statemaschine wo die Zeit mit dem millis() abfragen tut und dementsprechend deine Ampeln schaltet. Dann wird dein Taster jedesmal abgefragt wenn die Statemaschine einmal durch ist was dann wohl so im Zehntel bis Hundertstel Sekunden Bereich liegt...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.06.2013, 11:16
Beitrag #3
Lightbulb RE: Ampelkreuzung mit Anforderung für Fussgänger
(10.06.2013 12:26)frank schrieb:  Hallo alle zusammen,

beschäftige mich schon seit längerem damit eine Ampelkreuzung mit Anforderung für Fussgänger zu programieren und komme nicht weiter. Wer hat eine Idee oder Anregung für mich?
..... Rest siehe Erstbeitrag

So nun habe ich mal ein bischen Luft gehabt und die Ampel auf Interruptsteuerung umgebaut. Was mir nicht so gefällt ist der Tastereingang, hier kann ich nicht erkennen ob es da einen Pull Down Widerstand gibt weshalb ich hier den CPU internen Pull Up Widerstand aktiviert habe und den Taster gegen GND schalte. Beide Varianten sind im Code ersichtlich wobei eine Variante auskommentiert ist.
Nun kann man nach Lust und Laune kurz auf den Taster drücken und wenn dann die Zeit gekommen ist dürfen die Fußler rüber.

Da ich nur die Rote Fußgängerampel als LED zum testen hatte muß man noch die Ampelphasen so anlegen das wenn die Abfrage state == HIGH kommt auch alle Autoampeln Rot sind....sonst gibts Verletzte....Big Grin

Hier nun der Code mit Interrupt:

#define DELAY1 2000 //Pause 1 ist 2 sek als Konstante definiert
#define DELAY5 5000 //Pause 5 ist 5 sek als Konstante definiert
#define DELAY10 10000 //Pause 10 ist 10 sek als Konstante definiert

int ledpinRot1 = 3; // rote led Auto 1
int ledpinGelb1 = 4; // gelbe led Auto 1
int ledpinGruen1 = 5; // gruene led Auto 1
int ledpinRot2 = 6; // rote led Auto 2
int ledpinGelb2 = 7; // gelbe led Auto 2
int ledpinGruen2 = 8; // gruene led Auto 2
int ledpinRot3 = 9; // rote led Fuss 3
int ledpinGruen3 = 10; // gruene led Fuss 3
int taster = 2; // Fussampeltaster an Pin 2
int crossTime = 5000; // erlaubte Zeit zum Ueberqueren
unsigned long changeTime; // Zeit seit Taster gedrueckt
unsigned char state; // Status der Fussgaengeranforderung

void setup() {
pinMode(ledpinRot1, OUTPUT); // Pin3 als Ausgang
pinMode(ledpinGelb1, OUTPUT); // Pin4 als Ausgang
pinMode(ledpinGruen1, OUTPUT); // Pin5 als Ausgang
pinMode(ledpinRot2, OUTPUT); // Pin6 als Ausgang
pinMode(ledpinGelb2, OUTPUT); // Pin7 als Ausgang
pinMode(ledpinGruen2, OUTPUT); // Pin8 als Ausgang
pinMode(ledpinRot3, OUTPUT); // Pin9 als Ausgang
pinMode(ledpinGruen3, OUTPUT); // Pin10 als Ausgang
pinMode(taster, INPUT); // Pin2 als Eingang
digitalWrite(ledpinRot1, HIGH); // Anfangswert Auto Rot1
digitalWrite(ledpinGruen2, HIGH); // Anfangswert Auto Rot2
digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3

//##### fuer den Interrupt
state = LOW; // keine Anforderung da
interrupts(); // Interrupt zulassen
attachInterrupt(0, fuss, FALLING); // Interrupt ausloesen wenn Pin2 nach Low geht, ich schalte gegen GND
//attachInterrupt(0, fuss, RISING); // Interrupt ausloesen wenn Pin2 nach High geht
digitalWrite(taster,HIGH); // ich aktiviere den internen Pull Up Widerstand

}
void loop() {
//int state = digitalRead(taster);
/* ueberpruefe taster ob gedrueckt und 5 sec zeitversatz */
//if (state == HIGH && (millis() - changeTime) > 5000) {
//// gehe zur funktion fussampel
//fussampel();
//}

//###### Abfrage ob zwischenzeitlich Fussgaenger angefordert wurde
if (state == HIGH)fussampel(); // nun sind die Fussgaenger dran



digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3
digitalWrite(ledpinGruen3, LOW); // Anfangswert Fuss Gruen3
digitalWrite(ledpinRot1, HIGH); // rote led1 einschalten
digitalWrite(ledpinGruen2, HIGH); // gruene led2 einschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinGruen2, LOW); // gruene led2 ausschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe led2 einschalten
digitalWrite(ledpinGelb1, HIGH); // gelbe led1 einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot1, LOW); // rote led1 ausschalten
digitalWrite(ledpinGelb1, LOW); // gelbe led1 ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe led2 ausschalten
digitalWrite(ledpinGruen1, HIGH); // gruene led1 einschalten
digitalWrite(ledpinRot2, HIGH); // rote led2 einschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinGruen1, LOW); // gruene led1 ausschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe led2 einschalten
digitalWrite(ledpinGelb1, HIGH); // gelbe led1 einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot2, LOW); // rote led2 ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe led2 ausschalten
digitalWrite(ledpinGelb1, LOW); // gelbe led1 ausschalten


}
void fussampel() {

digitalWrite(ledpinRot2, HIGH); // rote2 led einschalten
digitalWrite(ledpinRot3, HIGH); // Anfangswert Fuss Rot3
digitalWrite(ledpinGelb1, HIGH); // gelbe1 led einschalten
digitalWrite(ledpinGelb2, HIGH); // gelbe2 led einschalten
delay(DELAY1); // Pause 1
digitalWrite(ledpinRot1, HIGH); // rote1 led einschalten
digitalWrite(ledpinRot2, HIGH); // rote2 led einschalten
digitalWrite(ledpinGelb1, LOW); // gelbe1 led ausschalten
digitalWrite(ledpinGelb2, LOW); // gelbe2 led ausschalten
delay(DELAY5); // Pause 5
digitalWrite(ledpinRot3, LOW); // Anfangswert Fuss Gruen3
digitalWrite(ledpinGruen3, HIGH); // Anfangswert Fuss Gruen3
delay(crossTime); // Fussgaenger koennen gehen
for (int x=0; x<10; x++) // Fussgaengergruen blinkt 9mal
{
digitalWrite(ledpinGruen3, HIGH); // Fussgaenger gruen und blinken
delay(250);
digitalWrite(ledpinGruen3, LOW);
delay(250);
}
// Fussgaenger Rot geben
digitalWrite(ledpinRot3, HIGH); // Fuss Rot3
state = LOW; // sobald Fussgaenger Rot haben Anforderung wieder zulassen
delay(5000);
digitalWrite(ledpinRot2, LOW); // rote2 led ausschalten

// Zeit aufnehmen seit letzten Wechsel
// changeTime = millis(); // zum Progammanfang #### wegrationalisiert

}

void fuss() // Interrupt wo gezogen wird wenn der Fussgaengertaster gedrueckt wird - siehe attachInterrupt
{
state = HIGH; // das wars auch schon im Interrupt.
}

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2013, 22:09
Beitrag #4
RE: Ampelkreuzung mit Anforderung für Fussgänger
Hallo Bitklopfer,

vielen Dank fuer deine Hilfe,
es funktioniert wie ich es mir vorgestellt habe.

L. G. frank
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.06.2015, 18:20
Beitrag #5
RE: Ampelkreuzung mit Anforderung für Fussgänger
Hallo zusammen

ich bin dabei eine Ampelsteuerung für meinen Sohn zu basteln und wollte fragen ob Sie mir helfen könnten. Ein Sketch funktioniert sehr gut nur leider wollte ich etwas anderes aber mir fehlt leider die Erfahrung.

Ich habe lediglich eine Fußgängerampel die im Normalzustand zwischen rot und grün nach festen variabeln hin und her wechselt.
Wenn man in der Rot Licht Phase den Anfordergungstaster drückt soll dieser leuchten und die Ampel nach x Sekunden auf Grün schalten.
Wenn die Ampel bereits grün ist und der Anforderungstaster wird gedrückt soll nichts passieren.
Falls niemand den Anforderungstaster drückt soll nach einer Zeit X die komplette Ampel ausgehen (Standby)


V2 (wünschenswert)
Ich habe noch einen zweiten Taster mit dem ich verschiedene Programme abrufen möchte.
5 Sekunden drücken und die Ampel geht in den Auswahlmodus.
Ampel aus und Anforderungstaster leuchtet.
Drücke ich nun den Anforderungstaster einmal blink der Anforderungstaster einmal kurz, dann pause und wieder kurz. So sollte ich angezeigt bekommen das Programm 1 gewählt ist.
Wenn ich zweimal den Anforderungstaster drücke blinkt der Taster 2mal kurz, Pause und dann wieder.
Zum Auswahl des Programmes muss dann am 2. Taster das Programm bestätigt werden.

V3
mit der Arduino DS3232RTC Platine würde ich gerne die Uhrzeit abfragen und ab Uhrzeit x die Ampel ausschalten und nur den Anforderungstaster als Nachtlicht leuchten lassen.

V4
eventuell später erweiterbar mit Ethernet, um per Webbrowser die Zustände abfragen zu können und auch die Programme auswählen können.

Könnte mir jemand behilflich sein?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.06.2015, 20:56
Beitrag #6
RE: Ampelkreuzung mit Anforderung für Fussgänger
Das tut mir leid, ich wollte niemanden verärgern.
Ist ging ja lediglich um einen Gedankenanstoss. Schade, ich dachte mir würde jemand helfen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste