Hallo Zusammen,
ich würde mich freuen wenn ihr mir weiterhelfen könntet. Ich komme mit meinen Überlegungen nicht zu einer Lösung.
Beschreibung:
Eine Fußgängerampel hat einen Ampeldrücker mit zwei Schaltern. Einer für den Sehenden, einer für den Blinden. Der Ampeldrücker selber hat drei Eingänge (Leuchtfeld "Warten", Grün, Blinder).
Somit habe ich am Arduino pro Drücker 2 Eingänge und 3Ausgänge.
Es werden insgesamt 8 Drücker an 8 einzelnen imaginären Ampeln angeschlossen.
Also insgesamt 16 Eingänge und 24 Ausgänge.
Die Eingänge habe ich mittels zweier 4051 Multiplexer (2x8=16) am Arduino realisiert. Angesteuert über drei Select Pins und einer Zählschleife werden die Anforderungen in ein Array [16] geschrieben. Soweit im Sketch fertig und funktioniert.
Die Ausgabe soll über drei Schieberegister 74HC595 (3x8=24) erfolgen.
Ablauf für eine der acht Ampeln die unabhängig voneinander laufen sollen:
Grundstellung ist Rot, erfolgt eine Anforderung des Sehenden,
wird der Blinker für das "Warte" (Ausgang 1) eingeschaltet.
Eine Umschaltzeit (t) läuft ab damit man die Aktion Warteblinker (Rotzeit) sieht, in der geprüft wird ob in dieser noch zusätzlich ein Blinder anfordert.
Sollte dieses der Fall sein wird nach t Fg-Grün (Ausgang 2) und Ton (Ausgang 3) aktiv, der Blinker schaltet ab.
Nach Ablauf t (Grünzeit) geht alles auf Anfang, also Rot. Sollte kein Blinder angefordert haben, wird nur Grün (A2) aktiv und der Blinker schaltet ab.
Erfolgt bei Rot ausschließlich eine Anfo eines Blinden wird nach t direkt ohne Blinker A2+A3 aktiv, nach Ablauf t (Grünzeit) geht es wieder zurück nach Rot wie oben.
Ich hänge mal ein Bild des Ablaufes in den Anhang.
Mein Problem:
Ich bekomme die Anforderungsschalter ins Array, hier müssten sie solange fixiert werden bis eine Rücksetzung bei Grün erfolgt.
Ebenso bei der Ausgabe, hier muss ein Zusammenhang gemäß der Logik geschaffen werden aus dem Array eine Schalthandlung solange festzuhalten bis die Zeit t abgelaufen ist ohne das Programm einzufrieren weil ja 8 Stk parallel laufen. Mit delay geht das nicht schon klar, mit millis und einer mir derzeit nicht klaren Verbindung ?
Mir fehlt also sozusagen der wichtigste Tel des Programmes wo die eigentliche Arbeit gemacht wird, und ich komm nicht drauf wie.
Meinen angefangenen Sketch hänge ich auch dran, vielleicht habt ihr einen Löungsweg?
Mein bisheriger Sketch:
// LSA Simulation
//Alle Taster der werden an einen 4051 Multiplexer angeschlossen und über den PIN 5 eingelesen. Steuerbits sind PIN 2,3,4
//Alle Ausgaenge an die Drücker werden über ein 595 Schieberegister ausgegeben angeschlossen an PIN 10
//Autor:
//Vers.1.0
//01.2017
//Schieberegister (Ausgabe)
//PIN verbunden mit SH_CP des 74HC595
int shiftPin=8;
//PIN verbunden mit ST_CP des 74HC595
int storePin=9;
//PIN verbunden mit DS des 74HC595
int dataPin=10;
int AnfoWert[16]; //Variable für die Anforderungen
int i=0; //Zähler für Schleife die die Werte aus dem Multiplexer ausliest
int bit1=0; //Variablen für die Bit-Ansteuerung des Multiplexers
int bit2=0;
int bit3=0;
void setup() {
pinMode(2, OUTPUT); //Pindefinition als Ein oder Ausgang
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(storePin,LOW); //Datenausgabe sicherheitshalber auf LOW
Serial.begin(9600);
}
void loop() {
for ( i=0; i<=7;i++) {
bit1= bitRead(i, 0); //Aufteilung der Zahl aus dem Zähler 1 bis 8 in Binärcode auf drei Variablen bit 1 bis 3
bit2= bitRead(i, 1); //damit können dann die select Pins angesteuert werden.
bit3= bitRead(i, 2);
digitalWrite(2, bit1); //Ausgabe der einzelnen Steuerbits auf die Selectpins des Multiplexers, also hier die Ansteuerung
digitalWrite(3, bit2);
digitalWrite(4, bit3);
Anfo(i,5); //Abspeichern der ersten 8 Werte in das Array
Anfo(i+8,6); //Abspeichern der zweiten 8 Werte in das Array
Serial.print(AnfoWert[i]); //Ausgabe der ersten 8 Werte des Arrays
Serial.print(AnfoWert[i+8]); //Ausgabe der zweiten 8 Werte des Arrays
Serial.print(" ");
}
Serial.println ("");
}
void Anfo (int zaehler, int digitalPin) {
AnfoWert [zaehler]= digitalRead(digitalPin);
}