Pages: [1]   Go Down
Author Topic: Frage zu Variablen  (Read 1244 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Forum,

ich bin neu hier und will mich kurz vorstellen.
Ich bin 49 Jahre alt und fange gerade an, mich ein wenig mit Arduino und LED zu beschäftigen.
Ich bin stolzer Besitzer eines Mega und habe mir eine 4x4 Matrix mit LED gebaut.

Die 16 LED sind mit je einem digitalem Ausgang verbunden.

Den LED sind die Namen Led1, Led2 usw. zugeordnet.

Nun möchte ich eine Reihe ansprechen.

Funktioniert so etwas wie

int Reihe1(led1, led2, led3, led4)

Gruß

Matthias


 
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3060
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Herzlich willkommen.  smiley-wink

Quote
Den LED sind die Namen Led1, Led2 usw. zugeordnet.
Ist das jeweils die konstante Pin-Nummer oder der aktuelle Zustand?

Quote
Nun möchte ich eine Reihe ansprechen.
Funktioniert so etwas wie
int Reihe1(led1, led2, led3, led4)

So nicht. Aber es gibt in c arrays, um mehrere Variable gemeinsam bearbeiten zu können.

Code:
int Reihe1[4] = {3,4,5,6};  // die Pin-Nummern der ersten Reihe
...
   digitalWrite(Reihe1[2], HIGH); // dies setzt einen der Pins auf HIGH

Weiss jetzt nicht, ob dir das weiterhilft ...

 


Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nutzung eines Array
Code:
int pin[15];
pin[0] = 13;
pin[1] = 14;
//oder int pin[] = {13,14,15}
//usw.
Beim Array legst du eine "große Variable" an(im groben gesagt), die mit 0 beginnt. im obigen Beispiel
0-15, also 16 Pätze je für einen Pin. So hast du alle Pins zusammengefasst. AM einfachsten kann man dies dann über eine
For-Schleife ansteuern, z.B. so um alle LEDs als Ausgang zu schalten:
Code:
for(int i = 0;i!=15;i++) {
pinMode(pin[i],OUTPUT);
}
Edit: Zu spät
Addi
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die schnellen Antworten.

Die 16 einzelnen LED habe ich schon benannt.

Jetzt möchte ich Reihen, Spalten, Diagonalen, Innen- und Außenkreis benennen.

Also die Led 1-4 als Reihe1 initialisieren usw.

Dann die Reihe1 aufrufen und 4 LED leuchten.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3060
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Dann die Reihe1 aufrufen und 4 LED leuchten.
Du kannst dir eine Funktion schreiben, die 4 LEDs ansteuert und dann diese Funktion aufrufen,
aber Programmieren ist Fitzel-Arbeit, diese Funktion gibt es so (vermutlich) nicht, letztendlich werden irgendwo doch deine 4 LED geschaltet, indem jedes Bit passend gesetzt wird.

Code:
digitalWrite(Reihe1, HIGH); // kann so nicht gehen, und sollte einen Fehler liefern, wenn du Reihe1 richtig definiert hast
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok,

schade.

Ich dachte, ich hätte da eine gute Idee gehabt.... smiley-confuse
Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe kurz einen Prototypen entwickelt, der 9 Pins schalten kann, vorausgesetzt Pin 13
wird nicht verwendet:
Code:
/*Funktionen um mehrere Pins gleichzeitig zu schalten (c) 2013 by Addi*/
void an(int pin,int pin2=13,int pin3=13,int pin4=13,int pin5=13,int pin6=13,int pin7=13,int pin8=13,int pin9=13) {
digitalWrite(pin,HIGH);
digitalWrite(pin2,HIGH);
digitalWrite(pin3,HIGH);
digitalWrite(pin4,HIGH);
digitalWrite(pin5,HIGH);
digitalWrite(pin6,HIGH);
digitalWrite(pin7,HIGH);
digitalWrite(pin8,HIGH);
digitalWrite(pin9,HIGH);
}
void aus(int pin,int pin2=13,int pin3=13,int pin4=13,int pin5=13,int pin6=13,int pin7=13,int pin8=13,int pin9=13) {
digitalWrite(pin,LOW);
digitalWrite(pin2,LOW);
digitalWrite(pin3,LOW);
digitalWrite(pin4,LOW);
digitalWrite(pin5,LOW);
digitalWrite(pin6,LOW);
digitalWrite(pin7,LOW);
digitalWrite(pin8,LOW);
digitalWrite(pin9,LOW);
}

void setup() {
}
void loop() {
an(6,7,8,9,10,11,12);//Anschalten
delay(1000);
aus(6,7,8,9,10,11,12);
}
Ich habe die Funktionen nicht getestet, sie sollten allerdings funktionieren.
 
Addi
« Last Edit: January 28, 2013, 02:32:54 pm by Addi » Logged

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

Germany
Offline Offline
Edison Member
*
Karma: 47
Posts: 2322
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ganz auf die Schnelle: Du benennst deine Funktionen zweimal "an", solltest du aus Rücksichtnahme auf Anfänger besser ändern. Und Einrückungen machen das ganze noch etwas übersichtlicher.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ganz auf die Schnelle: Du benennst deine Funktionen zweimal "an", solltest du aus Rücksichtnahme auf Anfänger besser ändern. Und Einrückungen machen das ganze noch etwas übersichtlicher.
Hab es schon korrigiert, Copy and Paste hat leider auch nachteile smiley-cry
« Last Edit: January 28, 2013, 02:39:50 pm by Addi » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Hilfe.

Mir ist nur leider nicht klar, wie deine Funktion funktioniert.

Warum ist hinter int pin keine =13?

Woher kommen die Zahlen 6-12?

Und warum alle Pins auf 13?


Gruß

Matthias
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich dachte, ich hätte da eine gute Idee gehabt.... smiley-confuse
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:
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:
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:
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:
//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:
#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.
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21668
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: January 28, 2013, 04:40:45 pm by uwefed » Logged

Offline Offline
Full Member
***
Karma: 5
Posts: 193
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3488
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für die Tips.

Werde mich nochmal melden, wenn ich fertig bin.

Gruß

Matthias
Logged

Pages: [1]   Go Up
Jump to: