MKy_KB:
leider habe ich noch nicht den richtigen Ansatz um den Leuchtturm Sketch mit einem Shift Out Sketch zu verbinden. D.h. die nun als LED Out deklarierten Bits zu einem, bzw. mehreren Byte(s) zusammen zu packen und dann an das Schieberegister zu senden.
Gibt es hierzu eine einfache Lösung?
Einfach ist ja immer relativ.
Und da ich mit Schieberegistern noch nichts praktisch gemacht habe, habe ich eher eine theoretische Vorstellung darüber. Davon und von dem von mir auf der ersten Seite von mir geposteten Sketch ausgehend, würde ich es wie folgt machen:
- Da die Leuchttürme bei der Lösung mit Schieberegistern nicht mehr bestimmten Arduino-Pins zugeordnet sind, wird das erste Feld der Turmdeklaration aus meinem Sketch nicht benötigt. Benötigt wird allerdings eine Variable, um sich den Zustand des Turms zu merken, also ob seine LED/Lampe gerade an oder aus ist. Dies wird benötigt, weil der Zustand aller Türme am Ende in das/die Schieberegister geschoben werden muß und das geht erst, wenn alle Turmzustände eines 100ms Intervalls zuvor ermittelt wurden und bekannt sind. Also verändere ich die Datenstruktur und recycele das erste Feld, statt des LED-Pins wird sich dort der LED-Status des Turms gemerkt (0 aus, 1 an), ich setze anfänglich mal 0 ein.
// LEDState - 0 bei LED aus, 1 bei LED an
// gesamt= Gesamtlänge aller Timings zusammen für einen Zyklus des Leuchtturms
// n= Anzahl der nachfolgenden ein/aus Timings
// LED gesamt n ein aus ein aus ein aus ein aus
int Norderney_timing[]={ 0, 12000, 6, 200, 2800, 200, 2800, 200 , 5800};
int Pilsum_timing[] ={ 0, 20500, 4, 3000, 3000, 3000,11500};
int Campen_timing[] ={ 0, 15000, 8, 700, 2300, 700, 2300, 700, 2300, 700, 5300};
int Schillig_timing[] ={ 0, 12000, 2, 6000, 6000};
int Voslapp_timing[] ={ 0, 9000, 2, 6000, 3000};
int Tossens_timing[] ={ 0, 7000, 2, 6000, 1000};
Zweite Änderung: Den Türmen sind keine Arduino-Pins mehr zugewiesen daher diesen Codeblock löschen:
pinMode(Norderney_timing[0], OUTPUT);
pinMode(Pilsum_timing[0], OUTPUT);
pinMode(Campen_timing[0], OUTPUT);
pinMode(Schillig_timing[0], OUTPUT);
pinMode(Voslapp_timing[0], OUTPUT);
pinMode(Tossens_timing[0], OUTPUT);
Anstelle des Codes zum Initialisieren der Arduino-Pins als OUTPUT muss stattdessen der Code zum Initialisieren der Schieberegister eingefügt werden.
Die dritte Änderung ist, dass nach dem Berechnen des Turmstatus nicht direkt die LED geschaltet werden kann, sondern dass sich stattdessen der ermittelte Wert gemerkt werden muss. Also
statt:
digitalWrite(Turmdata[0], blinkStatusOn);
setze:
// im ersten Feld der Turmdaten merken, ob die LED gerade an oder aus sein soll
if (blinkStatusOn) Turmdata[0]=1; else Turmdata[0]=0;
Die vierte und letzte Änderung ist dann, dass wo in der loop von mir der Platzhalter
// "lange" bis zu 99ms laufenden Code hier rein
eingefügt wurde (aus dem nachgebesserten loop-Code von Seite 3 dieses Threads), dann der Code hinkommt, der die nun bekannten Turmzustände (Norderney_timing[0], Pilsum_timing[0], Campen_timing[0], etc.) an das/die Schieberegister rausschiebt und aktiviert.
Da sehe ich eigentlich kein größeres softwaretechnisches Änderungsproblem bei der von mir geposteten Programmlogik.