Go Down

Topic: Frage zu Variablen (Read 1 time) previous topic - next topic

mkl0815


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)




1234
5678
9101112
13
14
1516


Die einfachste Form ist sicher, jede Funktion einzeln zu definieren:

Code: [Select]

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:
Code: [Select]

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 :
Code: [Select]

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
Code: [Select]

//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:

Code: [Select]

#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.

uwefed

#11
Jan 28, 2013, 10:38 pm Last Edit: Jan 28, 2013, 10:40 pm by uwefed Reason: 1
Einige grundsätzliche Dinge.
Die LEDs brauchen Vorwidertände. Bei sovielen, direkt angesteuerten LED würde ich den Strom auf 5mA begrenzen.

Das was Du da machst ist keine 4x4 Matrix sondern 16 LED mechanisch 4x4 angeordnet.

Eine Matrix ist es wenn Du in diesem Fall 4 Zeilen und 4 Spalten hast und die LED jeweils zwischen den Spalten und Reihen ohne Vorwiderstand anordnest.


Di Transistore Q1-Q4 sind nicht zwingend notwendig wenn der LED-Strom nicht zu groß ist.

Grüße Uwe

Addi


Warum ist hinter int pin keine =13?

Da du die Funktion  vmtl. mit mindestens einem Paramteter, ist es unnötig, du kannst es aber gerne machen!

Woher kommen die Zahlen 6-12?

Einfache Beispiel-Pins, ohne analoge Eingänge.

Und warum alle Pins auf 13?

Da eine LED an Pin 13 (meistens) herausgeführt wird, nehme ich sie nicht gerne für die
Ansteuerung von etwas, da die LED Strom frisst. Man kann auch jeden anderen Pin nehmen,
solange dieser nicht für deine Ansteuerung verwendet wird.

Addi
/ \    _|  _| o
 /--\ (_| (_| |

Udo Klein

Schau mal in meinen Blog. Insbesondere http://blog.blinkenlight.net/experiments/basic-effects/. Ich nehme zwar 20 LEDs aber da sollten für Dich trotzdem ein paar Anregungen mit dabei sein.
Check out my experiments http://blog.blinkenlight.net

kiter123

Vielen Dank für die Tips.

Werde mich nochmal melden, wenn ich fertig bin.

Gruß

Matthias

Go Up