Hallo!
Ich komme zurück auf meinen 3er Würfel.
Ich hab jetzt eine Software geschrieben, die das macht, was ich möchte. Allerdings tut sie es dann doch nicht so wie ich möchte und ich weiss nicht recht, woran das liegt. Ob hier ein elektrotechnisches Problem vorliegt oder ein softwareseitiges.
Und zwar ist im folgenden das Bitmuster so, dass nur die letzte LED der obersten Ebene leuchten sollte. Das funktioniert auch, wenn ich mir die Bildmatrix über Serial.print ausgeben lassen, die Anzeige ist allerdings anders.
Dort leuchtet die erste LED jeder Ebene, die letzte LED der untersten Ebene und die letzte LED der obersten Ebene (allerdings deutlich dunkler als die anderen). Das wirkt für mich irgendwie so, als läge hier nicht unbedingt ein softwareseitiges Problem vor, sondern die technische Seite will nicht.
Im folgenden der relevante Teil des Quellcodes:
// Definition der Pins des Arduino, an denen der Wuerfel haengt
const int ebenen[] = {10,11,12};
const int saeulen[] = {1,2,3,4,5,6,7,8,9};
// Forward-Deklaration /////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void zeichneFrame(long, int);
void setup() {
// Pins als Outputs definieren
// Ebenen
for (int i=0; i<3; i++) { pinMode(ebenen[i], OUTPUT); }
// Saeulen
for (int i=0; i<9; i++) { pinMode(saeulen[i], OUTPUT); }
}
void loop() {
// Do cool stuff here... ;-D
long test = 0b00000000000000000000000000100000;
// ||| ||| ||| ||| |||
zeichneFrame(test, 50);
}
// bild (long) enthaelt (die ersten) 27 Bits mit Bildinformation, am Schluss 5 leere Bits
// dauer (int) enthaelt die Anzeigedauer in ms, muss noch mit 10 multipliziert werden
void zeichneFrame(long bild, int dauer=5) {
// Array of Boolean um Matrixbilder der einzelnen Ebenen zu speichern...
// 3 x 9 Bit des uebergebenen long-Wertes
boolean bildmatrix[3][9];
// Zaehlvariable um mit bitRead() links zu starten
int bitOffset = 31;
// Uebergebenen long-Wert bitweise abarbeiten und in das Array schreiben
// Die ersten 9 Bit definieren die unterste Ebene, beginnend mit der ersten LED, dann 2. Ebene
for(int i=0; i<3; i++) {
for(int j=0; j<9; j++) {
bildmatrix[i][j] = bitRead(bild, bitOffset);
bitOffset--;
}
}
// Laufdauer des Wuerfels speichern, benoetigt fuer Vergleich wg. Bildanzeigezeit
long max_dauer = millis();
long spielzeit = 0;
// Anzeige starten und dabei multiplexen, was das Zeug haelt... ;-D
while(spielzeit < (dauer*10))
{
for(int i=0; i<3; i++) {
digitalWrite(ebenen[i], HIGH);
for(int j=0; j<9; j++) {
((bildmatrix[i][j] == 1) ? digitalWrite(saeulen[j], HIGH) : digitalWrite(saeulen[j], LOW));
//((bildmatrix[i][j] == 1) ? Serial.println("AN") : Serial.println("AUS"));
}
digitalWrite(ebenen[i], LOW);
}
// Benoetigte Zeit fuer diesen Durchlauf ermitteln und speichern
spielzeit = millis() - max_dauer;
}
}
Wär schön, wenn sich das mal einer anschaut und vielleicht was findet. Ich find nix mehr, vielleicht hab ich allerding auch zu lange drauf geschaut... ;-D
Danke!