kiter123:
Ich dachte, ich hätte da eine gute Idee gehabt.... :~
So schlecht ist die Idee doch gar nicht.
Wie bereits oben angesprochen, sind Funktionen das Mittel der Wahl.
Gehen wir mal davon aus, das die LEDs wiefolgt angeordnet sind (Pin-Nr)
| 1 |
2 |
3 |
4 |
| 5 |
6 |
7 |
8 |
| 9 |
10 |
11 |
12 |
| 13 |
|
|
|
141516
Die einfachste Form ist sicher, jede Funktion einzeln zu definieren:
void reihe1(int switch) {
digitalWrite(1,switch);
digitalWrite(2,switch);
digitalWrite(3,switch);
digitalWrite(4,switch);
}
void reihe2(int switch) {
digitalWrite(5,switch);
digitalWrite(6,switch);
digitalWrite(7,switch);
digitalWrite(8,switch);
}
//usw.
//Aufruf dann mit
reihe1(HIGH); //zum einschalten
reihe1(LOW); // zum ausschalten
Das geht zwar, wird aber sehr viel Code. Das kann man aber vereinfachen. Schauen wir uns die Pin-Nummern zwischen Reihe 1 (1,2,3,4) und Reihe 2 (5,6,7,8), oder Reihe 3 (9,10,11,12) an, fällt folgendes auf.
Die erste LED in Reihe 2 hat die Nummer der ersten LED in Reihe 1 plus 4, für die zweite LED ist es genauso 2+4 = 6 usw.
Für Reihe 3 ist es plus 8 statt plus 4 und in Reihe 4 ist es plus 12.
Daraus kann man sich eine einfache Formel bauen. LEDNR = LEDpos + (REIHENR - 1)*4
Beispiel Reihe 3:
1 + ( 3 - 1)*4 = 1 + 8 = 9
2 + ( 3 - 1)*4 = 2 + 8 = 10
3 + ( 3 - 1)*4 = 3 + 8 = 11
4 + ( 3 - 1)*4 = 4 + 8 = 12
Damit kann man die Funktionen der einzelnen Reihen zusammenfassen:
void reihe(int switch, int reihe) {
//einmal rechnen und wert merken reicht
int offset = (3 - reihe)*4;
//Pin berechnen und übergebenen Wert (switch) setzen
digitalWrite(1 + offset, switch);
digitalWrite(2 + offset, switch);
digitalWrite(3 + offset, switch);
digitalWrite(4 + offset, switch);
}
Das Gleiche macht man nun für die Spalten. Hier sieht nur die Formel etwas anders aus.
Spalte 1 hat (1,5,9,13) , Spalte 2 hat (2,6,10,14) usw. (3,7,11,15) und (4,8,12,16)
Die Formel ist dann einfach LEDPOS + (SPALTE - 1).
Für Spalte 3 z.B.
1 + ( 3 - 1) = 1 + 2 = 3
5 + ( 3 - 1) = 5 + 2 = 7
9 + ( 3 - 1) = 9 + 2 = 11
13 + ( 3 - 1) = 13 + 2 = 15
Als Funktion dann :
void spalte(int switch, int spalte) {
//einmal rechnen und wert merken reicht
int offset = spalte - 1;
//Pin berechnen und übergebenen Wert (switch) setzen
digitalWrite(1 + offset, switch);
digitalWrite(5 + offset, switch);
digitalWrite(9 + offset, switch);
digitalWrite(13 + offset, switch);
}
Schon hast Du 2 Funktionen statt 8, die genau das gleiche umsetzen. Bei den Diagonalen gibt es (wenn es nur von Ecke zu Ecke geht) nur zwei Funktionen und für die Kreis wohl auch.
Die kann man auch direkt wie im ersten Beispiel definieren, also innerhalb der Funktion einfach die betroffenen LEDs schalten (abhängig vom Parameter "switch).
Das wäre der eine Ansatz.
Ein zweiter Ansatz wäre auch möglich, mit nur einer Funktion
//es werden immer die Schaltzustände aller 16 LEDs übergeben
void matrix(int led1,int led2,int led2,int led4,int led5,int led6,int led7,int led8,int led9,int led10,int led11,int led12,int led13,int led14,int led15,int led16) {
digitalWrite(1,led1);
digitalWrite(2,led1);
digitalWrite(3,led1);
digitalWrite(4,led1);
digitalWrite(5,led1);
digitalWrite(6,led1);
digitalWrite(7,led1);
digitalWrite(8,led1);
digitalWrite(9,led1);
digitalWrite(10,led1);
digitalWrite(11,led1);
digitalWrite(12,led1);
digitalWrite(13,led1);
digitalWrite(14,led1);
digitalWrite(15,led1);
digitalWrite(16,led1);
}
//verwenden mit entsprechendem Muster (hier Reihe 1 an)
matrix(HIGH,HIGH,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW);
Der Trick ist nun, sich beliebige Muster mit "#define" zu definieren:
#define ALLE_AUS LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW
#define ALLE_AN HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH
#define REIHE1_AN HIGH,HIGH,HIGH,HIGH,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW
#define KREUZ HIGH,LOW,LOW,HIGH,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH,LOW, HIGH,LOW,LOW,HIGH
//usw.
Aufruf einfach mit
matrix(KREUZ);
matrix(ALLE_AUS);
das "#define" definiert nur "Text-Schnippsel", die der Compiler dann bei deren Verwendung (z.B. bei matrix(KREUZ)) an der Stelle von KREUZ einsetzt. Tatsächlich compiliert wird dann
matrix(HIGH,LOW,LOW,HIGH,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH,LOW, HIGH,LOW,LOW,HIGH)
Im Code sieht es aber deutlich übersichtlicher aus. Nachteil ist, das man jede Kombination die man benötigt definieren muss.
Zu beachten ist, das nach einem #define KEIN ";" steht, da es im eigentlichen Sinne kein "C-Befehl" ist, sondern eine Text-Ersetzungsfunktion des Compilers.
So, ich hoffe das hat jetzt ein bischen geholfen und nicht zusätzliche Verwirrung gestiftet. Ansonsten einfach rumprobieren. Gerade bei LEDs hat man ja recht gute Feedback.
Was ich mit diesem "Roman" auch zeigen wollte ist, das es immer verschiedene Lösungen für ein Problem gibt. Man muss halt nur sehen, was am besten passt.
Mario.